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

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).

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

Таблица подключение

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

В примере используется две дополнительных библиотеки DS3231 и OLED_I2C, необходимо скачать их и установить, без них скетч не заработает. Далее, запускаем среду разработки IDE и копируем скетч (для удобства, добавлю файл для скачивания), если все правильно сделали, на OLED дисплее отобразится время.

/* 
  Тестирование производилось на 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» заново повторяется.

 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
  Провода DuPont, 2,54 мм, 20 см
  Часы реального времени RTC DS3231
  OLED-дисплей 0.96,128х64, белый, DC 3.3-5B, SPI, IIC

Купить в Самаре и области
  Купить контроллер Arduino UNO R3
  Купить провода DuPont, 2,54 мм, 20 см
  Купить часы реального времени RTC DS3231
  Купить часы реального времени OLED-дисплей 0.96

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

комментариев 11

  1. Ильдар:

    здравствуйте. вопрос такой, можно ли вместо дисплея 0.96 использовать дисплей 0.91? и вместо DS3231 использовать DS1302?

    • Сергей Мир:

      Добрый день, дисплей можно заменить, только придется поправить скетч так-как разрешение другое. По поводу DS1302, не подскажу, так как не работал с ними.

      • Вадим:

        Исправьте ошибку, глаза режет. У дисплея есть характеристика РАЗРЕШЕНИЕ. Понимаю что многие путают, однако для специалиста это недопустимо.

  2. Сергей:

    Добрый день После загрузки скетча сразу не отображает день недели, отображать начал после нуля часов но не правильно , подскажите в чем может быть причина?

    • Сергей:

      Есть подозрение, что день недели надо вносить в чип при установке времени — он не умеет вычислять его автоматически.

  3. Евгений:

    Здравствуйте Вопрос: можно ли заменить температурный датчик на датчик определения веса?

    • vip.sergey.mir:

      Здравствуйте, да кончено можно. что за датчик определения веса используете?

  4. Вадим:

    Здравствуйте.
    почему-то Ваш скетч не проходит верификацию
    строка DS3231 rtc(SDA, SCL); останавливается на этой строчке.
    no matching function for call to ‘DS3231::DS3231(const uint8_t&, const uint8_t&)’
    Помогите пожалуйста. Заранее спасибо.

    • vip.sergey.mir:

      Здравствуйте,
      Библиотеку DS3231 использовали со статьи? У меня при проверки ошибки не возникает.

  5. Valera:

    Здраствуйте, сделал все как на схеме(ПРЯМ ТОЧ В ТОЧ, НИЧЕГО НЕ МЕНЯЛ И НЕ ДОБАВЛЯЛ), ток вот что выдаёт при проверке скетча :
    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 байт.
    Помогите пожалуйста!

  6. Valera:

    У меня возникает вот такая ошибка. Что сделать ?
    char *monthLong[] = {«January», «February», «March», «April», «May», «June», «July», «August», «September», «October», «November», «December»};

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *