非广告,真心推荐:太极创客
太极创客 – Arduino, ESP8266物联网的应用、开发和学习资料
http://www.taichi-maker.com/
项目来源:【开源】教程——4.2寸多功能微雪墨水屏新闻台历gxepd2版本_哔哩哔哩_bilibili
目录
GxEPD2_Version_4in2_epd_calendar.ino文件下代码
ParseActualWeather(String content, struct LifeIndex* data)解析生活指数
ParseActualWeather(String content, struct ActualWeather* data)解析实况天气
ParseFutureWeather(String content, struct FutureWeather* data)解析未来天气
这个项目看起来不太简单。
ArduinoJson:ArduinoJson: Efficient JSON serialization for embedded C++
GxEPD2:屏幕驱动库https://github.com/jeason-j/GxEPD2GitHub - ZinggJM/GxEPD2: Arduino Display Library for SPI E-Paper Displays
Timezone:Arduino时区库GitHub - JChristensen/Timezone: Arduino library to facilitate time zone conversions and automatic daylight saving (summer) time adjustments.
U8g2:图形库Home · olikraus/u8g2 Wiki · GitHub
U8g2_for_Adafruit_GFX.h:joe/U8g2_for_Adafruit_GFX
Dht11:这个方面库很多,随便搜搜吧。没找到参考文档之类的。
显示效果

啧~违规,拉倒吧!GitHub - zhushengji/GxEPD2_Version_4in2_epd_calendar: 基于GXEPD2库文件开发的通用版多功能墨水屏台历
esp32

