项目总结报告
--学习使用FireBeetle ESP32-E搭建智能家居或物联网信息显示控制项目
一、项目描述
本次项目选择的任务为任务五:其他物联网信息显示控制项目。
项目背景:家用路由器和NAS集中堆放,容易温度过高,进而导致运行效率低。
本项目使用FireBeetle ESP32-E开发板作为控制单元,定期采集DHT22温湿度传感器数据并显示到1.54寸 240*240 LCD屏幕上,同步通过WIFI连接方式传输温湿度信息到点灯科技APP中显示。其中,根据程序中设定的温度阈值,超过设定温度控制1路继电器(5V供电)开闭风扇进行散热。
二、各功能对应的主要代码片段及说明
本次编辑使用 Arduino IDE 2.0.1 版本,2.0.1较1.8.9版本,在库文件以及开发板的管理方面得到极大提升,每次打卡会自动检测更新并提示进行相应更新,很方便。
首先需要在IDE中添加本次开发板的地址(http://download.dfrobot.top/FireBeetle/package_DFRobot_index.json ),IDE会自动下载,下载完成后可在工具-开发板中选择到FireBeetle ESP32-E。 本次项目基于示例文件DFRobot__GDL -- Basic -- font开展。
本项目可分为6个模块:
1.屏幕显示功能实现:
首先需要对应自己的屏幕分辨率取消屏幕定义前的注释:
DFRobot_ST7789_240x240_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
然后在setup函数中初始化:
screen.begin();
之后在loop函数中,使用screen.系列函数在屏幕上绘制图案,或将各项数据显示出来:
screen.setFont(&FreeMonoBoldOblique12pt7b);
screen.setCursor(5,225);
screen.setTextColor(COLOR_RGB565_WHITE);
screen.setTextWrap(true);
screen.print("--State--");
...
2.DHT22 数据展示实现:
在程序开始包含 DHT22.h 库文件, 定义数据引脚为 SDA,
#define data SDA //DHT22引脚
float HighTemperature =14.00; //温度阈值设置
loop函数中,初始化模块数据: 依次使用dht22.getTemperature()和dht22.getHumidity()获取DHT22采集到的数据并存储到变量t和h中,然后结合screen函数在屏幕和serial.print函数在串口进行输出:
dht22.debug();
float t = dht22.getTemperature();
float h = dht22.getHumidity();
3.继电器控制实现:
继电器使用的5V 1路继电器模块,支持高/低电平触发,通过插针设置为高电平触发。 继电器电源直接从开发板VCC引脚接入,减少额外电源供应。信号引脚设置为OnAndOff D9,并在setup函数中设置引脚为输出模式:
#define OnAndOff D9 //继电器控制引脚
pinMode(OnAndOff,OUTPUT);//设置继电器连接引脚为 输出
通过自定义函数Set_ON_or_OFF(float t)对采集的温度数据进行判断,并设置屏幕显示和D9高电平输出。
void Set_ON_or_OFF(float t){
if(t <= HighTemperature)
{
screen.setTextColor(COLOR_RGB565_GREEN);
screen.setCursor(10,25);
screen.setTextWrap(true);
screen.print("temperat:");
screen.print(t);
screen.fillRoundRect(150,205,50,25,3,COLOR_RGB565_MAGENTA);
screen.drawRoundRect(150,205,90,25,3,COLOR_RGB565_MAGENTA);
screen.setCursor(151,225);
screen.setTextColor(COLOR_RGB565_DCYAN);
screen.print("OFF");
digitalWrite(OnAndOff,LOW);
}
if(t > HighTemperature)
{
screen.setTextColor(COLOR_RGB565_RED);
screen.setCursor(10,25);
screen.setTextWrap(true);
screen.print("temperat:");
screen.print(t);
screen.fillRoundRect(190,205,50,25,3,COLOR_RGB565_MAGENTA);
screen.drawRoundRect(150,205,90,25,3,COLOR_RGB565_MAGENTA);
screen.setCursor(191,225);
screen.setTextColor(COLOR_RGB565_DCYAN);
screen.print("ON");
digitalWrite(OnAndOff,HIGH);
}
4.WIFI功能实现:
结合wifi示例文件,首先包含 Wifi.h 库文件 设置自己的wifi账户和密码。依次在setup函数中初始化wifi为STA模式并开始连接。同时在串口中输出相应的操作结果。
const char* ssid = "好大一只荣哥哥";
const char* password = "12345678901";
WiFi.mode(WIFI_STA);
Serial.println(WiFi.localIP());
5.网络时间获取及显示:
参考CSDN《Arduino ESP32 最简单直接获取网络时间方法》(作者:perseverance52)一文,通过很简短的代码通过阿里云服务器获取时间。 首先定义NTP服务器地址, 通过configTime函数直接计算UTC+8 的时间 另外通过自定义的setClock函数获取时间并在串口格式化输出 结合GDL屏幕显示进行信息输出
#define NTP1 "ntp1.aliyun.com"
#define NTP2 "ntp2.aliyun.com"
#define NTP3 "ntp3.aliyun.com"
configTime(8 * 3600, 0, NTP1, NTP2,NTP3);
void setClock() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo))
{//输出错误信息
Serial.println("Failed to obtain time");
}
configTime(8 * 3600, 0, NTP1, NTP2, NTP3);
return;
}
Serial.println(&timeinfo, "%F %T %A"); // 格式化输出:2021-10-24 23:00:44 Sunday
//Serial.print(asctime(&timeinfo));//默认打印格式:Mon Oct 25 11:13:29 2021
}
6.点灯科技WIFI接入并通讯实现:
点灯科技需要在其官网下载ESP32支持包,和Blinker库文件,下载后选择的开发板为FireBeetle ESP32 第一代开发板。因一二代引脚不一致,查阅引脚图需要修改TFT_CS为14号引脚,其余不变。
#define TFT_DC D2
#define TFT_CS 14 //D6 Beetle 2 引脚为D6
#define TFT_RST D3
#define TFT_BL D13 //屏幕引脚
首先包含Blinker.h库文件, 修改auth[] 为点灯科技APP端生成的设备码:
char auth[] = "9372b81fac8c";//点灯科技设备码
参考Blinker的入门教程,在setup函数中初始化Blinker,loop函数中使用Blinker.run()执行。
Blinker.begin(auth,ssid,password);
Blinker.attachHeartbeat(heartbeat); //心跳包
温湿度和APP通讯根据点灯科技教程修改心跳包数据,并在setup函数中注册回调Blinker.attachHeartbeat(heartbeat)实现定时和APP端通讯传输相关数据。
void heartbeat(){
Number1.print(humi_read);
Number2.print(temp_read);
}
三、功能展示及说明
编译上传到开发板之后,通过type-C供电线供电,屏幕可显示当前温湿度信息、设备IP地址、时间、继电器通断状态state(屏幕显示信息刷新频率通过最后的延迟设置,目前为3-4秒一次):
并可每分钟通过Blinker心跳包同步数据到点灯科技APP中显示:
四、对本活动的心得体会
基于Arduino系列开发板的项目开发起来还是比较简单的, 尤其对于没有基础的人员来讲很友好,官方wiki和各个论坛上类似的项目案例和教程可十分方便进行移植。很不错!