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

🔧 Используемые компоненты:
- Arduino Uno
- Температурный датчик TMP36
- Макетная плата (breadboard)
- Соединительные провода
🔌 Схема подключения:
- Левая ножка TMP36 → 5V на Arduino
- Средняя ножка TMP36 → A0 на Arduino
- Правая ножка TMP36 → 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.
}
Что происходит:
- Считывается аналоговый сигнал с 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() | Отладочный вывод в монитор порта. |
Описание работы
Создана модель умной мини-теплицы, которая:
- Измеряет температуру и открывает/закрывает «окно» с помощью сервомотора:
- ≤ 20°C – окно закрыто (0°)
- ≥ 30°C – окно открыто (180°)
- Плавное движение за счёт увеличения угла по шагам.
- Измеряет освещённость с помощью фотосопротивления (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
Применение в повседневной жизни
- Автоматизация теплиц: управление вентиляцией и освещением для растений.
- Умные дома: автоматическое управление шторами, окнами.
- Метеостанции: мониторинг окружающей среды.
- Системы энергосбережения: включение света только при необходимости.