7 практических проектов с температурными датчиками Arduino: обзор
Для кого эта статья:
- Начинающие и опытные энтузиасты электроники и программирования
- Разработчики систем автоматизации и IoT
Студенты и преподаватели в области робототехники и электроники
Погружаясь в мир Arduino, невозможно пройти мимо проектов с температурными датчиками — они открывают двери в захватывающую область IoT и автоматизации. От создания умной метеостанции до контроля температуры серверной — эти проекты не просто демонстрируют технические возможности, но и решают реальные задачи. Я собрал 7 практических проектов, которые позволят вам применить теоретические знания в работающих устройствах, будь вы начинающий энтузиаст или опытный разработчик. 🔥
Осваивая Arduino и датчики температуры, вы делаете первый шаг к изучению программирования на более высоком уровне. Обучение Python-разработке от Skypro станет логичным продолжением вашего технического пути. Этот язык позволит создавать более сложные системы мониторинга, обрабатывать данные с датчиков в реальном времени и даже создавать веб-интерфейсы для ваших Arduino-проектов. Изучив Python, вы сможете превратить любое устройство с датчиками в полноценную IoT-систему!
Практические проекты с температурными датчиками Arduino: обзор
Температурные датчики стали незаменимыми элементами в мире электроники и автоматизации. В сочетании с Arduino они превращаются в мощный инструмент для создания умных устройств и систем. Возможности применения таких комбинаций поистине безграничны — от простейших термометров до сложных систем климат-контроля.
Рассмотрим основные типы температурных датчиков, совместимых с Arduino:
- DS18B20 — цифровой датчик с высокой точностью (±0.5°C), работающий по протоколу 1-Wire
- DHT11/DHT22 — комбинированные датчики, измеряющие температуру и влажность
- LM35 — аналоговый датчик с линейной зависимостью напряжения от температуры
- MAX6675 — специализированный датчик для работы с термопарами K-типа
- BME280 — многофункциональный датчик, измеряющий температуру, влажность и атмосферное давление
Каждый из этих датчиков обладает своими особенностями, преимуществами и ограничениями. Выбор конкретного устройства зависит от требований проекта: необходимой точности, диапазона измерений, условий эксплуатации и бюджета.
| Датчик | Диапазон измерений | Точность | Особенности |
|---|---|---|---|
| DS18B20 | -55°C до +125°C | ±0.5°C | Водонепроницаемая версия, уникальный ID |
| DHT11 | 0°C до +50°C | ±2°C | Измеряет влажность, недорогой |
| DHT22 | -40°C до +80°C | ±0.5°C | Улучшенная версия DHT11 |
| LM35 | -55°C до +150°C | ±0.5°C | Простое подключение, аналоговый |
| BME280 | -40°C до +85°C | ±1.0°C | Многофункциональность: температура, влажность, давление |
Все проекты, которые мы рассмотрим далее, построены на базе этих датчиков и демонстрируют различные подходы к измерению, обработке и использованию данных о температуре. Давайте перейдем к практическим применениям! 🛠️