图片来源:ESP32 GPIO_我不想35岁失业的博客-CSDN博客_esp32 gpio
通用驱动板
说实话,按照作者的说法没找到。但是在立创开源社区有许多大佬画的板子。基本相仿,按照接线规则连接即可。
DHT11
DHT11接到GPIO21
由displayCode文件可知引脚连接到
/*温度*/
dht11 DHT11;
void gettem(){
DHT11.read(21);
String temperature=String(DHT11.temperature)+"℃";
String humidity = String(DHT11.humidity)+"%";
u8g2Fonts.setFont(chinese_city_gb2312);
u8g2Fonts.setForegroundColor(GxEPD_BLACK); // 设置前景色
u8g2Fonts.setBackgroundColor(GxEPD_WHITE); // 设置背景色
u8g2Fonts.setCursor(272,222);
u8g2Fonts.print("室内");
display.drawInvertedBitmap(312, 210, wendu, 16, 16, GxEPD_BLACK);//画图
u8g2Fonts.setCursor(330,222);
u8g2Fonts.print(temperature);
display.drawInvertedBitmap(358, 210, shidu, 16, 16, GxEPD_BLACK);//画图
u8g2Fonts.setCursor(376,222);
u8g2Fonts.print(humidity);
}
余下还有电池等外围电路与控制无关,不做分析。
代码部分
GxEPD2_Version_4in2_epd_calendar.ino文件下代码
初始化
void setup()
{
Serial.begin(115200); //串口波特率
EEPROM.begin(4096); //申请size内存
display.init(); //display初始化
u8g2Fonts.begin(display);//将u8g2连接到display
display.firstPage(); //firstPage方法会把当前页码位置变成0
display.display(1); //延时
wifi_init(); //wifi初始化
}
主函数
void loop() {
/*后台配置*/
if (settingMode) { //Webserver.h中定义,配置网络的问题
dnsServer.processNextRequest();
}
webServer.handleClient();
if (!settingMode) {
GetData(); //获取Json数据 //定义在gatData
initNTP(); //初始化时间 //定义在NTP.h
display.fillScreen(GxEPD_WHITE); //初始化屏幕
get_weather(); //获取天气 //定义在displayCode
updatetime(); //时间 //定义在displayCode
hitokoto(); //一言 //定义在displayCode
newsdisplay(); //新闻 //定义在displayCode
gettem(); //温湿度 //定义在displayCode
udc++; //计数 //心知天气免费20次每分钟
display.nextPage();
/* 1.轻度休眠会关闭WiFi蓝牙以降低功耗,所以唤醒后需要重新联网
* 2.之所以不用功耗更低的深度休眠,因为深度休眠只保留RTC,内存
* 中的数据会丢失
* 3.休眠函数中时间单位是微秒,所以数据要X1000000
*/
//轻度休眠有概率导致连不上网
/*esp_sleep_enable_timer_wakeup(300000000);//5分钟刷新一次
esp_light_sleep_start();
delay(1000);
wifi_init();//休眠后需要重新联网*/
delay(300000);//5分钟更新一次
}
/*深度睡眠会导致内存中数据丢失让新闻切换出问题,故弃用
* esp_sleep_enable_timer_wakeup(20000000);
* esp_deep_sleep_start();
*/
}
初始化和主函数看起来都不难理解。
定义部分
定义要统一格式啊!为什么不统一格式!
统一格式增加可读性!!!
#include <U8g2_for_Adafruit_GFX.h>
#include <GxEPD2_3C.h>
#include <ArduinoJson.h>
#include <Timezone.h>
GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW042Z15
#include "gb2312.c"
#include "imagedata.h"
#include "Webserver.h"
#include "NTP.h"
#include <dht11.h>
extern const uint8_t chinese_city_gb2312[239032] //这么多,真占内存 U8G2_FONT_SECTION("chinese_city_gb2312"); //国标2312
/* 自己写代码喜欢这样,看别人代码就不喜欢这样 */
U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;
//****** HTTP服务器配置 ******
String language = "zh-Hans"; // 请求语言
String url_yiyan = "https://v1.hitokoto.cn/";//一言获取地址
String url_ActualWeather; //实况天气地址
String url_FutureWeather; //未来天气地址
//****** 天气数据
//我们要从此网页中提取的数据的类型
//定义结构体
struct ActualWeather
{
char status_code[64]; //错误代码
char city[16]; //城市名称
char weather_name[16]; //天气现象名称
char weather_code[4]; //天气现象代码
char temp[5]; //温度
char last_update[25]; //最后更新时间
};
ActualWeather actual; //创建结构体变量 目前的
//未来天气
struct FutureWeather
{
char status_code[64]; //错误代码
char date0[14]; //今天日期
char date0_text_day[20]; //白天天气现象名称
char date0_code_day[4]; //白天天气现象代码
char date0_text_night[16]; //晚上天气现象名称
char date0_code_night[4]; //晚上天气现象代码
char date0_high[5]; //最高温度
char date0_low[5]; //最低温度
char date0_humidity[5]; //相对湿度
char date0_wind_scale[5]; //风力等级
char date1[14]; //明天日期
char date1_text_day[20]; //白天天气现象名称
char date1_code_day[4]; //白天天气现象代码
char date1_text_night[16]; //晚上天气现象名称
char date1_code_night[4]; //晚上天气现象代码
char date1_high[5]; //最高温度
char date1_low[5]; //最低温度
//char date1_humidity[5]; //相对湿度
char date2[14]; //后天日期
char date2_text_day[20]; //白天天气现象名称
char date2_code_day[4]; //白天天气现象代码
char date2_text_night[16]; //晚上天气现象名称
char date2_code_night[4]; //晚上天气现象代码
char date2_high[5]; //最高温度
char date2_low[5]; //最低温度
//char date2_humidity[5]; //相对湿度
};
FutureWeather future; //创建结构体变量 未来
struct LifeIndex //生活指数
{
char status_code[64]; //错误代码
char uvi[10]; //紫外线指数
};
LifeIndex life_index; //创建结构体变量 未来
struct News //新闻API
{
char status_code[64]; //错误代码
char title[11][64]; //作者规划只显示11行
};
News xinwen; //创建结构体变量 新闻
struct Hitokoto //一言API
{
char status_code[64]; //错误代码
char hitokoto[64];
};
Hitokoto yiyan; //创建结构体变量 一言
//****** 一些变量 ******
String webServer_news = " ";
uint8_t client_count = 0; //连接服务器的超时计数,暂未使用
uint8_t client_error = 0; //错误代码,暂未使用
boolean night_updated = 1; //夜间更新 1-不更新 0-更新
//RTC临时数据
#define RTC_hour_dz 0 //小时地址
#define RTC_night_count_dz 1 //夜间计数地址
#define RTC_peiwang_state_dz 2 //配网状态地址
uint32_t RTC_hour = 100; //小时
uint32_t RTC_night_count = 0; //24-6点,夜间不更新计数
int32_t night_count_max = 0; //需要跳过几次
uint32_t RTC_peiwang_state = 0; //配网状态 1-需要
//int daydate;//当天日期
int udc=0;//更新次数记录 //在loop函数里++
Webserver.h关于wifi代码
wifi_init()函数在Webserver.h

该项目使用Arduino ESP32和GxEPD2库构建了一个物联网设备,显示4.2寸墨水屏上的天气、新闻、一言等信息。代码涉及WiFi配置、HTTP请求、JSON数据解析和屏幕驱动,实现信息实时更新。项目中还包括了温湿度传感器DHT11的使用,以及轻度休眠以降低功耗。
&spm=1001.2101.3001.5002&articleId=124586018&d=1&t=3&u=bf695e06f6ed49848eec0d5715f04bbe)
6449

被折叠的 条评论
为什么被折叠?



