Your cart is currently empty!


♦
Jekaterina Guzek, Õpimapp / Portfolio
Эксперимент по измерению температуры с помощью датчика температуры.
Компоненты:
Температурный датчик
Схема:
Код:
// Объявляем номер аналогового пина, к которому подключён температурный датчик
const int temperaturePin = 0; // A0
// Функция setup() выполняется один раз при запуске
void setup()
{
Serial.begin(9600); // Инициализируем последовательную связь на скорости 9600 бод
}
// Главный цикл программы, выполняется бесконечно
void loop()
{
// Объявляем переменные для напряжения, температуры в Цельсиях и Фаренгейтах
float voltage, degreesC, degreesF;
// Считываем напряжение с датчика и сохраняем в переменную
voltage = getVoltage(temperaturePin);
// Преобразуем напряжение в температуру по Цельсию
// Формула подходит для TMP36: 0.5 В при 0°C, каждый градус = 0.01 В
degreesC = (voltage - 0.5) * 100.0;
// Альтернативная формула
// degreesC = voltage * 100.0;
// Перевод температуры из Цельсия в Фаренгейты
degreesF = degreesC * (9.0 / 5.0) + 32.0;
// Выводим данные в монитор порта
Serial.print("voltage: ");
Serial.print(voltage); // Показываем напряжение
Serial.print(" deg C: ");
Serial.print(degreesC); // Показываем температуру в °C
Serial.print(" deg F: ");
Serial.println(degreesF); // Показываем температуру в °F и перенос строки
delay(1000); // Ждём 1 секунду перед следующим измерением
}
// Функция для преобразования результата analogRead() в напряжение (0–5 В)
float getVoltage(int pin)
{
// analogRead() возвращает значение от 0 до 1023
// Умножаем его на коэффициент пересчёта в вольты (5.0 / 1023.0 ≈ 0.004882814)
return (analogRead(pin) * 0.004882814);
}
Серво — это мотор, который может точно поворачиваться на заданный угол (обычно от 0° до 180°). Он часто используется в робототехнике, моделизме и автоматизации.
Компоненты:
Серводвигатель
Схема:
Код:
// Многие доступные библиотеки можно найти по адресу: http://arduino.cc/en/Reference/Libraries
#include <Servo.h> // Сообщаем среде Arduino IDE, что используем библиотеку Servo.h для управления сервоприводами
// После подключения библиотеки мы можем сразу использовать её функции.
// Список функций библиотеки Servo: http://arduino.cc/en/Reference/Servo
// Большинство библиотек доступны в меню "File / Examples".
Servo mootor; // Создаём объект с именем "mootor", с помощью которого управляем сервоприводом
void setup()
{
// Связываем управление мотором с цифровым пином 9.
// Если используется больше одного мотора, каждый должен быть подключён к отдельному цифровому пину.
mootor.attach(9); // Подключаем управление мотором к цифровому пину 9. Он должен поддерживать PWM.
}
void loop()
{
int asend;
mootor.write(90); // Поворачиваем мотор в положение 90 градусов
delay(1000);
mootor.write(180); // Поворачиваем мотор на 180 градусов
delay(1000);
mootor.write(0); // Возвращаем мотор в положение 0 градусов
delay(1000);
// Медленное вращение мотора по часовой стрелке (от 0 до 180 градусов)
for(asend = 0; asend < 180; asend += 2)
{
mootor.write(asend); // Изменяем положение мотора
delay(20); // Короткая пауза для плавного движения
}
// Медленное вращение мотора против часовой стрелки (от 180 до 0 градусов)
for(asend = 180; asend >= 0; asend -= 1)
{
mootor.write(asend); // Изменяем положение мотора
delay(20); // Короткая пауза для плавного движения
}
}
Как работает программа:
Создаем автоматизированную миниатюрную тепличную систему, реагирующую на температуру окружающей среды и освещенность.
Система должна иметь возможность управлять серводвигателем в зависимости от изменения температуры и включать или выключать свет в зависимости от интенсивности света с помощью фоторезистора.
Этот проект позволяет связать реальные условия окружающей среды с электроникой и смоделировать автоматический уход за растениями в небольшой теплице.
Компоненты:
Схема:
Ниже расмотрим код:
#include <Servo.h>
// --- Пины ---
const int LDRPin = A2; // Фоторезистор (аналоговый пин A2)
const int ledPin = 9; // Светодиод
const int temperaturePin = A1; // Температурный датчик LM35
const int servoPin = 6; // Серводвигатель
Servo servo;
int currentAngle = 0;
bool scanningUp = true;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
servo.attach(servoPin);
servo.write(currentAngle);
delay(1000);
}
void loop() {
// --- Чтение температуры ---
int sensorValue = analogRead(temperaturePin);
float voltage = sensorValue * (5.0 / 1023.0);
float temperature = voltage * 100;
Serial.print("Temp: ");
Serial.print(temperature);
Serial.println(" C");
// --- Чтение освещения ---
int lightLevel = analogRead(LDRPin);
Serial.print("Light: ");
Serial.println(lightLevel);
// --- Если темно ---
if (lightLevel < 500) {
digitalWrite(ledPin, HIGH); // Включаем светодиод
// Серводвигатель двигается туда-сюда
if (scanningUp) {
currentAngle++;
if (currentAngle >= 180) scanningUp = false;
} else {
currentAngle--;
if (currentAngle <= 0) scanningUp = true;
}
servo.write(currentAngle);
delay(15); // Плавное движение
} else {
// --- Светло ---
digitalWrite(ledPin, LOW); // Светодиод выключен
// Управляем сервоприводом по температуре
if (temperature > 20) {
int targetAngle;
if (temperature >= 30) {
targetAngle = 180;
} else {
targetAngle = map(temperature, 21, 30, 1, 180);
}
targetAngle = constrain(targetAngle, 0, 180);
if (currentAngle < targetAngle) {
currentAngle++;
} else if (currentAngle > targetAngle) {
currentAngle--;
}
servo.write(currentAngle);
} else {
// Если температура ≤ 20, не двигаем
servo.write(0);
currentAngle = 0;
}
delay(15);
}
delay(100);
}
Подключение библиотеки
#include <Servo.h>
Подключаем стандартную библиотеку Servo
, чтобы управлять сервоприводом.
Объявление пинов и переменных
const int LDRPin = A2; // Пин фоторезистора
const int ledPin = 9; // Пин светодиода
const int temperaturePin = A1; // Пин температурного датчика LM35
const int servoPin = 6; // Пин сервопривода
Servo servo; // Создаём объект сервопривода
int currentAngle = 0; // Текущий угол сервопривода
int previousTempReading = 0; // Переменная (не используется в этом коде)
Назначаем пины для подключения компонентов.
Servo servo; // Объект для управления сервоприводом
int currentAngle = 0; // Текущий угол поворота серво
bool scanningUp = true; // Направление движения при «сканировании» в темноте
setup()
void setup() {
pinMode(ledPin, OUTPUT); // Светодиод будет выходом
Serial.begin(9600); // Включаем монитор порта на скорости 9600 бод
servo.attach(servoPin); // Подключаем серво к пину 6
servo.write(currentAngle); // Устанавливаем начальный угол
delay(1000); // Небольшая задержка на запуск
}
loop()
int sensorValue = analogRead(temperaturePin);
float voltage = sensorValue * (5.0 / 1023.0);
float temperature = voltage * 100;
analogRead
читает напряжение от LM35.
LM35 выдаёт 10 мВ на каждый °C → формула: температура = напряжение * 100
.
Serial.print("Temp: ");
Serial.print(temperature);
Serial.println(" C");
Печатаем температуру в монитор порта.
Чтение освещённости
int lightLevel = analogRead(LDRPin);
Serial.print("Light: ");
Serial.println(lightLevel);
Считываем значение с фоторезистора. Меньше 500 — темно, больше — светло.
Если темно (освещённость < 500):
if (lightLevel < 500) {
digitalWrite(ledPin, HIGH); // Включаем свет
// Серводвигатель сканирует угол от 0 до 180 и обратно
if (scanningUp) {
currentAngle++;
if (currentAngle >= 180) scanningUp = false;
} else {
currentAngle--;
if (currentAngle <= 0) scanningUp = true;
}
servo.write(currentAngle);
delay(15); // Плавность движения
}
Включаем светодиод.
Серво постоянно двигается туда-сюда, имитируя «работу» или «проветривание ночью».
Если светло:
else {
digitalWrite(ledPin, LOW); // Выключаем свет
Если температура выше 20°C:
if (temperature > 20) {
int targetAngle;
if (temperature >= 30) {
targetAngle = 180;
} else {
targetAngle = map(temperature, 21, 30, 1, 180);
}
targetAngle = constrain(targetAngle, 0, 180);
Устанавливаем targetAngle
на основе температуры.
Используем map
для пропорции между 21°C и 30°C.
if (currentAngle < targetAngle) {
currentAngle++;
} else if (currentAngle > targetAngle) {
currentAngle--;
}
servo.write(currentAngle);
}
Серво плавно двигается к нужному углу в зависимости от температуры.
Если температура ≤ 20°C:
else {
servo.write(0);
currentAngle = 0;
}
delay(15);
}
Серво остаётся в нулевом положении.
Двигатель не работает, если температура ниже или равна 20°C.
Задержка между циклами
delay(100);
Маленькая пауза перед следующим циклом.
✅ Итоговая логика:
Условие | Действие сервопривода | Светодиод |
---|---|---|
Темно | Серво двигается всегда | Включён |
Светло + температура > 20°C | Серво реагирует на температуру | Выключен |
Светло + температура ≤ 20°C | Серво стоит в нуле | Выключен |
Несколько изменений, что были проделаны во время работы с платой.
Изменила:
float temperature = voltage * 100;
На:
float temperature = (voltage - 0.5) * 100;
Я изменила delay(100);
-> delay(1000)
; значения, чтобы пауза была секунда. Чтобы было удобнее считывать значения на Serial Monitor
Так же я меняла показытели температуры, т.к. мне было не нагреть самостоятельно дачик больше чем 25-27 градусов, а т.к если холоднее тогда бы включался двигатель (нашей поливалки)
В темноте не было проблем, один раз только почему то звук был, мотор не крутил 🙁
Далее можно посмотреть как все было видно на Serial Monitor
Видео схемы, как работает код на www.tinkercad.com
Видео, во время видео менялись показатели delay(100), float temperature и меняла в ходе видео работу датчиков:
if (temperature > 20) { // меняла на 30
int targetAngle;
if (temperature >= 30) { // меняла на 40
На двух видео, т.к. сначала снимала один ролик и решила, что он работает не достаточно хорошо, не меняла показателей кроме паузы и температуры, и чуть лучше поставила фоторезистр тогда датчик в темноте работал всегда.