Ülesanne 4 Temperatuuritundlik servolülitus(Kasvuhoone temperatuuri reguleegimine)

1️⃣Эксперимент — Считывание температуры с аналогового датчика

Цель:
Научиться считывать данные с аналогового температурного датчика (например, LM35) и преобразовывать их в значения температуры по Цельсию и Фаренгейту.

Компоненты:

  • Плата Arduino Uno
  • Аналоговый температурный датчик (например, LM35)
  • Соединительные провода

Схема подключения:

  • Выходной пин датчика подключается к аналоговому входу A0 на Arduino.
  • Питание (VCC) датчика подключается к 5V на Arduino.
  • GND датчика подключается к GND на Arduino.

Код программы:

const int temperaturePin = 0;

void setup()
{
Serial.begin(9600);
}

void loop()
{

float voltage, degreesC, degreesF;
// kasutame analogRead(), mis tagastab sisendi väärtused vahemikul 0 ... 1023.
// koostasime getVoltage() funktsioon, mis tagastab pingeväärtus  0 ... 5,

voltage = getVoltage(temperaturePin);
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);
Serial.print(" deg F: ");
Serial.println(degreesF);


//Ekraanil ilmub järgmine tekst: "voltage: 0.73 deg C: 22.75 deg F: 72.96"
delay(1000); // ootame 1 sek
}

float getVoltage(int pin)
{
return (analogRead(pin) * 0.004882814);
// teisendame pinge vahemikust 0,0 ... 5,0 V, vahemikku 0 до 1023.
}

Принцип работы:

  • Функция getVoltage() преобразует аналоговое значение (0–1023) в напряжение (0–5 В).
  • Температура в градусах Цельсия рассчитывается по формуле: (напряжение — 0.5) * 100.
  • Температура в градусах Фаренгейта рассчитывается по формуле: Цельсий * 9/5 + 32.

2️⃣Эксперимент — Управление сервоприводом

Цель:
Научиться управлять сервоприводом с помощью Arduino, изменяя его положение.

Компоненты:

  • Плата Arduino Uno
  • Сервопривод (например, SG90)
  • Соединительные провода

Схема подключения:

  • Сигнальный пин сервопривода подключается к цифровому пину 9 на Arduino.
  • Питание (VCC) сервопривода подключается к 5V на Arduino.
  • GND сервопривода подключается к GND на Arduino.

Код программы:

// Paljud saadaolevad teegid (library’d) on leitavad aadressilt http://arduino.cc/en/Reference/Libraries

#include <Servo.h> // teavitame Arduino IDE-d, et kasutame mootorite juhtimiseks mõeldud Servo.h teeki

// Kui teek on lisatud, saame kohe kasutada selle funktsioone.
// Servo teegi funktsioonide nimekirja leiad: http://arduino.cc/en/Reference/Servo
// Enamik teeke on kättesaadavad menüüst "File / Examples".

Servo mootor; // Loome objekti nimega "mootor", millega juhime pöördemootorit (servomootorit)

void setup()
{
  // Seome mootori juhtimise digitaalse pinni 9 külge.
  // Kui kasutad rohkem kui ühte mootorit, peab iga uus mootor olema seotud eraldi digitaalse pordiga.
  mootor.attach(9); // Ühendame mootori juhtimise digitaalpordi 9 külge. See peab olema PWM-toega väljund.
}

void loop()
{
  int asend;

  mootor.write(90); // Pöörame mootori asendisse 90 kraadi
  delay(1000); 
  mootor.write(180); // Pöörame mootori 180 kraadi
  delay(1000);
  mootor.write(0); // Pöörame mootori tagasi 0 kraadi
  delay(1000);

  // Mootori pööramine aeglaselt päripäeva (0 → 180 kraadi)
  for(asend = 0; asend < 180; asend += 2)
  {
    mootor.write(asend); // Muudame mootori asendit
    delay(20); // Lühike paus sujuvaks liikumiseks
  }

  // Mootori pööramine aeglaselt vastupäeva (180 → 0 kraadi)
  for(asend = 180; asend >= 0; asend -= 1)
  { 
    mootor.write(asend); // Muudame mootori asendit
    delay(20); // Lühike paus sujuvaks liikumiseks
  }
}

Принцип работы:

  • Сервопривод последовательно перемещается в положения 90°, 180°, 0°.
  • Затем он плавно вращается от 0° до 180° и обратно, создавая эффект медленного открытия и закрытия.

