【项目1】多功能墨水屏新闻、天气台历(一)

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

非广告,真心推荐:太极创客

太极创客 – Arduino, ESP8266物联网的应用、开发和学习资料http://www.taichi-maker.com/

项目来源:【开源】教程——4.2寸多功能微雪墨水屏新闻台历gxepd2版本_哔哩哔哩_bilibili


目录

显示效果

esp32

通用驱动板

DHT11

代码部分

GxEPD2_Version_4in2_epd_calendar.ino文件下代码

初始化

主函数

定义部分

Webserver.h关于wifi代码

参数配置

初始化setup()调用的wifi_init()

配网

等待连接

配网模式

setupMode()

对字符串进行URL解码

makePage()

gatData文件关于GetData()函数

CallHttps.ino

JsonWeather.ino和天气相关的数据处理

ParseActualWeather(String content, struct LifeIndex* data)解析生活指数

ParseActualWeather(String content, struct ActualWeather* data)解析实况天气

ParseFutureWeather(String content, struct FutureWeather* data)解析未来天气

JsonHitokoto文件,与一言处理数据相关。

JsonNews文件中新闻数据处理


这个项目看起来不太简单。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值