ESP32 часовник за реално време (RTC), използващ DS1307 и OLED дисплей

Esp32 Casovnik Za Realno Vreme Rtc Izpolzvas Ds1307 I Oled Displej



ESP32 идва с вграден RTC модул, но той работи само когато има захранване. Ако има загуба на захранване, часовникът ще се нулира и няма да може да поддържа точното време. Така че, ако искате да следите времето или да управлявате устройство, базирано на времето, изпробвайте сензора DS1307 RTC. Въпреки това може да мислите да свържете резервна батерия с вашата платка ESP32, но това не е най-добрият сценарий, ако имате недостиг на енергия. Най-добрата алтернатива е да използвате сензора DS1307, тъй като той идва с вградена батерия, която може да издържи минимум една година.

За да изясним нещата, вътрешният часовник в реално време (RTC) на ESP32 може да следи времето дори когато главният процесор е изключен или е в дълбок сън. Можете да използвате ESP32 RTC, за да следите времето, без да използвате много енергия или да засягате основния процесор. Но той все още изисква енергия, за да работи, не толкова много, но е необходимо минимално количество мощност, за да работи вътрешният RTC.

Така че с това ни остава само решението за използване на външния RTC модул. Нека да проверим стъпките за свързване на платката ESP32 с модула DS1307 RTC.







Съдържание:

1. Какво представлява модулът RTC DS1307

DS1307 е устройство с ниска мощност, което може да следи точно часа и датата. Той използва двоично кодиран десетичен (BCD) формат. Може да ви каже времето в подробен формат като секунди, минути и дори часове и дни. Можете също да отпечатате датата в пълен формат като месец и година. Той също така знае кога е високосна година, до 2100. За да комуникирате с DS1307, можете да използвате протокола I2C.





DS1307 има вградена батерия, която може да го захранва около година без външен 5V източник. Използвайки тази резервна батерия, той може да запази времето дори когато основното захранване е изключено. Освен това има 56 байта SRAM за съхраняване на някои данни. DS1307 е удобно устройство, което има много приложения, когато се комбинира с платка Arduino или ESP32. Например, тези данни могат да бъдат полезни при регистриране на данни, алармени системи или индустриален контрол. Ако имате нужда от надеждно отчитане на времето, DS1307 е чудесен вариант.





Спецификации на модул RTC DS1307

Модулът RTC DS1307 се състои от RTC IC, EEPROM, кристален осцилатор и държач за батерия за резервно копие.



По-долу са подробностите за тези части:

DS1307 RTC IC : DS1307 RTC IC е 8-пинов чип, който следи часа и датата с помощта на I2C протокола. Използва много малко енергия, по-малко от 500nA. Може да показва времето в секунди, минути и часове и датата в дни, месеци и години. Освен това може да превключва между 24-часов и 12-часов формат.

24C32 EEPROM IC : 24C32 EEPROM IC е 32-байтов чип от Atmel, който съхранява настройките, часа и датата. Той също така използва протокола I2C.

32.768kHz кристал : 32,768kHz кристален осцилатор осигурява тактовата честота за DS1307 RTC IC.

Държач за батерия : Държачът на батерията съдържа батерия CR2032. Това е 3V литиева монетна клетка. Той осигурява непрекъснато захранване на DS1307 RTC IC.

Осигуряване на сензор DS18B20 : Сензорът DS18B20 ви позволява да запоявате и използвате температурния сензор DS18B20. Не е предварително запоен. Можете да запоите пакета с отвори и да получите температурата от DS щифта на модула.

Списъкът по-долу дава някои бързи спецификации на сензора DS1307 RTC:

  • Работно напрежение: 4,5–5,5 V, обикновено 5 V
  • Консумация на ток : По-малко от 1,5 mA
  • точност : 0–40 °C, зависи от кристала
  • Батерия : CR2032 (3 V монета)
  • памет : 56 байта енергонезависима RAM
  • Интерфейс : Двупроводен (I2C) сериен интерфейс
  • Изход : 1 Hz изходен щифт
  • Програмируем изход с квадратна вълна : Консумира по-малко от 500 nA в резервен режим на батерия
  • Откриване на прекъсване на захранването : Автоматично откриване на прекъсване на захранването и схема на превключване
  • Верига за измерване на мощността : Може автоматично да превключва към резервно захранване при недостиг на захранване
  • Компенсация за високосна година : Валиден до 2100 година