🩵Automatiseeritud Kasvuhoone

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

Компоненты:

  • Плата Arduino Uno
  • Аналоговый температурный датчик (например, LM35)
  • Сервопривод (например, SG90)
  • Светодиод (опционально, для индикации)
  • Резистор (220 Ом для светодиода)
  • Соединительные провода

Схема подключения:

  • Температурный датчик подключается к аналоговому входу A0.
  • Сервопривод подключается к цифровому пину 6.
  • Светодиод подключается к цифровому пину 10 через резистор.
  • Все компоненты заземлены (GND).

Код программы:

#include <Servo.h> // Подключаем библиотеку для управления сервоприводом
 
const int led = 10;           // Пин, к которому подключён светодиод
const int sensorPin = A1;     // Пин, на который подключён фоторезистор (датчик света)
int lightLevel, high = 0, low = 1023; // Переменные для уровня освещённости и отслеживания макс/мин
 
const int temperaturePin = A0; // Пин, на который подключён TMP36 (датчик температуры)
Servo servo1;                 // Создаём объект серводвигателя
 
int currentAngle = 0;         // Текущий угол поворота сервопривода
 
void setup() {
  pinMode(led, OUTPUT);       // Устанавливаем пин светодиода как выход
  servo1.attach(13);          // Подключаем серводвигатель к пину 13 (можно заменить на любой PWM-пин)
  Serial.begin(9600);         // Запускаем сериал-монитор для отладки
}
 
void loop() {
  // === 1. Управление яркостью светодиода в зависимости от уровня освещённости ===
  lightLevel = analogRead(sensorPin);  // Считываем значение с фоторезистора (0–1023)
  analogWrite(led, lightLevel);        // Устанавливаем яркость светодиода через ШИМ (PWM)

  // === 2. Обновляем макс. уровень света (необязательно, используется для анализа) ===
  if (lightLevel > high) {
    high = lightLevel;
  }
 
  // === 3. Считывание температуры с TMP36 ===
  float voltage = getVoltage(temperaturePin);     // Преобразуем аналоговый сигнал в напряжение
  float degreesC = (voltage - 0.5) * 100.0;        // Переводим напряжение в температуру по Цельсию
  float degreesF = degreesC * (9.0 / 5.0) + 32.0;  // Переводим температуру в Фаренгейты (необязательно)
 
  // === 4. Вывод значений температуры в Serial Monitor ===
  Serial.print("Voltage: ");
  Serial.print(voltage);
  Serial.print(" deg C: ");
  Serial.print(degreesC);
  Serial.print(" deg F: ");
  Serial.println(degreesF);
 
  // === 5. Расчёт целевого угла для сервопривода в зависимости от температуры ===
  int targetAngle;
 
  if (degreesC <= 25) {
    targetAngle = 0; // Закрываем окно (низкая температура)
  } else if (degreesC >= 35) {
    targetAngle = 180; // Открываем полностью (жарко)
  } else {
    targetAngle = map(degreesC, 26, 34, 0, 180); // Промежуточные положения (линейное отображение)
  }
 
  // === 6. Плавное движение сервопривода к целевому углу ===
  if (currentAngle < targetAngle) {
    currentAngle++;               // Поворачиваем по 1° в сторону увеличения
  } else if (currentAngle > targetAngle) {
    currentAngle--;               // Поворачиваем по 1° в сторону уменьшения
  }
 
  servo1.write(currentAngle);     // Задаём угол серводвигателю
  delay(15);                      // Пауза для плавного движения
}
 
// === 7. Функция получения напряжения с аналогового входа ===
float getVoltage(int pin) {
  return analogRead(pin) * 0.004882814; // 5V / 1024 (шаг АЦП)
}

Принцип работы:

  • Система считывает температуру каждую секунду.
  • Если температура превышает 25°C, сервопривод открывает вентиляционное окно, и загорается светодиод.
  • Если температура ниже или равна 25°C, окно закрывается, и светодиод гаснет.

Вывод

В ходе выполнения задания были освоены следующие навыки:

  • Считывание данных с аналогового температурного датчика и преобразование их в значения температуры.
  • Управление сервоприводом с помощью Arduino, включая плавное изменение его положения.
  • Создание автоматизированной системы регулирования температуры в теплице на основе показаний датчика.

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