OLED часы (термометр) на arduino и DS3231


В этой статье расскажу как собрать домашние часы и термометр (все в одном) на платформе Arduino c отображением времени (часы, день, неделя, месяц и год) и температуры. В качестве дисплея используем OLED матрицу (о данной матрице говорил в предыдущей статье), данные о температуре и времени считываем с часов реального времени RCT DS3231.
OLED часы (термометр) на arduino и DS3231
Необходимые детали:
► Arduino UNO R3 x 1 шт.
► OLED-дисплей 0.96, 128х64 x 1 шт.
► Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.
► Часы реального времени на DS3231 x 1 шт.
► Макетная плата MB-102 (Breadboard) x 1 шт.
Подключение:
Для вывода времени и температуры на OLED дисплей с модуля RCT DS3231, будем использовать плату Arduino UNO. Сразу оговорюсь, что данные о температуры обновляются примерно раз в минуты, так что не ждите быстрой реакции на изменении температуры. Теперь, собираем схему, которая показана ниже, для удобства дополнительно нарисовал таблицу подключения.
Так же, на модуль DS3231 уже предварительно настроено время (настройка времени на DS3231).

Таблица подключение
В примере используется две дополнительных библиотеки DS3231 и OLED_I2C, необходимо скачать их и установить, без них скетч не заработает. Далее, запускаем среду разработки IDE и копируем скетч (для удобства, добавлю файл для скачивания), если все правильно сделали, на OLED дисплее отобразится время.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
/* Тестирование производилось на Arduino IDE 1.8.0 Дата тестирования 17.02.2017г. */ #include <OLED_I2C.h> // Подключение библиотеки OLED_I2C #include <DS3231.h> // Подключение библиотеки DS3231 OLED myOLED(SDA, SCL, 8); DS3231 rtc(SDA, SCL); extern uint8_t MegaNumbers[]; // Подключение больших шрифтов extern uint8_t SmallFont[]; // Подключение маленьких шрифтов int x = 0; // Создаем переменную "х" void setup() { myOLED.begin(); // Инициализация Oled дисплея rtc.begin(); // Инициализация RS3231 } void loop() { if (x >= 10) {temp(); // Если "x", больше или равно 10, выполняем цикл "temp" x=0;} // Обнулить "x" else {clock();} // Если "x", меньше 10, выполняем цикл "clock" x++; // Увеличить "x" на 1 } void clock() // Цикл считывания и отображения времени { myOLED.clrScr(); // Очищаем экран myOLED.setFont(SmallFont); // Включаем маленький шрифт myOLED.print(rtc.getDOWStr(), CENTER, 0); // Отображение дня недели String stringOne = rtc.getTimeStr(); myOLED.setFont(MegaNumbers); // Включаем большой шрифт myOLED.print(stringOne.substring(0,2), 4, 12); // Отображение часов myOLED.print("/", 51, 12); // Отображение двоеточие myOLED.print(stringOne.substring(3,5), 75, 12); // Отображение минут myOLED.setFont(SmallFont); // Включаем маленький шрифт myOLED.print(rtc.getDateStr(), CENTER, 57); // Отображение даты myOLED.update(); // Обновляем информацию на дисплее delay(500); // Пауза myOLED.setFont(MegaNumbers); // Включаем большой шрифт myOLED.print("-", 51, 12); // Убираем двоеточие myOLED.update(); // Обновляем информацию на дисплее delay(500); // Пауза } void temp() // Цикл считывания и отображения температуры { myOLED.clrScr(); // Очищаем экран myOLED.setFont(MegaNumbers); // Включаем большой шрифт myOLED.print(String(rtc.getTemp() , 1), CENTER, 12); myOLED.setFont(SmallFont); // Включаем маленький шрифт myOLED.print("Temperature", CENTER, 57); // Отображение надписи myOLED.update(); // Обновляем информацию на дисплее delay(2000); // Пауза } |
Описание программы:
Немного расскажу о самом скетче, он разделен на два цикла «clock» и «temp», выбор цикла осуществляется с помощью переменной «x». При первом запуске, в переменной «x» находится число «0» с помощью оператора «if» выполняется ее сравнение, если значение меньше «10», выполняется цикл времени «clock», как только «x» становить больше «10», выполняется цел «temp». Как только прошел цикл «temp» в переменную «x» записываем «0» заново повторяется.
1 2 3 4 |
if (x >= 10) {temp(); // Если "x", больше или равно 10, выполняем цикл "temp" x=0;} // Обнулить "x" else {clock();} // Если "x", меньше 10, выполняем цикл "clock" x++; // Увеличить "x" на 1 |
Просто говорят, контроллер выполняет цикл «clock» десять раз, а цикл «temp» один Для каждой команды, добавлено описание и дополнительно объяснять не вижу смысла, будет время опишу добавление русского языка.
Ссылки Библиотека DS3231
Библиотека OLED_I2C
Купить на Aliexpress Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Часы реального времени RTC DS3231
OLED-дисплей 0.96,128х64, белый, DC 3.3-5B, SPI, IIC
Купить в Самаре и области Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Часы реального времени RTC DS3231
OLED-дисплей 0.96,128х64, 3.3-5B, SPI, IIC, белый
здравствуйте. вопрос такой, можно ли вместо дисплея 0.96 использовать дисплей 0.91? и вместо DS3231 использовать DS1302?
Добрый день, дисплей можно заменить, только придется поправить скетч так-как разрешение другое. По поводу DS1302, не подскажу, так как не работал с ними.
Исправьте ошибку, глаза режет. У дисплея есть характеристика РАЗРЕШЕНИЕ. Понимаю что многие путают, однако для специалиста это недопустимо.
Добрый день После загрузки скетча сразу не отображает день недели, отображать начал после нуля часов но не правильно , подскажите в чем может быть причина?
Есть подозрение, что день недели надо вносить в чип при установке времени — он не умеет вычислять его автоматически.
Здравствуйте Вопрос: можно ли заменить температурный датчик на датчик определения веса?
Здравствуйте, да кончено можно. что за датчик определения веса используете?
Здравствуйте.
почему-то Ваш скетч не проходит верификацию
строка DS3231 rtc(SDA, SCL); останавливается на этой строчке.
no matching function for call to ‘DS3231::DS3231(const uint8_t&, const uint8_t&)’
Помогите пожалуйста. Заранее спасибо.
Здравствуйте,
Библиотеку DS3231 использовали со статьи? У меня при проверки ошибки не возникает.
Здраствуйте, сделал все как на схеме(ПРЯМ ТОЧ В ТОЧ, НИЧЕГО НЕ МЕНЯЛ И НЕ ДОБАВЛЯЛ), ток вот что выдаёт при проверке скетча :
H:\библтотеки\oled-chasy-termometr-na-arduino-i-ds3231\oled-chasy-termometr-na-arduino-i-ds3231.ino: In function ‘void clock()’:
H:\библтотеки\oled-chasy-termometr-na-arduino-i-ds3231\oled-chasy-termometr-na-arduino-i-ds3231.ino:41:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
H:\библтотеки\oled-chasy-termometr-na-arduino-i-ds3231\oled-chasy-termometr-na-arduino-i-ds3231.ino:48:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
H:\библтотеки\oled-chasy-termometr-na-arduino-i-ds3231\oled-chasy-termometr-na-arduino-i-ds3231.ino: In function ‘void temp()’:
H:\библтотеки\oled-chasy-termometr-na-arduino-i-ds3231\oled-chasy-termometr-na-arduino-i-ds3231.ino:59:41: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
Скетч использует 11488 байт (35%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 1174 байт (57%) динамической памяти, оставляя 874 байт для локальных переменных. Максимум: 2048 байт.
Помогите пожалуйста!
У меня возникает вот такая ошибка. Что сделать ?
char *monthLong[] = {«January», «February», «March», «April», «May», «June», «July», «August», «September», «October», «November», «December»};
Здравствуйте! можно ли в этой поделке заменить индикатор на TM1637.
Если возможно, видимо схему тоже нужно будет переделать. Индикатор подключить как здесь https://robotchip.ru/obzor-semisegmentnogo-indikatora-na-mt1637/ А что делать со скетчем???
И ещё, как запрограммировать будильник и как его услышать (назначить Пин звука)
ЗДРАВСТВУЙТЕ А КАК УСТАНОВИТЬ ВРЕМЯ
Добрый день. А можно пример как добавить русский язык?
Здравствуйте, надо менять библиотеку и выбрать шрифт с кириллицей.
плиз подскажите как исправить под дисплей 1.3″ по i2c