Разпределение на модула RTC DS1307

Модулът има няколко пина с различни функции.

  • VCC е щифтът, който се нуждае от постоянно напрежение между 3,3 V и 5,5 V, за да захранва модула.
  • GND е щифтът за ниско напрежение или маса.
  • SDA и SCL са щифтовете, предаващи данни и часовникови сигнали през I2C шината.
  • ДС е щифтът, който измерва температурата със сензора DS1307, ако имате такъв на RTC модула.
  • кв е щифтът, който генерира правоъгълен сигнал с честота 1 Hz, 4 kHz, 8 kHz или 32 kHz, в зависимост от това как го програмирате.
  • ЕДНО е щифтът, който използва 3V батерия, за да поддържа точното време, когато основното захранване е изключено.

2. Как да свържете RTC DS1307 и OLED дисплей с ESP32

За да свържете ESP32 с DS1307 и OLED дисплей, можете да използвате вградените I2C щифтове на платката ESP32. И DS1307, и OLED дисплеят са базирани на I2C устройства. След това може да комуникира с помощта на протокола I2C master slave през I2C шината.

Преди да преминем към взаимодействието на ESP32 с DS1307 и OLED дисплей, първо трябва да инсталирате някои необходими библиотеки.

Инсталиране на необходимите библиотеки

Ще ви трябват две библиотеки, една за RTC модула и една за OLED дисплея. Използвайки OLED с RTC модул, можете да създавате невероятни интерактивни визуализации на часовника. Ако нямате план за показване на часа на екрана, тогава можете да пропуснете тази инсталация на библиотеката.

Следват двете библиотеки, от които ще се нуждаете:

  • RTClib (от Adafruit) е Arduino IDE библиотека за задаване и получаване на време от RTC. Той също така предоставя класове за манипулиране на дати, часове и продължителност. Използвайки тази библиотека, можете да интерфейсирате и програмирате модулите часовник в реално време (RTC), като DS1307 и DS3231.
  • С SD1306 (от Adafruit) е библиотека за Arduino, използвайки която можете да интерфейсирате и програмирате OLED дисплеите с Arduino или всяка друга микроконтролерна платка.

За да изтеглите и инсталирате и двете библиотеки в Arduino IDE, първо отворете Мениджър на библиотеката потърсете библиотеката RTClib и щракнете Инсталирай :

Ще получите опцията да инсталирате само библиотеката или нейните зависимости. Щракнете върху Инсталирайте всички бутон за пълно инсталиране на библиотеката. По този начин няма да получите грешка, ако промените кода, който зависи от зависимостите на тази библиотека.

По същия начин потърсете библиотеката SSD1306. Тази библиотека е необходима за OLED дисплей. Кликнете Инсталирай за да продължите.

Този път ще получите същото съобщение за потвърждение. Кликнете върху Инсталирайте всички опция.

Сега и двете библиотеки за OLED и DS1307 са инсталирани и готови за използване. Но преди това първо разберете I2C адреса за OLED дисплея.

3. Намиране на I2C адрес на OLED дисплей

I2C адресът е уникален идентификатор за всяко устройство в I2C шината. Той позволява на главното устройство да комуникира с конкретно подчинено устройство, като изпраща данни до неговия адрес. Целта на I2C адреса е да се избегнат конфликти и объркване между множество устройства на една и съща шина.

За да получите адреса на I2C устройство, можете да използвате a проста скица, която сканира автобуса и отпечатва адресите на устройствата, които намира. Като алтернатива можете да проверите листа с данни на устройството, за да видите неговия адрес по подразбиране или конфигурируем.

Тук в нашия случай след стартиране на I2C кода на скенера, следният I2C адрес на OLED екрана се показва на Arduino IDE терминала.

През повечето време има голяма вероятност и вие да получите същото 0x3C адрес за вашия OLED екран.

4. Свързване на OLED и RTC DS1307 модул с ESP32

1. Свържете щифтовете SDA и SCL както на модула DS1307, така и на OLED дисплей към I2C щифтовете на ESP32. обикновено, това са GPIO 21 и GPIO 22 , но можете да зададете всякакви други пинове също в кода, ако е необходимо.

