Veronika Portfoolio

Temperatuur ja servo

4.1 Katse Temperatuuri andur

Цель:

Научиться считывать температуру с аналогового датчика TMP36 с помощью Arduino Uno и выводить значения в монитор порта.


🔧 Используемые компоненты:

  • Arduino Uno
  • Температурный датчик TMP36
  • Макетная плата (breadboard)
  • Соединительные провода

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

  • Левая ножка TMP365V на Arduino
  • Средняя ножка TMP36A0 на Arduino
  • Правая ножка TMP36GND на 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.
}

Что происходит:

  • Считывается аналоговый сигнал с TMP36.
  • Напряжение преобразуется в температуру.
  • Значения в Цельсиях и Фаренгейтах отображаются в Serial Monitor.

Чему учимся:

  • Читать аналоговые значения.
  • Использовать преобразование для получения температуры.
  • Работать с Serial.print() для вывода данных.

Ülesanne 4

Изученные функции

ФункцияОписание
analogRead(pin)Считывает аналоговое значение с датчика (температура, свет).
digitalWrite(pin, value)Управляет цифровыми пинами, включает/выключает светодиод.
map(value, fromLow, fromHigh, toLow, toHigh)Преобразует значение из одного диапазона в другой.
constrain(value, min, max)Ограничивает значение в заданных пределах.
servo.write(angle)Управляет положением сервомотора.
millis()Позволяет отслеживать время без использования delay().
Serial.print/println()Отладочный вывод в монитор порта.

Описание работы

Создана модель умной мини-теплицы, которая:

  1. Измеряет температуру и открывает/закрывает «окно» с помощью сервомотора:
    • ≤ 20°C – окно закрыто (0°)
    • ≥ 30°C – окно открыто (180°)
    • Плавное движение за счёт увеличения угла по шагам.
  2. Измеряет освещённость с помощью фотосопротивления (LDR):
    • При слабом свете включается светодиод (досветка).
    • При ярком свете LED гаснет.

🧩Использованные компоненты

  • Arduino Uno
  • Сервомотор SG90
  • Светодиод (LED)
  • Фотоэлемент (LDR)
  • Температурный датчик TMP36
  • Резисторы (10 кОм, 220 Ом)
  • Макетная плата (breadboard)
  • Провода
  • Источник питания (USB)

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

См. рисунок ниже (загружен пользователем):
📷 [Схема Arduino + компоненты на макетной плате]

Компоненты подключены следующим образом:

  • TMP36: сигнал на A0
  • LDR: сигнал на A1 (с делителем напряжения)
  • LED: цифровой пин 7
  • Servo: цифровой пин 9
  • GND и 5V на питание компонентов

Схема на Tinkercad:

Код:

#include <Servo.h>

// Определение пинов
const int tempPin = A0;
const int ldrPin = A1;
const int ledPin = 7;
const int servoPin = 9;
const int photoresistorPIN = A1;
int lightLevel, high = 0, low = 1023;

// Константы
const int LIGHT_THRESHOLD = 500;
const float TEMP_LOW = 5.0;
const float TEMP_HIGH = 10.0;

// Глобальные переменные
Servo greenhouseServo;
int currentServoAngle = 0;
float temperature = 0;
unsigned long previousServoMillis = 0;
const int servoInterval = 20;

void setup() {
  pinMode(ledPin, OUTPUT);
  greenhouseServo.attach(servoPin);
  greenhouseServo.write(currentServoAngle);
  Serial.begin(9600);
 
  // Тест LED
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
}

void loop()
{
  readTemperature();
  controlServo();
  int photoresistorVALUE = analogRead(photoresistorPIN);
  lightLevel = photoresistorVALUE;  
  autoTune();  // Настроим яркость по данным с фоторезистора
 
  // Управление LED на основе освещенности
  analogWrite(ledPin, 255 - lightLevel); // Инвертируем, так как чем больше света, тем меньше нужно светить
 

  Serial.print(photoresistorVALUE);
  Serial.println(lightLevel);
}

void autoTune() {
  // Настроим диапазон значений для фоторезистора
  if (lightLevel < low) low = lightLevel;
  if (lightLevel > high) high = lightLevel;

  lightLevel = map(lightLevel, low + 10, high - 30, 0, 255);
  lightLevel = constrain(lightLevel, 0, 255);
}

void readTemperature() {
  int reading = analogRead(tempPin);
  float voltage = reading * (5.0 / 1024.0);
  temperature = (voltage - 0.5) * 100;
 
  Serial.print(temperature);
}

void controlServo() {
  int targetAngle = currentServoAngle;
 
  if (temperature <= TEMP_LOW) {
    targetAngle = 0;
  }
  else if (temperature >= TEMP_HIGH) {
    targetAngle = 180;
  }

  if (millis() - previousServoMillis >= servoInterval) {
    previousServoMillis = millis();
   
    if (currentServoAngle < targetAngle) {
      currentServoAngle = min(currentServoAngle + 5, targetAngle);
    }
    else if (currentServoAngle > targetAngle) {
      currentServoAngle = max(currentServoAngle - 5, targetAngle);
    }
   
    greenhouseServo.write(currentServoAngle);
   
    Serial.println(currentServoAngle);
  }
}

Video

https://drive.google.com/file/d/1i5GUuOdmE_rWj4_8NJZjMUzVUgFS-8qA/view?usp=sharing

Применение в повседневной жизни

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