带有实时时钟的 Arduino OLED 温度显示
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
关于这个项目
我们将制作一个 Arduino 天气时钟,它会告诉我们时间、日期和温度。 LM35传感器会告诉我们温度,DS3231会告诉我们日期和时间,我们会用OLED来显示温度、日期和时间。
必需组件
本项目所需组件如下
- 阿杜诺
- DS3231(实时时钟模块)
- OLED 显示屏(此处使用 SSD1306)
- SSD1306.pdf
- Lm35
- 连接线
- 面包板
电路图
首先,将 OLED 与 Arduino 连接起来。 OLED 通过 SPI 和 I2C 通信与 Arduino 一起工作,但我们已使用 SPI 通信连接它。 Arduino上的SPI引脚为8、9、10、11、13脚。OLED与Arduino的连接如下:
- 将 OLED 的 CS 连接到 Arduino 的引脚 10。
- 将 OLED 的 DC 连接到 Arduino 的引脚 9。
- 将 OLED 的 RES 连接到 Arduino 的引脚 8。
- 将 OLED 的 D1 连接到 Arduino 的引脚 11。
- 将 OLED 的 D0 连接到 Arduino 的引脚 13。
- 将 OLED 的 VCC 连接到 Arduino 的 5V 引脚。
- 将 OLED 的 GND 连接到 Arduino 的 GND 引脚。
之后,将 DS3231 模块与 Arduino 连接。 DS3231 模块通过 I2C 通信与 Arduino 协同工作。 Arduino 上用于 I2C 通信的引脚是 SDA 和 SCL。将 DS3231 模块连接到 Arduino,如下所示:
- 将 DS3231 的 GND 连接到 Arduino 的 GND 引脚。
- 将 DS3231 的 VCC 连接到 Arduino 的 5V 引脚。
- 将 OLED 的 SDA 连接到 Arduino 上的 A4。
- 将 OLED 上的 SCL 连接到 Arduino 上的 A5 引脚。
最后,将 LM35 传感器与 Arduino 连接。将LM35的左侧引脚连接到Arduino上的5V,中间引脚连接到Arduino上的A0,左侧引脚接地。
你可以找到一个 全尺寸原理图在这里
代码说明
首先,我们添加了 DS3231 模块和 OLED 的库。与其他用于 OLED 的库相比,用于 OLED 的 Adafruit 库具有更多的功能。
#include #include
接下来,我们定义了连接 DS3231 模块和 OLED 的引脚。 DS3231 模块通过 I2C 通信与 Arduino 一起工作,因此我们使用了 Arduino 的 SDA 和 SCL 引脚。 OLED 通过 SPI 通信与 Arduino 协同工作。因此,我们初始化了用于 SPI 通信的引脚 8、9、10、11、13。之后,我们初始化了 LM35 传感器引脚和其他变量。
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;浮动温度;浮动输出;
在设置函数中,我们将 LM35 传感器引脚声明为输入,因为 Arduino 将从传感器获取输入。然后我们给DS3231和OLED下达命令开始与Arduino通信。
pinMode(sensor_pin,INPUT);rtc.begin();display.begin(SSD1306_SWITCHCAPVCC);
代码中对以下几行进行了注释,但如果您是第一次使用 DS3231 模块并且想要设置日期、日期和时间,请取消注释这些行并进行设置。
//rtc.setDOW(WEDNESDAY); // 将星期几设置为星期日 //rtc.setTime(19, 02, 0); // 将时间设置为 12:00:00(24 小时格式) //rtc.setDate(7, 12, 2017); // 设置日期为2017年6月6日
然后我们在 OLED 上打印了 5 秒的“天气时钟”。
display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(0,0); display.print("天气"); display.setCursor(0,17); display.print("时钟");显示。显示();延迟(5000);
在循环函数中,我们从 LM35 读取并计算温度。然后我们获取时间和日期并将其打印在 OLED 上。
output =analogRead(sensor_pin);温度=(输出*500)/1023; 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.setTextSize(1); display.setCursor(70,15); display.print(rtc.getDOWStr());
完整的 Arduino 代码
#include #include DS3231 rtc(SDA, SCL);#define OLED_MOSI 11#define OLED_CLK 13#define OLED_DC 9#define OLED_CS 10#define OLED_RESET 8Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_RESET,OLED);const int sensor_pin =A0;浮动温度;浮动输出;无效设置(){ pinMode(sensor_pin,输入); rtc.begin(); display.begin(SSD1306_SWITCHCAPVCC); //rtc.setDOW(星期三); // 将星期几设置为星期日 //rtc.setTime(19, 02, 0); // 将时间设置为 12:00:00(24 小时格式) //rtc.setDate(7, 12, 2017); // 将日期设置为 2017 年 6 月 6 日 display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(0,0); display.print("天气"); display.setCursor(0,17); display.print("时钟");显示。显示();延迟(5000);}无效循环(){输出=模拟读取(传感器引脚);温度=(输出*500)/1023; 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.setTextSize(1); display.setCursor(70,15); display.print(rtc.getDOWStr()); display.setTextSize(1); display.setCursor(20,25); display.print("温度:");显示。打印(温度); display.print("C");显示。显示();延迟(1000);}
代码
- 代码片段 #4
- 代码片段 #5
- 代码片段 #6
代码片段 #4纯文本
display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(0,0); display.print("天气"); display.setCursor(0,17); display.print("时钟");显示。显示();延迟(5000);
代码片段 #5纯文本
output =analogRead(sensor_pin);温度=(输出*500)/1023; 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.setTextSize(1); display.setCursor(70,15); display.print(rtc.getDOWStr());
代码片段 #6纯文本
#include #include DS3231 rtc(SDA, SCL);#define OLED_MOSI 11#define OLED_CLK 13#define OLED_DC 9#define OLED_CS 10#define OLED_RESET 8Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLEDCS_DC, st OLED_RESET) sensor_pin =A0;浮动温度;浮动输出;无效设置(){ pinMode(sensor_pin,输入); rtc.begin(); display.begin(SSD1306_SWITCHCAPVCC); //rtc.setDOW(星期三); // 将星期几设置为星期日 //rtc.setTime(19, 02, 0); // 将时间设置为 12:00:00(24 小时格式) //rtc.setDate(7, 12, 2017); // 将日期设置为 2017 年 6 月 6 日 display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(0,0); display.print("天气"); display.setCursor(0,17); display.print("时钟");显示。显示();延迟(5000);}无效循环(){输出=模拟读取(传感器引脚);温度=(输出*500)/1023; 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.setTextSize(1); display.setCursor(70,15); display.print(rtc.getDOWStr()); display.setTextSize(1); display.setCursor(20,25); display.print("温度:");显示。打印(温度); display.print("C");显示。显示();延迟(1000);}
示意图
制造工艺