2. Свържете VCC и GND на DS1307 и OLED дисплея към 3.3V и GND щифтовете на ESP32.

3. Поставете батерия с размер на монета CR2032 в модула DS1307, за да осигурите резервно захранване за часовника в реално време.

4. Качете примерния код от този урок на вашата платка ESP32. Променете кода за потребителски изходи.

След качване часовникът ще започне от зададения час и ще покаже часа на OLED екрана.

5. Електрическа схема

Електрическата схема на ESP32 с DS1307 е проста, само с четири проводника, които трябва да бъдат свързани. Можете да скъсите I2C проводниците SDA и SCL както на сензорите OLED, така и на DS1307. По същия начин, за захранване на двата сензора, могат да се използват щифтовете 3V3 и GND на платката ESP32. Можете също да захранвате от отделен източник, ако е необходимо.

Забележка : Безопасно е да захранвате RTC DS1307 от 3,3 V щифт на ESP32, ако текущата граница на ESP32 не е превишена. Но ако искате да сте на безопасно място, можете или да използвате отделен източник на захранване за RTC модула, или да опитате сензора DS3231 с ниска мощност, чийто работен диапазон е между 3,3 до 5,5 VDC.

Изображението по-долу илюстрира връзката на ESP32 със сензора RTC DS1307.

По същия начин, ако искате да свържете OLED екрана за показване на часа, можете да използвате същите I2C щифтове и захранващите щифтове на платката ESP32.

6. Код

Използвайки кода по-долу, ще зададем текущата дата и час на RTC. След като зададете часа, кодът ще покаже часа на терминала Arduino IDE. Преди да качите кода, трябва да го актуализирате с текущите си дата и час.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char дни от седмицата [ 7 ] [ 12 ] = { 'неделя' , 'понеделник' , 'вторник' , 'сряда' , 'четвъртък' , 'петък' , 'събота' } ;
void настройка ( ) {
Serial.begin ( 115200 ) ;
#ifndef ESP8266
докато ( ! Сериен ) ;
#endif
ако ( ! DS1307_RTC.начало ( ) ) {
Serial.println ( „Не може да се намери RTC“ ) ;
докато ( 1 ) ;
}
DS1307_RTC.adjust ( Време за среща ( Е ( __ДАТА__ ) , Ф ( __TIME__ ) ) ) ;
}
празен цикъл ( ) {
DateTime сега = DS1307_RTC.now ( ) ;
Сериен.печат ( сега.година ( ) , ДЕК ) ;
Сериен.печат ( '/' ) ;
Сериен.печат ( сега.месец ( ) , ДЕК ) ;
Сериен.печат ( '/' ) ;
Сериен.печат ( сега.ден ( ) , ДЕК ) ;
Сериен.печат ( '(' ) ;
Сериен.печат ( дни от седмицата [ сега.dayOfTheWeek ( ) ] ) ;
Сериен.печат ( ')' ) ;
Сериен.печат ( сега.час ( ) , ДЕК ) ;
Сериен.печат ( ':' ) ;
Сериен.печат ( сега.минута ( ) , ДЕК ) ;
Сериен.печат ( ':' ) ;
Сериен.печат ( сега.второ ( ) , ДЕК ) ;
Serial.println ( ) ;
забавяне ( 1000 ) ;
}

Този код използва Библиотека RTClib за взаимодействие с модул за часовник в реално време DS1307, който следи датата и часа.

The настройвам функция стартира с инициализиране на скоростта на предаване. След това в този раздел дефинирахме функцията за синхронизиране на датата и часа на компютъра със сензора DS1307. Това ще качи времето за компилиране на кода в RTC сензора.

Можете да използвате цикъл функция за получаване на дата и час от RTC. След това можете да го покажете на серийния монитор по следния начин: година/месец/ден (ден от седмицата) час:минута:секунда. Не забравяйте да добавите забавяне от една секунда след всеки цикъл, така че кодът да не работи твърде бързо.

Показване на текущия час на OLED дисплей

За да показваме същото време на OLED екрана, трябва да добавим допълнителна кодова част за OLED екрана. Просто качете дадения код. Този код ще покаже текущия час на вашия OLED екран.

