Arduino Weather Clock: часы с датой, временем, температурой и влажностью в реальном времени
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino UNO | 1 |
| Датчик температуры и влажности DHT11 (4 вывода) | 1 |
| Модуль реального времени DS3231 (Maxim Integrated) | 1 |
| Резистор 10 кОм | 1 |
| OLED-дисплей 128x64 (Adafruit) | 1 |
| Макетная плата (breadboard) | 1 |
| Перемычки (набор) | 15 |
О проекте
Хотите создать собственное устройство, которое показывает текущие дату, время, температуру и влажность? Это проще, чем кажется. Ниже описаны ключевые компоненты и принципы работы.
Arduino Uno / Nano
В качестве микроконтроллера используется Arduino Uno, но также подойдёт Arduino Nano — у него достаточно выводов для всех подключений.
Датчик DHT11
DHT11 — недорогой цифровой датчик температуры и влажности. Он использует ёмкостной датчик влажности и термистор для измерения параметров окружающей среды. Важно соблюдать интервал опроса: считывание данных рекомендуется производить не чаще раза в 2 секунды.
Важно: после первоначальной установки времени в RTC-модуле закомментируйте строку установки времени и перекомпилируйте скетч. Иначе при каждом включении время будет сбрасываться на момент компиляции.
Модуль реального времени DS3231
DS3231 — это высокоточный RTC-модуль с температурокомпенсированным кварцевым генератором (TCXO). Он точнее популярного DS1307 и имеет вход для резервной батареи, что позволяет сохранять время при отключении основного питания.
OLED-дисплей 128x64
На этом компактном и ярком экране выводится вся информация. Дисплей Adafruit можно управлять по SPI или I2C (выбор делается перемычками на обратной стороне). Можно использовать и более дешёвые аналоги, но нужно убедиться в совместимости с библиотеками Adafruit.
Скетч (программный код)
Код компилируется в Arduino IDE. Обязательно подключите все необходимые библиотеки: Adafruit_GFX, Adafruit_SSD1306, dht и стандартную Wire для I2C.
Основные функции скетча:
- Инициализация дисплея, датчика DHT11 и RTC DS3231.
- Функция
setDS3231time()для первичной установки времени (после настройки — закомментировать). - Функция
readDS3231time()считывает текущие время и дату. - Функция
displayTime()выводит время, дату, день недели и рисует аналоговые часы на дисплее. - Функция
ReadTempAndHum()опрашивает DHT11 и отображает температуру (°C) и влажность (%). - В цикле
loop()время обновляется каждую секунду, а данные DHT11 — каждые 2 секунды (через счётчикDHTtimer).
// Основные библиотеки
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <dht.h>
// Пины OLED (программный SPI)
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
// DHT11
dht DHT;
#define DHT11_PIN 3
int DHTtimer = 0;
// DS3231 I2C адрес
#define DS3231_I2C_ADDRESS 0x68
// Функции преобразования BCD
byte decToBcd(byte val) { return (val/10*16) + (val%10); }
byte bcdToDec(byte val) { return (val/16*10) + (val%16); }
void setup() {
Wire.begin();
Serial.begin(9600);
// Первичная установка времени (после закомментировать):
// setDS3231time(0, 24, 12, 6, 3, 2, 17); // сек, мин, час, день нед, день, мес, год
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
}
void loop() {
displayTime();
DHTtimer++;
if (DHTtimer > 1) {
display.fillRect(70, 45, 128, 64, BLACK);
ReadTempAndHum();
DHTtimer = 0;
}
delay(1000);
display.display();
// Очистка областей экрана для следующего кадра
display.fillRect(0, 0, 64, 64, BLACK);
display.fillRect(0, 0, 128, 20, BLACK);
}
// ... функции setDS3231time, readDS3231time, displayTime, ReadTempAndHum
// (полный код см. в оригинале или скачайте .ino файл)
Схемы и документация
- Принципиальная схема (Fritzing):
schematic_XKU0jQoWbx.fzz - Схема на макетной плате:
breadboard_diagram_QvhPKCpIo5.fzz - Библиотеки: Adafruit_SSD1306, Adafruit_GFX, DHT, Arduino RTC Library.
Совет: При сборке обратите внимание на питание: OLED и DHT11 работают от 5V, DS3231 — от 3.3V или 5V (на модуле обычно есть стабилизатор). Подтягивающий резистор 10 кОм нужен для линии данных DHT11.
Производственный процесс
- Получение текущей даты и времени в Python: практическое руководство
- Raspberry Pi сетевой монитор температуры и влажности — руководство по DIY сборке
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Бесшовный мониторинг температуры и влажности на Raspberry Pi с EzTemp
- Создание сетевой лабораторной метеостанции на Raspberry Pi
- Создание многодатчиковой системы мониторинга температуры и света с Raspberry Pi и DS18B20
- Проверка и калибровка датчика влажности для точных измерений
- Работа с датой и временем в Java: Date, SimpleDateFormat, printf, GregorianCalendar
- Полное руководство по дате и времени в C++
- Работа с датами и временем в Python: Практическое руководство