|
在本篇文章中,我们基于Arduino开发板制作一款天气时钟,可以显示时间、日期和温度。 我们使用LM35传感器采集温度值,使用DS3231设置日期和时间,同时还将使用OLED显示屏来显示温度、日期和时间。
所需的硬件 ● Arduino开发板 ● DS3231实时时钟模块 ● OLED显示屏(SSD1306) ● 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引脚。 ◾ 将DS3231的SDA连接到Arduino上的A4。 ◾ 将DS3231上的SCL连接到Arduino上的A5引脚。
最后,将LM35传感器与Arduino连接。将LM35的左侧引脚连接到Arduino上的5V,中间引脚连接到Arduino上的A0,左侧引脚连接到Arduino上的GND。
代码说明 首先,我们添加了DS3231模块和OLED的库。与用于OLED的其他库相比,用于OLED的Adafruit库具有更多功能。 - #include "DS2321.h"
- #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;
- float temp;
- float output;
复制代码
在setup()函数中,我们将LM35传感器引脚声明为输入,因为Arduino将从传感器获取输入。然后我们将命令发送到DS3231和OLED以开始与Arduino通信。 - pinMode(sensor_pin,INPUT);
- rtc.begin();
- display.begin(SSD1306_SWITCHCAPVCC);
复制代码以下行在代码中进行了注释,但如果您是第一次使用DS3231模块并且想要设置日期和时间,则取消注释这些行并进行设置。 - //rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY
- //rtc.setTime(19, 02, 0); // Set the time to 12:00:00 (24hr format)
- //rtc.setDate(7, 12, 2017); // Set the date to June 6th, 2017
复制代码 然后我们在OLED上打印“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)/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代码 以下是本篇文章使用的完整代码:
main.rar
(622 Bytes, 下载次数: 175)
|