Не забравяйте, че тук използваме 0,96-инчовия 128×64 I2C SSD OLED дисплей модул. Ако използвате друг размер, променете съответно кода. Също така проверете I2C адреса и го променете в дадения код. В нашия случай имаме I2C адрес 0x3C за OLED екрана.

#include
#include
#include
#include 'RTClib.h'
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 дисплей ( SCREEN_WIDTH, SCREEN_HEIGHT, и Тел, - 1 ) ;
RTC_DS1307 RTC;
овъглени дни [ 7 ] [ 12 ] = { 'неделя' , 'понеделник' , 'вторник' , 'сряда' , 'четвъртък' , 'петък' , 'събота' } ;
void настройка ( ) {
Serial.begin ( 115200 ) ;
ако ( ! RTC.begin ( ) ) {
Serial.println ( „Не може да се намери RTC“ ) ;
докато ( 1 ) ;
}
RTC.adjust ( Време за среща ( Е ( __ДАТА__ ) , Ф ( __TIME__ ) ) ) ;
ако ( ! display.begin ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( Е ( „Неуспешно разпределение на SSD1306“ ) ) ;
за ( ;; ) ;
}
забавяне ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( БЯЛ ) ;
display.setCursor ( 30 , двадесет ) ;
display.println ( 'Линукс' ) ;
дисплей.дисплей ( ) ;
забавяне ( 3000 ) ;
display.clearDisplay ( ) ;
}
празен цикъл ( ) {
DateTime сега = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
дисплей.печат ( сега.ден ( ) ) ;
дисплей.печат ( '/' ) ;
дисплей.печат ( сега.месец ( ) ) ;
дисплей.печат ( '/' ) ;
дисплей.печат ( сега.година ( ) ) ;
display.println ( дни [ сега.dayOfTheWeek ( ) ] ) ;
display.println ( ' ' ) ;
display.setCursor ( 0 , 40 ) ;
ако ( сега.час ( ) < 10 )
дисплей.печат ( '0' ) ;
дисплей.печат ( сега.час ( ) ) ;
дисплей.печат ( ':' ) ;
ако ( сега.минута ( ) < 10 )
дисплей.печат ( '0' ) ;
дисплей.печат ( сега.минута ( ) ) ;
дисплей.печат ( ':' ) ;
ако ( сега.второ ( ) < 10 )
дисплей.печат ( '0' ) ;
display.println ( сега.второ ( ) ) ;
дисплей.дисплей ( ) ;
}

Кодът започна с библиотеките, които инсталирахме за RTC и дисплея. След това определя размера на екрана и адреса на дисплея. Той инициализира масива с имена на дни от седмицата.

The настройвам част започва със серийна комуникация. Той проверява дали RTC и дисплеят работят или не. След това дефинирахме текст на низ „Linuxhint“, който ще се показва за 3 секунди. Това е само съобщение за отваряне или стартиране, можете също да промените това съобщение с персонализиран текст.

The цикъл получава датата и часа на модула DS1307. След това изчиства дисплея и отпечатва датата и часа по форматиран начин. Кодът също добавя водещи нули към часовете, минутите и секундите, в случай че стойностите им са по-малки от 10.

7. Хардуер

След като качите кода на платката ESP32, ще видите следния изход на OLED екрана. За хардуер използвахме OLED екран и I2C RTC DS1307 модул. Използва се платка ESP32 с 30 пина. Можете да експериментирате и с всяка друга ESP32 платка, но се уверете, че сте свързали I2C щифтовете правилно.

Заключение

RTC DS1307 има 56-байтова SRAM с поддръжка за резервно захранване от батерия. Това е 8-пиново устройство, което използва комуникационен протокол I2C. За да свържете модула DS1307 RTC с ESP32, можете да използвате I2C щифтовете (GPIO 22 (SCL) и GPIO 21 (SDA)) на платката ESP32. Можете да отпечатате часа на Arduino IDE конзола или да използвате всеки екран като OLED или I2C LCD за показване на часа. Модулът DS1307 RTC е полезно устройство за следене на час и дата в различни приложения. Някои основни приложения включват регистратори на данни, цифрови часовници и смарт часовници.