TEMP, SERVO

Temperatuuti andur

Эксперимент по измерению температуры с помощью датчика температуры.

Компоненты:

Температурный датчик

Схема:

Код:

// Объявляем номер аналогового пина, к которому подключён температурный датчик
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);
}

180 kraadine servo mootori kasutamine

Серво — это мотор, который может точно поворачиваться на заданный угол (обычно от 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); // Короткая пауза для плавного движения
  }
}

Как работает программа:

  1. Сервопривод поворачивается резко в 90°, потом 180°, потом обратно в 0°.
  2. Затем он медленно поворачивается до 180° и медленно возвращается обратно.
  3. Цикл повторяется бесконечно.

Temperatuuritundlik servolülitus(Kasvuhoone temperatuuri reguleegimine)

Автоматизированная теплица

Цель:

Создаем автоматизированную миниатюрную тепличную систему, реагирующую на температуру окружающей среды и освещенность. 

Система должна иметь возможность управлять серводвигателем в зависимости от изменения температуры и включать или выключать свет в зависимости от интенсивности света с помощью фоторезистора. 

Этот проект позволяет связать реальные условия окружающей среды с электроникой и смоделировать автоматический уход за растениями в небольшой теплице.

Компоненты:

  • Датчик температуры (например, LM35, DHT11 или TMP36)
  • Фоторезистор (LDR – светочувствительный резистор)
  • Серводвигатель (маленький, например SG90)
  • Светодиод (для имитации света или дополнительного освещения)
  • Ардуино Уно
  • Резисторы (для LDR и светодиодов)
  • Провода и макетная плата
  • Корпус или заземляющий элемент для размещения датчиков и компонентов
  • Источник питания (USB, батарея или аккумулятор)

Схема:

Описание схемы Arduino-проекта

  • Температурный датчик (A1) – измеряет температуру воздуха.
  • Фоторезистор (A2) – определяет уровень освещённости в окружающей среде.
  • Сервопривод (пин 6) – открывает или закрывает окно (или крышу теплицы) в зависимости от температуры.
  • Светодиод (пин 9) – автоматически загорается при низкой освещённости.
  • Резисторы – используются с фоторезистором (делитель напряжения) и светодиодом (ограничение тока).
  • Питание через Arduino Uno, подключённое по USB.

Как работает код:

  1. Температурный датчик считывает текущую температуру воздуха.
  2. В зависимости от температуры:
    • При температуре ≤ 20°C: сервопривод поворачивается в положение (окно закрыто).
    • При температуре ≥ 30°C: сервопривод поворачивается в положение 180° (окно открыто).
    • При температуре от 20°C до 30°C: угол выбирается пропорционально температуре.
    • Движение серводвигателя происходит плавно, по шагам.
  3. Фоторезистор измеряет уровень освещённости:
    • Если освещённость < 500: светодиод включается.
    • Если освещённость ≥ 500: светодиод выключается.
  4. Все данные о температуре и освещённости выводятся в Serial Monitor для отладки.

Ниже расмотрим код:

#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

На двух видео, т.к. сначала снимала один ролик и решила, что он работает не достаточно хорошо, не меняла показателей кроме паузы и температуры, и чуть лучше поставила фоторезистр тогда датчик в темноте работал всегда.

Применение проекта:

1. Личная мини-теплица дома / на балконе

  • ✅ Автоматически “поливания” или открытия “окна”, если внутри слишком жарко.
  • ✅ Включает свет в сумерках, если освещения недостаточно (для фотосинтеза).
  • 🪴 Подходит для выращивания трав, рассады, цветов и мини-огородов в условиях квартиры.

2. Учебный проект для школ и колледжей

  • 🎓 Демонстрация работы датчиков (температуры, света), исполнительных механизмов (сервопривод).
  • ✅ Отличный пример интеграции физики, программирования и экологии.
  • 💡 Используется для курсов по робототехнике, автоматике и “умному дому”.

3. Промышленное применение (модель)

  • В более крупном варианте можно подключить:
    • 💨 Вентиляторы / окна
    • 💧 Полив по температуры внутри
    • ☁️ Системы мониторинга через интернет
  • Такая система имитирует умное сельское хозяйство, где поддерживаются климатические условия.