Часы + комнатный термометр на базе Ардуино - Своими руками
Своими руками

Часы + комнатный термометр на базе Ардуино

>

Ранее мастер делал уже проект часов на базе Ардуино, но в качестве платы часов (RTC) использовал модуль DS1306. Как оказалось, этот модуль не очень надежный и периодически время приходится корректировать.
Используемый в этом устройстве модуль DS3231, как показала практика, гораздо надежней.
Инструменты и материалы:-Ардуино;-Макетная плата;-Перемычки;-Модуль DS3231;
-OLED-дисплей;
Шаг первый: подключение DS3231 к Arduino
DS3231 – это недорогие и точные часы реального времени (RTC) I2C со встроенным датчиком температуры. Устройство имеет батарейный отсек и поддерживает точный хронометраж, когда основное питание устройства прерывается.
Часы + комнатный термометр на базе АрдуиноЧасы + комнатный термометр на базе АрдуиноПодключается модуль RTC к Arduino, следующим образом:
Вывод VCC к выводу Arduino 5V
GND к GND
SDA к аналоговому контакту A4 Ардуино
Вывод SCL к аналоговому выводу A5 Arduino.
Нужно использовать именно эти контакты, поскольку они предназначены для связи по протоколу I2C.
Часы + комнатный термометр на базе АрдуиноШаг второй: простой кода для отображения времени
Сначала нужно импортировать библиотеку DS3231.
Библиотека DS3231
Библиотека представлена в zip. Открываем этот zip-файл в Arduino IDE. Обычно к каждой библиотеке прилагается несколько примеров скетчей.
Теперь создадим простейший эскиз для отображения даты и времени в самом простом формате.
Начинаем с объявления библиотек.
#include <Wire.h> <br> #include <DS3231.h>
Объявляем объект RTCDateTime.
DS3231 clock;<br>RTCDateTime dt;
Тип RTCDateTime состоит из следующих компонентов.
uint16_t year,
uint8_t month,
uint8_t dayOfWeek,
uint8_t hour,
uint8_t minute,
uint8_t second
В функции настройки открываем последовательный монитор, чтобы увидеть результаты скетча, а затем запускаем модуль RTC. Устанавливаем время на время компиляции скетча. Это очень удобная функция, которая упрощает установку текущего времени на RTC.
void setup() {
Serial.begin(9600);
clock.begin();
// Set sketch compiling time
clock.setDateTime( __DATE__ , __TIME__ );

В основном цикле запускаем метод time clock.getDateTime () для чтения текущей даты и времени в объект dt, который ранее определили. А затем с помощью функции печати выводим монитор последовательного времени. Как видно, формат очень простой. Мы не видим начальных нулей там, где они должны быть, поэтому, если нужно вывести дату во времени другим способом, все равно потребуются некоторые операции.

void loop(){
dt = clock.getDateTime();
Serial.print(dt.year); Serial.print("-");
Serial.print(dt.month); Serial.print("-");
Serial.print(dt.day); Serial.print(" ");
Serial.print(dt.hour); Serial.print(":");
Serial.print(dt.minute); Serial.print(":");
Serial.print(dt.second); Serial.println("");
delay(1000);
}
Часы + комнатный термометр на базе АрдуиноШаг третий: считывание температуры с помощью DS3231
DS3231 RTC имеет встроенный датчик температуры с разрешением 0,25 и точностью ± 3 ° C.
Регистр температуры обновляются после каждого 64-секундного преобразования.
Если нужно принудительное преобразование температуры, используем forceConversion ()
Поэтому, если нужное отображать температуру в основном цикле, нужно добавить следующие строки кода:
clock.forceConversion();

Serial.print("Temperature: ");
Serial.println(clock.readTemperature());
Шаг четвертый: подключение OLED-дисплея
OLED-дисплей также необходимо подключить через контакты A4 и A5, поскольку этот OLED-дисплей также является устройством I2C. Но эти выводы уже заняты. Нужно понимать, что эти контакты не предназначены для какого-либо конкретного устройства. Они могут использоваться многими устройствами с шиной I2c. Для начала подключим VCC и землю OLED-дисплея к Arduino.

Теперь представим шину I2C с линией последовательных данных, сокращенно SDA, и линией последовательных часов, называемой SCL. Arduino подключается к этой шине через аналоговый вывод А4 к SDA и через аналоговый вывод A5 к SCL. Микроконтроллер – это ведущее устройство.
Способ подключения к шине I2C может отличаться в зависимости от того, какая плата Arduino используется. Например, в Uno A4 и A5 будут работать контакты, но есть также выделенные порты I2C. С другой стороны, в Arduino Mega нельзя использовать A4 и A5 для этой цели.
Теперь можно подключить модуль RTC к этой шине в качестве ведомого устройства и OLED-дисплея так же, как и второе ведомое устройство. Но теперь встает вопрос, как Arduino распознает, какое устройство должно с ним связываться? У каждого устройства есть свой уникальный адрес. Таким образом, модуль DS3231 RTC должен быть доступен по адресу 68hex, а OLED-дисплей должен иметь шестнадцатеричный адрес 3C. Однако, если будут проблемы при подключении любого из компонентов, можно использовать скетч сканера I2c для обнаружения всех доступных устройств, подключенных к шине, и их адресов.
Ниже URL-адрес, по которому можно найти эскиз сканера I2C.
https://playground.arduino.cc/Main/I2cScanner/
Часы + комнатный термометр на базе АрдуиноЧасы + комнатный термометр на базе АрдуиноЧасы + комнатный термометр на базе АрдуиноШаг пятый: пользовательские функции, необходимые для отображения времени в правильном формате
Чтобы иметь возможность форматировать выходные значения, считанные из модуля RTC, в желаемый формат даты и времени, нужно написать следующую функцию:
День недели – конвертирует день недели в полное название дня (1-7-> Mon-Sun)
DayMonthYear – преобразует день месяца и год в одну строку. Объединяет его с кратким названием месяца, порядковым обозначением дня месяца, а затем с полным годом.
AddLeadingZero – используется для добавления начального нуля к показаниям одной цифры в течение часа, минут и секунд
CurrentTime – читает часы и минуты.
Часы + комнатный термометр на базе АрдуиноЧасы + комнатный термометр на базе АрдуиноШаг шестой: код для отображения времени на OLED-дисплее
Имея пользовательские функции, можно написать код, который будет отображать дату и время в нужном формате на oled-дисплее.
Для этого потребуется еще две библиотеки для управления дисплеем
#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>
Затем определяем его размеры.
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
В функции настройки добавляем раздел, который проверяет, правильно ли инициализирован дисплей. Он останавливает выполнение эскиза, если отображение не обнаружено.
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128×64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display(); //display initial Adafruit logo
delay(2000);
// Clear the display
display.clearDisplay();
display.display();
Дальше рассмотрим код основного цикла для преобразования считывания из модуля RTC в графическое представление даты и времени.
Сначала сохраняем данные из RTC в объект dt
dt = clock.getDateTime ();
Затем рисуем три прямоугольника / панели. Сначала белый, и поскольку этот конкретный дисплей является двухцветным, где первые 15 строк желтые, он отображается желтым. Затем рисуем еще один черным, а затем еще один белым, который будет отображаться синим, поскольку эта часть дисплея синяя.
display.fillRect(0,0,128,16,SSD1306_WHITE);
display.fillRect(0,17,128,16,SSD1306_BLACK);
display.fillRect(0,31,128,33,SSD1306_WHITE);
После выбора положения курсора, цвета и размера шрифта, устанавливаем день недели на верхней панели
display.setCursor (1,1);
display.setTextSize (2);
display.setTextColor (SSD1306_BLACK);
display.println (DayOfTheWeek (dt.dayOfWeek));
Отображаем краткое название месяца, дня месяца и года на средней панели, используя функцию DayMonthYear.
display.setCursor (1,18);
display.setTextSize (1);
display.setTextColor (SSD1306_WHITE);
display.println (DayMonthYear (dt.day, dt.month, dt.year));
Добавляем температуру на верхнюю панель.
clock.forceConversion ();
display.setCursor (85,18);
display.setTextSize (1);
display.setTextColor (SSD1306_WHITE);
display.print (clock.readTemperature ());
display.setCursor (117,16);
display.print ("о");
На главной панели отображаем часы и минуты с помощью функции CurrentTime, а затем, меньшим шрифтом, отображаем секунды.
display.setCursor(3,35);
display.setTextSize(3);
display.setTextColor(SSD1306_BLACK);
display.println(CurrentTime(dt.hour,dt.minute));

display.setCursor(100,35);
display.setTextSize(2);
display.setTextColor(SSD1306_BLACK);
display.println(AddLeadingZero(dt.second));
В итоге получился довольно красивый дизайн часов.
Часы + комнатный термометр на базе АрдуиноШаг шестой: проблемная функция DateFormat
Библиотека, которую мастер использует в этом руководстве, предоставляет одну дополнительную функцию под названием DateFormat. Это мощная функция, которая помогает форматировать время / дату, считываемые модулем RTC, без необходимости написания дополнительных функций.

Однако с этой функцией есть проблема. Для нее требуется много памяти, и если использовать функцию с OLED-дисплеем, эскизу не хватит памяти. Об этой проблеме мастер сообщил создателю библиотеки, но похоже, что он прекратил работу над этой библиотекой, и эта проблема, возможно, никогда не будет исправлена.

Можно использовать эту функцию с микроконтроллерами, совместимыми с Arduino, которые имеют более 2 КБ памяти (Arduino Mega, Bluepill и т. д.).
Часы + комнатный термометр на базе АрдуиноЧасы + комнатный термометр на базе АрдуиноВсе готово, а полностью код можно скачать здесь.
Более подробно о сборке и программировании часов можно посмотреть на видео.

SitesReady

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.