7 практических проектов с температурными датчиками Arduino: обзор

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Начинающие и опытные энтузиасты электроники и программирования
  • Разработчики систем автоматизации и 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-дисплеем будет выглядеть примерно так:

cpp
Скопировать код
#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:

cpp
Скопировать код
#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:

cpp
Скопировать код
#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
  • ЖК-дисплей для отображения текущих параметров
  • Опционально: датчик освещенности, датчик влажности почвы

Принцип работы системы заключается в непрерывном мониторинге температуры и влажности и автоматическом регулировании параметров микроклимата. В жаркую погоду система активирует вентиляцию или открывает форточки, а в холодную — включает обогреватели.

Вот пример кода для базовой системы управления теплицей:

cpp
Скопировать код
#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-принтере)

Вот пример кода для такого устройства:

cpp
Скопировать код
#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 открывают безграничные возможности для автоматизации повседневных задач, научных исследований и промышленных приложений. Представленные проекты — лишь малая часть того, что можно реализовать, комбинируя эти компоненты с вашим творческим подходом и техническими знаниями. Помните, что каждый проект можно адаптировать и развивать, добавляя новые функции или оптимизируя существующие. Начните с простого — и вскоре вы сможете создавать сложные системы, решающие реальные проблемы и делающие жизнь комфортнее и безопаснее.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой тип сигнала выдает температурный датчик LM35?
1 / 5

Загрузка...