Arduino погодные часы реального времени: OLED-дисплей для времени, даты и температуры
Компоненты и материалы
| Arduino UNO | 1 |
| Adafruit DS3231 RTC (модуль реального времени) | 1 |
| Digilent Pmod OLED (SSD1306) | 1 |
| Датчик температуры LM35 (Texas Instruments) | 1 |
| Перемычки | 1 набор |
| Макетная плата | 1 |
О проекте
Сделаем Arduino-погодные часы, показывающие время, дату и температуру. LM35 дает температуру, DS3231 — точное время и дату, OLED (SSD1306) — вывод на экран.
Необходимые компоненты
- Arduino
- DS3231 (RTC модуль)
- OLED дисплей (использовался SSD1306)
- Документация SSD1306.pdf
- LM35
- Соединительные провода
- Макетная плата
- Документация lm35.pdf
Схема подключения
OLED (SPI): SPI пины Arduino — 8, 9, 10, 11, 13.
- CS (OLED) → D10
- DC (OLED) → D9
- RES (OLED) → D8
- D1 (MOSI) → D11
- D0 (SCK) → D13
- VCC → 5V
- GND → GND
DS3231 (I2C): I2C пины — A4 (SDA), A5 (SCL).
- GND → GND
- VCC → 5V
- SDA → A4
- SCL → A5
LM35:
- Левый пин (VCC) → 5V
- Средний (OUT) → A0
- Правый (GND) → GND
Полноразмерная схема здесь.
Пояснение кода
Подключаем библиотеки для DS3231 и OLED. Библиотека Adafruit для OLED богаче функциями.
#include <DS3231.h>
#include <Adafruit_SSD1306.h>
Определяем пины и объекты:
DS3231 rtc(SDA, SCL);
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 10
#define OLED_RESET 8
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
const int sensor_pin = A0;
float temp, output;
В setup() настраиваем пин датчика на вход, инициализируем RTC и OLED.
pinMode(sensor_pin, INPUT);
rtc.begin();
display.begin(SSD1306_SWITCHCAPVCC);
Раскомментируйте блок ниже для первичной установки времени/даты:
// rtc.setDOW(WEDNESDAY);
// rtc.setTime(19, 02, 0);
// rtc.setDate(7, 12, 2017);
Выводим заставку «Weather Clock» на 5 секунд:
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0); display.print(" Weather ");
display.setCursor(0,17); display.print(" Clock ");
display.display();
delay(5000);
В loop() читаем LM35, считаем температуру, получаем время/дату и выводим на OLED:
output = analogRead(sensor_pin);
temp = (output * 500.0) / 1023.0;
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20,0); display.print(rtc.getTimeStr());
display.setTextSize(1);
display.setCursor(0,15); display.print(rtc.getDateStr());
display.setCursor(70,15); display.print(rtc.getDOWStr());
display.setCursor(20,25); display.print("Temp: "); display.print(temp); display.print("C");
display.display();
delay(1000);
Полный скетч Arduino
#include <DS3231.h>
#include <Adafruit_SSD1306.h>
DS3231 rtc(SDA, SCL);
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 10
#define OLED_RESET 8
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
const int sensor_pin = A0;
float temp, output;
void setup() {
pinMode(sensor_pin, INPUT);
rtc.begin();
display.begin(SSD1306_SWITCHCAPVCC);
// rtc.setDOW(WEDNESDAY);
// rtc.setTime(19, 02, 0);
// rtc.setDate(7, 12, 2017);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0); display.print(" Weather ");
display.setCursor(0,17); display.print(" Clock ");
display.display();
delay(5000);
}
void loop() {
output = analogRead(sensor_pin);
temp = (output * 500.0) / 1023.0;
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20,0); display.print(rtc.getTimeStr());
display.setTextSize(1);
display.setCursor(0,15); display.print(rtc.getDateStr());
display.setCursor(70,15); display.print(rtc.getDOWStr());
display.setCursor(20,25); display.print("Temp: "); display.print(temp); display.print("C");
display.display();
delay(1000);
}
Схемы
Производственный процесс
- Создание аудио-эффектов, управляемых датчиками, с набором Satellite CCRMA
- Ретро-часы на индикаторах Numitron с Arduino: просто, надёжно, экономно
- Часы реального времени на Arduino с расчётом времени намаза
- Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
- Точные словесные часы: отображение времени в словах с точностью до минуты
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Монитор температуры и реальные часы на Arduino Due с TFT-дисплеем 3.2"
- Сборка Берлинских часов на Arduino UNO — LED-матричные часы своими руками
- Интерактивный HMI-проект на Nextion с Arduino Mega и датчиками
- Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код