风筝
发表于: 2019-1-16 15:41:31 | 显示全部楼层

在本篇文章中,我们基于Arduino开发板制作一款天气时钟,可以显示时间、日期和温度。 我们使用LM35传感器采集温度值,使用DS3231设置日期和时间,同时还将使用OLED显示屏来显示温度、日期和时间。

weather clock.jpg


所需的硬件

●    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。

Arduino-weather-clock.jpg


代码说明

首先,我们添加了DS3231模块和OLED的库。与用于OLED的其他库相比,用于OLED的Adafruit库具有更多功能。

  1. #include  "DS2321.h"
  2. #include
复制代码

接下来,我们定义了连接DS3231模块和OLED的引脚。 DS3231模块通过I2C通信与Arduino配合使用,因此我们使用了Arduino的SDA和SCL引脚。


OLED通过SPI通信与Arduino配合使用。因此,我们初始化了用于SPI通信的引脚8、9、10、11、13。之后,我们初始化了LM35传感器引脚和其他变量。

  1. DS3231 rtc(SDA, SCL);
  2. #define OLED_MOSI 11
  3. #define OLED_CLK 13
  4. #define OLED_DC 9
  5. #define OLED_CS 10
  6. #define OLED_RESET 8 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
  7. const int sensor_pin = A0;
  8. float temp;
  9. float output;
复制代码

setup()函数中,我们将LM35传感器引脚声明为输入,因为Arduino将从传感器获取输入。然后我们将命令发送到DS3231和OLED以开始与Arduino通信。

  1. pinMode(sensor_pin,INPUT);
  2. rtc.begin();
  3. display.begin(SSD1306_SWITCHCAPVCC);
复制代码

以下行在代码中进行了注释,但如果您是第一次使用DS3231模块并且想要设置日期和时间,则取消注释这些行并进行设置。

  1. //rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  2. //rtc.setTime(19, 02, 0);     // Set the time to 12:00:00 (24hr format)
  3. //rtc.setDate(7, 12, 2017);   // Set the date to June 6th, 2017
复制代码

然后我们在OLED上打印“weather clock”,并持续5秒钟。

  1. display.clearDisplay();
  2. display.setTextColor(WHITE);
  3. display.setTextSize(2);
  4. display.setCursor(0,0);
  5. display.print("  Weather ");
  6. display.setCursor(0,17);
  7. display.print("  Clock ");
  8. display.display();
  9. delay(5000);
复制代码

loop()函数中,我们从LM35读取并计算温度。然后得到时间和日期并打印在OLED显示屏上。

  1. output = analogRead(sensor_pin);
  2. temp =(output*500)/1023;
  3. display.clearDisplay();
  4. display.setTextSize(2);
  5. display.setCursor(20,0);
  6. display.print(rtc.getTimeStr());
  7. display.setTextSize(1);
  8. display.setCursor(0,15);
  9. display.print(rtc.getDateStr());
  10. display.setTextSize(1);
  11. display.setCursor(70,15);
  12. display.print(rtc.getDOWStr());
复制代码

Arduino代码

以下是本篇文章使用的完整代码: main.rar (622 Bytes, 下载次数: 175)

跳转到指定楼层
AAA
发表于: 2019-5-14 20:49:31 | 显示全部楼层

请问这个是要导入库吗?这样写编译不了
回复

使用道具 举报

风筝
发表于: 2019-5-14 22:17:21 | 显示全部楼层

AAA 发表于 2019-5-14 20:49
请问这个是要导入库吗?这样写编译不了

是的,前提要加入DS3231模块和OLED的库。库的下载地址可以在github找到。
回复

使用道具 举报

AAA
发表于: 2019-5-15 21:47:01 | 显示全部楼层

风筝 发表于 2019-5-14 22:17
是的,前提要加入DS3231模块和OLED的库。库的下载地址可以在github找到。

好的  谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-24 11:06 , Processed in 0.038615 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表