Умная метеостанция: измеряем и отображаем температуру
Домашняя метеостанция на Arduino представляет собой идеальный стартовый проект для освоения температурных датчиков. Такая станция может отображать текущую температуру, влажность, атмосферное давление и другие параметры окружающей среды. Ключевое преимущество самодельной метеостанции — возможность настройки под конкретные требования.
Для создания базовой метеостанции потребуются следующие компоненты:
- Arduino Uno или Nano
- Датчик BME280 или комбинация DHT22 и BMP180
- ЖК-дисплей 16×2 или OLED-дисплей 0.96"
- Макетная плата и соединительные провода
- Опционально: модуль часов реального времени DS3231
Схема подключения достаточно проста. Датчик BME280 подключается к Arduino через интерфейс I2C (пины SDA и SCL), а дисплей — либо по I2C, либо по параллельной шине. Для передачи данных на ваш компьютер или мобильное устройство можно дополнить станцию модулем WiFi ESP8266.
Алексей Воронцов, инженер-разработчик встраиваемых систем Первую метеостанцию на Arduino я собрал для своего загородного дома. Необходимость появилась после того, как мы установили систему отопления с погодозависимой автоматикой. Готовые решения стоили дорого, а нам требовался еще и удаленный мониторинг.
Собрал устройство на Arduino Mega с датчиком BME280, добавил модуль SD-карты для хранения истории и ESP8266 для отправки данных на сервер. Расположил внутренний блок в гостиной, а внешний датчик в защитном корпусе установил на северной стороне дома.
Неожиданным бонусом стало то, что метеостанция помогла выявить проблему с теплоизоляцией — графики температуры четко показали аномальное охлаждение одной из стен дома при северном ветре. После ремонта теплоизоляции потребление газа снизилось на 15% за отопительный сезон. Инвестиции в проект окупились уже через три месяца!
Код для метеостанции с BME280 и LCD-дисплеем будет выглядеть примерно так:
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <LiquidCrystal_I2C.h>
Adafruit_BME280 bme;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
if (!bme.begin(0x76)) {
lcd.print("BME280 error!");
while (1);
}
}
void loop() {
float temperature = bme.readTemperature();
float humidity = bme.readHumidity();
float pressure = bme.readPressure() / 100.0F;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature, 1);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity, 1);
lcd.print("% ");
lcd.print(pressure, 0);
lcd.print("hPa");
delay(5000);
}
Для расширения функциональности метеостанции можно добавить:
- Прогнозирование погоды на основе изменения давления
- Подключение к интернету для сравнения показаний с официальными данными
- Графическое отображение истории изменения параметров
- Цветовую индикацию значений (например, синий при низкой температуре, красный — при высокой)
Дальнейшим развитием проекта может стать интеграция с системами умного дома и автоматизация регулирования микроклимата помещения. 📱
Автоматический термостат для дома на базе Arduino
Умный термостат представляет собой логическое продолжение метеостанции с дополнительной функцией управления отопительными приборами. Такое устройство позволяет поддерживать комфортную температуру в помещении и значительно экономить на отоплении благодаря умному регулированию.
Для создания базовой версии термостата на Arduino понадобится:
- Arduino Uno/Nano
- Датчик температуры DS18B20 (для повышения точности можно использовать несколько датчиков)
- Релейный модуль для управления обогревателем
- ЖК-дисплей для отображения информации
- Кнопки или поворотный энкодер для настройки
- Макетная плата и соединительные провода
Принцип работы такого термостата достаточно прост: Arduino непрерывно считывает показания с датчика температуры, сравнивает их с заданным значением и, при необходимости, включает или выключает нагревательный элемент через реле.
Михаил Сергеев, преподаватель робототехники Идея создать термостат на Arduino возникла у меня, когда я столкнулся с проблемой в своей мастерской. Температура в помещении критически важна для некоторых моих проектов, особенно связанных с 3D-печатью, но обычный термостат обогревателя работал крайне неточно.
Решил создать систему с несколькими датчиками DS18B20, расположенными в разных зонах помещения. Arduino вычислял среднюю температуру и управлял обогревателем через реле, а также контролировал вентилятор для равномерного распределения тепла.
Самым сложным оказалось правильно настроить алгоритм работы. Простое включение/выключение при достижении заданной температуры приводило к постоянным колебаниям. Пришлось реализовать ПИД-регулятор, учитывающий скорость изменения температуры и инерцию системы.
После нескольких недель настройки система стала поддерживать температуру с точностью до 0,5°C, что значительно улучшило качество 3D-печати и сократило количество брака примерно на 30%. Теперь планирую добавить управление через WiFi и интеграцию с умным домом.
Вот пример базового кода для термостата с датчиком DS18B20:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#define ONE_WIRE_BUS 2 // Пин подключения датчика DS18B20
#define RELAY_PIN 7 // Пин управления реле
#define BUTTON_UP 3 // Кнопка увеличения температуры
#define BUTTON_DOWN 4 // Кнопка уменьшения температуры
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 16, 2);
float setTemp = 22.0; // Заданная температура
float currentTemp = 0.0; // Текущая температура
float hysteresis = 0.5; // Гистерезис
void setup() {
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
digitalWrite(RELAY_PIN, LOW);
lcd.init();
lcd.backlight();
sensors.begin();
lcd.print("Smart Thermostat");
delay(2000);
lcd.clear();
}
void loop() {
// Считываем температуру
sensors.requestTemperatures();
currentTemp = sensors.getTempCByIndex(0);
// Проверяем кнопки регулировки
if (digitalRead(BUTTON_UP) == LOW) {
setTemp += 0.5;
delay(200);
}
if (digitalRead(BUTTON_DOWN) == LOW) {
setTemp -= 0.5;
delay(200);
}
// Управление реле с гистерезисом
if (currentTemp < (setTemp – hysteresis)) {
digitalWrite(RELAY_PIN, HIGH); // Включаем обогреватель
} else if (currentTemp > (setTemp + hysteresis)) {
digitalWrite(RELAY_PIN, LOW); // Выключаем обогреватель
}
// Обновляем дисплей
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Current: ");
lcd.print(currentTemp, 1);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Set: ");
lcd.print(setTemp, 1);
lcd.print(" C ");
// Показываем статус обогревателя
if (digitalRead(RELAY_PIN) == HIGH) {
lcd.print("ON");
} else {
lcd.print("OFF");
}
delay(1000);
}
Для повышения эффективности термостата можно реализовать дополнительные функции:
- Программирование расписания (понижение температуры ночью или когда никого нет дома)
- Подключение к интернету для управления через мобильное приложение
- Интеграция с датчиками движения для определения присутствия людей
- Учет прогноза погоды для предварительного регулирования отопления
- Многозонный контроль с несколькими датчиками и управляющими устройствами
Такой проект не только обеспечит комфортный микроклимат в помещении, но и позволит сэкономить до 30% на отоплении за счет оптимизации работы нагревательных элементов. 🌡️
Система мониторинга температуры серверной комнаты
Для серверных помещений контроль температуры — не просто вопрос комфорта, а критически важный параметр, влияющий на работоспособность и срок службы оборудования. Перегрев может привести к сбоям в работе серверов, потере данных и дорогостоящим ремонтам. Arduino в сочетании с температурными датчиками позволяет создать недорогую, но эффективную систему мониторинга.
Основные требования к такой системе:
- Высокая надежность и точность измерений
- Непрерывный мониторинг с записью истории
- Система оповещения при выходе параметров за допустимые пределы
- Возможность удаленного контроля
- Автономность работы (желательно наличие резервного питания)
Для создания базовой системы мониторинга серверной комнаты понадобится:
- Arduino Mega или ESP32 (для возможности WiFi-подключения)
- Несколько датчиков DS18B20 для размещения в разных точках помещения
- Модуль Ethernet или WiFi для передачи данных
- Модуль реального времени DS3231 для точной временной привязки измерений
- Модуль SD-карты для локального хранения данных
- ЖК-дисплей для отображения текущих показаний
- Сирена или светодиоды для локального оповещения
- Опционально: датчик влажности DHT22
| Зона размещения датчика | Рекомендуемая температура | Критическая температура | Частота проверки |
|---|---|---|---|
| Воздухозаборник стойки | 18-27°C | >32°C | Каждые 30 сек |
| Выброс воздуха из стойки | 25-35°C | >45°C | Каждые 30 сек |
| Общая температура помещения | 18-24°C | >28°C | Каждую минуту |
| Зона кондиционирования | 10-16°C | >20°C | Каждую минуту |
| Критические серверы | 20-30°C | >38°C | Каждые 15 сек |
Система может быть настроена на отправку данных на локальный сервер или облачный сервис для анализа и построения графиков. Популярные платформы для таких задач — Grafana, InfluxDB, ThingSpeak или собственное веб-приложение.
Пример кода для мониторинга с несколькими датчиками DS18B20 и отправкой данных через WiFi:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <LiquidCrystal_I2C.h>
#define ONE_WIRE_BUS 2 // Пин подключения датчиков DS18B20
#define ALARM_PIN 7 // Пин для сирены
const char* ssid = "YourWiFiName";
const char* password = "YourWiFiPassword";
const char* serverUrl = "http://your-server.com/api/temperature";
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int sensorCount = 3; // Количество датчиков
float temperatures[sensorCount];
String sensorNames[sensorCount] = {"Rack1", "Rack2", "Room"};
float maxTemp[sensorCount] = {32.0, 32.0, 28.0}; // Критические значения
unsigned long lastCheckTime = 0;
const long checkInterval = 30000; // Интервал проверки (30 секунд)
void setup() {
Serial.begin(115200);
pinMode(ALARM_PIN, OUTPUT);
digitalWrite(ALARM_PIN, LOW);
lcd.init();
lcd.backlight();
lcd.print("Server Room");
lcd.setCursor(0, 1);
lcd.print("Temp Monitor");
sensors.begin();
// Подключаемся к WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
delay(2000);
lcd.clear();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis – lastCheckTime >= checkInterval) {
lastCheckTime = currentMillis;
// Запрашиваем температуру со всех датчиков
sensors.requestTemperatures();
bool alarmCondition = false;
String dataToSend = "{\"sensors\":[";
for (int i = 0; i < sensorCount; i++) {
temperatures[i] = sensors.getTempCByIndex(i);
// Проверяем на превышение порога
if (temperatures[i] > maxTemp[i]) {
alarmCondition = true;
}
// Формируем JSON для отправки
dataToSend += "{\"name\":\"" + sensorNames[i] + "\",\"temp\":" + String(temperatures[i], 1) + "}";
if (i < sensorCount – 1) dataToSend += ",";
// Выводим на LCD поочередно
if (i < 2) { // На экран помещается информация о двух датчиках
lcd.setCursor(0, i);
lcd.print(sensorNames[i] + ": ");
lcd.print(temperatures[i], 1);
lcd.print("C");
if (temperatures[i] > maxTemp[i]) lcd.print(" !");
}
}
dataToSend += "]}";
// Активируем тревогу при превышении
if (alarmCondition) {
digitalWrite(ALARM_PIN, HIGH);
delay(500);
digitalWrite(ALARM_PIN, LOW);
}
// Отправляем данные на сервер
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
int httpCode = http.POST(dataToSend);
if (httpCode > 0) {
String response = http.getString();
Serial.println(httpCode);
Serial.println(response);
} else {
Serial.println("Error on HTTP request");
}
http.end();
}
}
// Проверяем тревожное состояние каждый цикл
bool currentAlarm = false;
for (int i = 0; i < sensorCount; i++) {
if (temperatures[i] > maxTemp[i]) {
currentAlarm = true;
}
}
if (currentAlarm) {
// Мигаем подсветкой дисплея для привлечения внимания
if ((millis() / 500) % 2 == 0) {
lcd.backlight();
} else {
lcd.noBacklight();
}
} else {
lcd.backlight();
}
delay(100);
}
Для повышения надежности системы рекомендуется добавить:
- Резервное питание через аккумулятор или UPS
- Резервные каналы связи (Ethernet + WiFi или GSM)
- Автоматическое управление вентиляцией или кондиционированием
- Интеграцию с системами пожаротушения
Такая система способна предотвратить дорогостоящие сбои и аварии, обеспечивая непрерывный мониторинг критически важных параметров серверной комнаты. 🖥️
Контроль температуры в теплице с управлением вентиляцией
Поддержание оптимального микроклимата в теплице критически важно для роста и развития растений. Слишком высокая или низкая температура может негативно сказаться на урожайности или полностью погубить посадки. Система автоматизации на базе Arduino способна поддерживать оптимальные условия, реагируя на изменения погоды и времени суток.
Для создания системы контроля температуры в теплице потребуется:
- Arduino Uno/Mega/ESP32
- Датчики температуры и влажности DHT22 (2-3 штуки для разных зон теплицы)
- Релейные модули для управления обогревателями, вентиляторами, форточками
- Сервоприводы для автоматического открывания/закрывания форточек
- Модуль часов реального времени DS3231
- ЖК-дисплей для отображения текущих параметров
- Опционально: датчик освещенности, датчик влажности почвы
Принцип работы системы заключается в непрерывном мониторинге температуры и влажности и автоматическом регулировании параметров микроклимата. В жаркую погоду система активирует вентиляцию или открывает форточки, а в холодную — включает обогреватели.
Вот пример кода для базовой системы управления теплицей:
#include <DHT.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#define DHT_PIN_1 2 // Первый датчик DHT22
#define DHT_PIN_2 3 // Второй датчик DHT22
#define DHT_TYPE DHT22
#define HEATER_PIN 7 // Реле обогревателя
#define FAN_PIN 8 // Реле вентилятора
#define WINDOW_SERVO 9 // Сервопривод форточки
// Параметры микроклимата
float minTemp = 18.0; // Минимальная допустимая температура
float maxTemp = 28.0; // Максимальная допустимая температура
float maxHumidity = 80.0; // Максимальная допустимая влажность
DHT dht1(DHT_PIN_1, DHT_TYPE);
DHT dht2(DHT_PIN_2, DHT_TYPE);
Servo windowServo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS3231 rtc;
int windowPosition = 0; // Текущее положение форточки (0-180)
void setup() {
Serial.begin(9600);
dht1.begin();
dht2.begin();
pinMode(HEATER_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
digitalWrite(HEATER_PIN, LOW); // Выключаем обогреватель
digitalWrite(FAN_PIN, LOW); // Выключаем вентилятор
windowServo.attach(WINDOW_SERVO);
windowServo.write(windowPosition);
lcd.init();
lcd.backlight();
lcd.print("Greenhouse");
lcd.setCursor(0, 1);
lcd.print("Control System");
if (!rtc.begin()) {
lcd.clear();
lcd.print("RTC Error!");
while(1);
}
// Устанавливаем время, если RTC был сброшен
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
delay(2000);
lcd.clear();
}
void loop() {
// Считываем данные с датчиков
float temp1 = dht1.readTemperature();
float hum1 = dht1.readHumidity();
float temp2 = dht2.readTemperature();
float hum2 = dht2.readHumidity();
// Проверяем на ошибки считывания
if (isnan(temp1) || isnan(hum1)) {
Serial.println("Sensor 1 error!");
temp1 = 0;
hum1 = 0;
}
if (isnan(temp2) || isnan(hum2)) {
Serial.println("Sensor 2 error!");
temp2 = 0;
hum2 = 0;
}
// Вычисляем средние значения
float avgTemp = (temp1 + temp2) / 2;
float avgHum = (hum1 + hum2) / 2;
// Получаем текущее время
DateTime now = rtc.now();
bool isDayTime = (now.hour() >= 7 && now.hour() < 20); // Определяем день/ночь
// Корректируем целевую температуру в зависимости от времени суток
float targetMinTemp = isDayTime ? minTemp : (minTemp – 3.0); // Ночью допускаем более низкую температуру
float targetMaxTemp = isDayTime ? maxTemp : (maxTemp – 3.0);
// Логика управления обогревом
if (avgTemp < targetMinTemp) {
digitalWrite(HEATER_PIN, HIGH); // Включаем обогреватель
} else if (avgTemp > (targetMinTemp + 1.5)) {
digitalWrite(HEATER_PIN, LOW); // Выключаем обогреватель с гистерезисом
}
// Логика управления вентиляцией
bool needVentilation = (avgTemp > targetMaxTemp) || (avgHum > maxHumidity);
if (needVentilation) {
// Сначала пробуем проветрить через форточку
if (windowPosition < 180) {
windowPosition += 10;
if (windowPosition > 180) windowPosition = 180;
windowServo.write(windowPosition);
}
// Если форточки недостаточно, включаем вентилятор
else {
digitalWrite(FAN_PIN, HIGH);
}
} else {
// Если вентиляция не требуется, закрываем форточку и выключаем вентилятор
if (avgTemp < (targetMaxTemp – 2.0) && avgHum < (maxHumidity – 5.0)) {
digitalWrite(FAN_PIN, LOW);
if (windowPosition > 0) {
windowPosition -= 10;
if (windowPosition < 0) windowPosition = 0;
windowServo.write(windowPosition);
}
}
}
// Выводим информацию на дисплей
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(avgTemp, 1);
lcd.print("C H:");
lcd.print(avgHum, 0);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("H:");
if (digitalRead(HEATER_PIN)) lcd.print("ON"); else lcd.print("OFF");
lcd.print(" F:");
if (digitalRead(FAN_PIN)) lcd.print("ON"); else lcd.print("OFF");
lcd.print(" W:");
lcd.print(map(windowPosition, 0, 180, 0, 100));
lcd.print("%");
delay(5000); // Опрос каждые 5 секунд
}
Для более эффективной работы системы можно добавить:
- Датчики влажности почвы для автоматического полива
- Датчики освещенности для управления дополнительным освещением
- Датчик уровня CO2 для оптимизации условий фотосинтеза
- GSM-модуль для удаленного мониторинга и управления
- Солнечные панели и аккумуляторы для автономной работы системы
Система автоматизации теплицы на Arduino не только избавляет от необходимости постоянного контроля, но и позволяет создать оптимальные условия для растений, что положительно сказывается на урожайности. 🌱
Портативный термометр с записью данных на карту памяти
Портативный термометр с функцией регистрации данных (data logger) представляет собой компактное устройство, которое может быть использовано для долговременного мониторинга температуры в различных условиях: от контроля температуры в холодильных установках до исследования микроклимата природных объектов.
Преимущества такого устройства перед коммерческими аналогами включают:
- Значительно меньшую стоимость (в 3-10 раз дешевле промышленных логгеров)
- Возможность настройки под конкретные требования
- Расширяемость функционала (добавление дополнительных датчиков и интерфейсов)
- Простоту обслуживания и модификации
- Прозрачный формат хранения данных
Для создания портативного термометра-логгера потребуются следующие компоненты:
- Arduino Nano или Pro Mini (для компактности)
- Датчик DS18B20 (можно в водонепроницаемом исполнении)
- Модуль SD-карты для хранения данных
- Модуль часов реального времени DS3231 для временных меток
- Компактный OLED-дисплей 0.96"
- Литиевый аккумулятор 18650 или несколько батареек AA
- Кнопки для управления
- Корпус (можно напечатать на 3D-принтере)
Вот пример кода для такого устройства:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define ONE_WIRE_BUS 2 // Пин датчика DS18B20
#define CHIP_SELECT 10 // Пин CS для модуля SD-карты
#define BUTTON_MODE 3 // Кнопка переключения режимов
#define BUTTON_ACTION 4 // Кнопка действия
#define SCREEN_WIDTH 128 // Ширина OLED дисплея
#define SCREEN_HEIGHT 64 // Высота OLED дисплея
#define OLED_RESET -1 // Пин сброса дисплея (не используется)
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
RTC_DS3231 rtc;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Параметры записи данных
unsigned long loggingInterval = 60000; // Интервал записи (1 минута)
unsigned long lastLogTime = 0;
bool loggingEnabled = false;
String logFileName = "";
// Параметры интерфейса
int currentMode = 0; // 0 – просмотр, 1 – настройка, 2 – логирование
String modes[] = {"View", "Setup", "Logging"};
void setup() {
Serial.begin(9600);
// Настройка кнопок
pinMode(BUTTON_MODE, INPUT_PULLUP);
pinMode(BUTTON_ACTION, INPUT_PULLUP);
// Инициализация дисплея
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while(1);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Temperature Logger");
display.display();
delay(2000);
// Инициализация датчика температуры
sensors.begin();
// Инициализация RTC
if (!rtc.begin()) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("RTC failed!");
display.display();
while(1);
}
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Инициализация SD-карты
display.clearDisplay();
display.setCursor(0, 0);
display.println("Initializing SD card...");
display.display();
if (!SD.begin(CHIP_SELECT)) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("SD card failed!");
display.display();
delay(2000);
} else {
display.clearDisplay();
display.setCursor(0, 0);
display.println("SD card initialized.");
display.display();
delay(1000);
}
// Создаем имя файла на основе текущей даты
DateTime now = rtc.now();
logFileName = String(now.year()) +
String(now.month() < 10 ? "0" : "") + String(now.month()) +
String(now.day() < 10 ? "0" : "") + String(now.day()) + ".csv";
// Проверяем, существует ли файл, если нет – создаем с заголовками
if (!SD.exists(logFileName)) {
File dataFile = SD.open(logFileName, FILE_WRITE);
if (dataFile) {
dataFile.println("Date,Time,Temperature (C)");
dataFile.close();
}
}
}
void loop() {
// Обработка нажатия кнопок
if (digitalRead(BUTTON_MODE) == LOW) {
delay(50); // Дребезг контактов
if (digitalRead(BUTTON_MODE) == LOW) {
currentMode = (currentMode + 1) % 3;
delay(300);
}
}
// Получаем текущую температуру
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
// Обновляем дисплей в зависимости от режима
display.clearDisplay();
display.setCursor(0, 0);
display.println("Mode: " + modes[currentMode]);
display.println("-----------------");
DateTime now = rtc.now();
if (currentMode == 0) { // Режим просмотра
display.setCursor(0, 16);
display.println("Date: " +
String(now.year()) + "/" +
String(now.month() < 10 ? "0" : "") + String(now.month()) + "/" +
String(now.day() < 10 ? "0" : "") + String(now.day()));
display.println("Time: " +
String(now.hour() < 10 ? "0" : "") + String(now.hour()) + ":" +
String(now.minute() < 10 ? "0" : "") + String(now.minute()) + ":" +
String(now.second() < 10 ? "0" : "") + String(now.second()));
display.println();
display.setTextSize(2);
display.print(tempC);
display.println(" C");
display.setTextSize(1);
}
else if (currentMode == 1) { // Режим настройки
display.setCursor(0, 16);
display.println("Logging interval:");
display.print(loggingInterval / 1000);
display.println(" seconds");
display.println();
display.println("Press ACTION to");
display.println("change interval");
if (digitalRead(BUTTON_ACTION) == LOW) {
delay(50);
if (digitalRead(BUTTON_ACTION) == LOW) {
// Меняем интервал записи
if (loggingInterval == 60000) loggingInterval = 300000; // 5 минут
else if (loggingInterval == 300000) loggingInterval = 600000; // 10 минут
else if (loggingInterval == 600000) loggingInterval = 1800000; // 30 минут
else if (loggingInterval == 1800000) loggingInterval = 3600000; // 1 час
else if (loggingInterval == 3600000) loggingInterval = 60000; // 1 минута
delay(300);
}
}
}
else if (currentMode == 2) { // Режим логирования
display.setCursor(0, 16);
if (loggingEnabled) {
display.println("Logging ACTIVE");
display.println("File: " + logFileName);
display.println("Interval: " + String(loggingInterval / 1000) + " s");
display.println();
display.println("Press ACTION to stop");
} else {
display.println("Logging INACTIVE");
display.println("File: " + logFileName);
display.println("Interval: " + String(loggingInterval / 1000) + " s");
display.println();
display.println("Press ACTION to start");
}
if (digitalRead(BUTTON_ACTION) == LOW) {
delay(50);
if (digitalRead(BUTTON_ACTION) == LOW) {
loggingEnabled = !loggingEnabled;
lastLogTime = millis(); // Сбрасываем таймер при включении/выключении
delay(300);
}
}
// Записываем данные по таймеру, если логирование включено
if (loggingEnabled && (millis() – lastLogTime >= loggingInterval)) {
lastLogTime = millis();
String dataString =
String(now.year()) + "/" +
String(now.month() < 10 ? "0" : "") + String(now.month()) + "/" +
String(now.day() < 10 ? "0" : "") + String(now.day()) + "," +
String(now.hour() < 10 ? "0" : "") + String(now.hour()) + ":" +
String(now.minute() < 10 ? "0" : "") + String(now.minute()) + ":" +
String(now.second() < 10 ? "0" : "") + String(now.second()) + "," +
String(tempC);
File dataFile = SD.open(logFileName, FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// Моргаем дисплеем для индикации записи
display.invertDisplay(true);
delay(100);
display.invertDisplay(false);
}
}
}
display.display();
delay(100);
}
После записи данных их можно импортировать в Excel, Google Sheets или специальное ПО для анализа и построения графиков. Данные хранятся в формате CSV, который поддерживается большинством программ для работы с таблицами.
Возможности расширения проекта:
- Добавление Bluetooth или WiFi для беспроводной передачи данных
- Интеграция нескольких датчиков для одновременного мониторинга разных зон
- Реализация более сложных режимов записи (например, запись только при выходе за заданные пределы)
- Добавление звуковой сигнализации при критических значениях
- Оптимизация энергопотребления для продления времени автономной работы
Такой портативный термометр найдет применение в различных областях: от пищевой промышленности до научных исследований и домашних экспериментов. 📊
Температурные датчики с Arduino открывают безграничные возможности для автоматизации повседневных задач, научных исследований и промышленных приложений. Представленные проекты — лишь малая часть того, что можно реализовать, комбинируя эти компоненты с вашим творческим подходом и техническими знаниями. Помните, что каждый проект можно адаптировать и развивать, добавляя новые функции или оптимизируя существующие. Начните с простого — и вскоре вы сможете создавать сложные системы, решающие реальные проблемы и делающие жизнь комфортнее и безопаснее.
Читайте также
- Arduino с дисплеями и датчиками: 10 проектов для начинающих
- 5 проектов Arduino для создания устройств мониторинга сна дома
- Сенсорные экраны Arduino: топ-10 вдохновляющих проектов для начинающих
- Датчики влажности для Arduino: лучшие проекты с автополивом
- Отладка Arduino: эффективные методы поиска и устранения ошибок
- Создание монитора сердечного ритма Arduino: схемы и код
- Arduino: основы программирования для начинающих электроников
- Как собрать умный термостат на Arduino: экономия и автоматизация
- Arduino: от мигающего светодиода к умному дому за 5 шагов
- 10 проектов Arduino для умного дома: практическое руководство