目录

  • 项目总览
    • 元器件清单
    • 接线方式
    • 用到的网站与API
    • 显示屏部分
      • 屏幕文档介绍
      • 屏幕文字图像取模
      • 添加字库方法(中文英文通用)
    • 程序总览
    • 完整工程下载地址

项目总览

先上图,看效果!
该项目主要是通过esp8266-12e连接wifi获取心知天气数据和苏宁时间api,通过解析json代码得到数据,然后通过e-paper墨水屏显示出来,本项目基于墨水屏例程,添加了部分中文字体以及天气图标,通过文字取模软件对图标和文字进行了编码与取模。


元器件清单

  1. 主控板:esp8266-12e nodemcu
  2. 显示屏:heltec1.54inch e-link display的高亮样式** 进行展示;
  3. 杜邦线,usb线;

接线方式

  • D/C–>D2
  • SDI–>D7
  • CS–>D8
  • CLK–>D5
  • BUSY–>D1
  • VCC–>D0(一定要保证3.3v)
  • GND–>GND

用到的网站与API

  1. 心知天气:https://www.seniverse.com/
  • 天气解析获取三天天气地址:
    http://api.seniverse.com/v3/weather/daily.json?key=YOUR EY&location=jinan&language=zh-Hans&unit=c
  • 记得修改标记位置,分别是心知天气私钥和城市代码
  • 私钥获取方式>>官网注册>>购买免费版>>控制台>>添加私钥
    获取到的json代码块示例
{"results": [{"location": {"id": "WWE0TGW4PX6N","name": "济南","country": "CN","path": "济南,济南,山东,中国","timezone": "Asia/Shanghai","timezone_offset": "+08:00"},"daily": [{"date": "2021-08-14","text_day": "晴","code_day": "0","text_night": "晴","code_night": "1","high": "30","low": "21","rainfall": "1.2","precip": "0.34","wind_direction": "东","wind_direction_degree": "90","wind_speed": "23.4","wind_scale": "4","humidity": "66"},{"date": "2021-08-15","text_day": "多云","code_day": "4","text_night": "多云","code_night": "4","high": "31","low": "21","rainfall": "1.2","precip": "0.34","wind_direction": "东北","wind_direction_degree": "45","wind_speed": "8.4","wind_scale": "2","humidity": "66"},{"date": "2021-08-16","text_day": "多云","code_day": "4","text_night": "多云","code_night": "4","high": "31","low": "21","rainfall": "1.2","precip": "0.35","wind_direction": "无持续风向","wind_direction_degree": "","wind_speed": "3.0","wind_scale": "1","humidity": "71"}],"last_update": "2021-08-14T08:00:00+08:00"}]
}
  1. 苏宁时间api:http://quan.suning.com/getSysTime.do
  • 获取到的代码块示例
{"sysTime2": "2021-08-15 11:34:54","sysTime1": "20210815113454"
}
  1. arduinojson:https://arduinojson.org/assistant/
  • 主要是用来esp8266解析获取到的网页数据
  • 注意选择v5版本
  • 示例:需要解析的数据
{"sysTime2": "2021-08-15 11:34:54","sysTime1": "20210815113454"
}
  • 解析后的代码
const size_t capacity = JSON_OBJECT_SIZE(2) + 60;
DynamicJsonBuffer jsonBuffer(capacity);const char* json = "{\"sysTime2\":\"2021-08-15 11:34:54\",\"sysTime1\":\"20210815113454\"}";JsonObject& root = jsonBuffer.parseObject(json);const char* sysTime2 = root["sysTime2"]; // "2021-08-15 11:34:54"
const char* sysTime1 = root["sysTime1"]; // "20210815113454"

只需要将const char* json = 注释掉,然后将json改为通过http获取到的字符串就可以了。

显示屏部分

屏幕文档介绍

https://heltec.org/project/154-e-ink/
通信协议:

  • 三线spi:CLK+SDI+CS
  • DC引脚+BUSY引脚

供电电压:

  • 3.3v (高电压或低电压都会造成乱码显示)

屏幕分辨率(1.54英寸黑白墨水屏):

  • 200像素*200像素

屏幕文字图像取模

取模软件:PCtoLCD2002完美版

取模方式

  • 取模选项

  • 取模示例:

    如何理解:
    每一行代表了像素点的位置,14号字体,宽度14像素,高度14像素,一共14行,每一行是两个8为16进制数,最大可以表示16号字。
    若需要表示更大的字,值需要在每一行加一个16进制数即可,依然是每一行表示对应的像素点位置。

{0x02,0x00,
0x02,0x00,
0x05,0x00,
0x08,0x80,
0x14,0x40,
0x22,0x20,
0xC2,0x18,
0x00,0x00,
0x3F,0xC0,
0x00,0x40,
0x00,0x80,
0x00,0x80,
0x01,0x00,
0x02,0x00},/*"今",0*/
  • 对应程序中的函数:
    paint.DrawCharAt(120, 0, ’ '+9, &Fontzh14, COLORED);//今
    第一、二个参数是打印位置x,y
    第三个参数代表‘ ’字符加上第几个元素,因为函数是从‘ ’开始检索的
    第四个参数用来选择字号,需要用对应的font.c文件,还需要再font.h文件中进行结构体声明
    第五个参数用来选择打印颜色,colored即为前景色,黑色

此函数与打印ascii码的函数通用,需要显示中文只需要改动对应字库即可

添加字库方法(中文英文通用)

  • 首线复制一份font.c文件并重新命名

  • 然后在文件中修改对应变量名,根据字号修改字符宽度和高度

  • 在font.h文件重新声明变量

程序总览

  1. 程序头文件
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include <SPI.h>
#include "epd1in54_V2.h"
#include "epdpaint.h"
#include "imagedata.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>  //版本为V5版本,最新的版本不适用下面的代码
  1. 程序变量常量定义
#define COLORED     0
#define UNCOLORED   1
int today_tianqi[5][2]={18,20,/*晴*/17,29,/*阴*/19,14,/*大雨*/15,16,/*多云*/13,14/*小雨*/};
int yearn,monthn,dayn;
int tianqinum[5]={0,0,0,0,0};
int getxingqi(int years,int months,int day);
String now_address="",now_weather="",now_temperature="",now_temperature_low="",now_day="",now_time="";//用来存储报文得到的字符串
String now_address_1="",now_weather_1="",now_temperature_1="",now_temperature_1_low="",now_day_1="";//用来存储报文得到的字符串
String now_address_2="",now_weather_2="",now_temperature_2="",now_temperature_2_low="",now_day_2="",now_weather_3="",now_weather_4="";//用来存储报文得到的字符串
String GetUrl;
String response;
char* strCat = "";
const char* ssid = "PandoraBox-2.4G-923A97"; // 你的WiFi账号
const char* password = "790338372"; // 你的WIFI密码
unsigned char image[1024];
unsigned long time_start_ms;
unsigned long time_now_s;
int today_day=0;
int tianqi_now=0;
HTTPClient http;  //开始登陆 获取天气
HTTPClient https;  //开始登陆 获取时间
Paint paint(image, 0, 0);
Epd epd;
  1. 初始化函数
void setup() {get_WIFI();get_WIFI();SPI.pins(CLK_PIN,MISO,SDI_PIN,CS_PIN);SPI.begin();Serial.begin(115200);if (epd.Init() != 0) {Serial.print("e-Paper init failed");return;}epd.ClearFrameMemory(0xFF);   // bit set = white, bit reset = blackepd.DisplayFrameFull();Serial.println("e-Paper SetFrameMemory");time_start_ms = millis();
}
  1. 主循环
void loop() {get_weather();Serial.println("tianqi:");Serial.println(tianqinum[0]);Serial.println(tianqinum[1]);Serial.println(tianqinum[2]);Serial.println("now_address:");Serial.println(now_address);Serial.println("天气:");Serial.println(now_weather);Serial.println("温度:");Serial.println(now_temperature);setscreen();delay(10000);
}
  1. wifi链接

void get_WIFI()
{Serial.begin(115200);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) { //等待wifi连接delay(500);Serial.print(".."); //重复打印 "Connecting..",直到连接成功}Serial.println(" ");Serial.println("Connected to ");Serial.println(ssid);Serial.println("IP address: ");Serial.println(WiFi.localIP());
}
  1. 获取网络天气与时间数据
void get_weather()
{if (WiFi.status() == WL_CONNECTED) { //如果 Wi-Fi 连接成功//此处往下是取得实况天气的程序//心知API的网址,记得修改自己的密码!!!!!!!//心知API的网址,记得修改自己的城市!!!!!!!//心知API获取未来三天的天气情况http.begin("http://api.seniverse.com/v3/weather/daily.json?key=SCZyJ9BUkrn8BfPpD&location=jinan&language=zh-Hans&unit=c");int httpget_now = http.GET(); //赋值Serial.println("httpget_now:");Serial.println(httpget_now);if (httpget_now == HTTP_CODE_OK) { //检查一下是否为0,应该是去检查缓存区是否为空Serial.println("that is ok");String respone =  http.getString();Serial.println(respone);/*数据解析:使用 https://arduinojson.org/assistant/ 一个工具可以直接生成程序,挑有用的复制就行*//*记得选v5版本*/const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 3*JSON_OBJECT_SIZE(14) + 820;DynamicJsonBuffer jsonBuffer(capacity);JsonObject& root = jsonBuffer.parseObject(respone);JsonObject& results_0 = root["results"][0];JsonObject& results_0_location = results_0["location"];const char* results_0_location_id = results_0_location["id"]; // "WX4FBXXFKE4F"const char* results_0_location_name = results_0_location["name"]; // "北京"const char* results_0_location_country = results_0_location["country"]; // "CN"const char* results_0_location_path = results_0_location["path"]; // "北京,北京,中国"const char* results_0_location_timezone = results_0_location["timezone"]; // "Asia/Shanghai"const char* results_0_location_timezone_offset = results_0_location["timezone_offset"]; // "+08:00"JsonArray& results_0_daily = results_0["daily"];JsonObject& results_0_daily_0 = results_0_daily[0];const char* results_0_daily_0_date = results_0_daily_0["date"]; // "2021-08-14"const char* results_0_daily_0_text_day = results_0_daily_0["text_day"]; // "阴"const char* results_0_daily_0_code_day = results_0_daily_0["code_day"]; // "9"const char* results_0_daily_0_text_night = results_0_daily_0["text_night"]; // "雷阵雨"const char* results_0_daily_0_code_night = results_0_daily_0["code_night"]; // "11"const char* results_0_daily_0_high = results_0_daily_0["high"]; // "28"const char* results_0_daily_0_low = results_0_daily_0["low"]; // "22"const char* results_0_daily_0_rainfall = results_0_daily_0["rainfall"]; // "1.87"const char* results_0_daily_0_precip = results_0_daily_0["precip"]; // "0.4"const char* results_0_daily_0_wind_direction = results_0_daily_0["wind_direction"]; // "南"const char* results_0_daily_0_wind_direction_degree = results_0_daily_0["wind_direction_degree"]; // "180"const char* results_0_daily_0_wind_speed = results_0_daily_0["wind_speed"]; // "8.4"const char* results_0_daily_0_wind_scale = results_0_daily_0["wind_scale"]; // "2"const char* results_0_daily_0_humidity = results_0_daily_0["humidity"]; // "89"JsonObject& results_0_daily_1 = results_0_daily[1];const char* results_0_daily_1_date = results_0_daily_1["date"]; // "2021-08-15"const char* results_0_daily_1_text_day = results_0_daily_1["text_day"]; // "雷阵雨"const char* results_0_daily_1_code_day = results_0_daily_1["code_day"]; // "11"const char* results_0_daily_1_text_night = results_0_daily_1["text_night"]; // "雷阵雨"const char* results_0_daily_1_code_night = results_0_daily_1["code_night"]; // "11"const char* results_0_daily_1_high = results_0_daily_1["high"]; // "28"const char* results_0_daily_1_low = results_0_daily_1["low"]; // "22"const char* results_0_daily_1_rainfall = results_0_daily_1["rainfall"]; // "7.22"const char* results_0_daily_1_precip = results_0_daily_1["precip"]; // "0.92"const char* results_0_daily_1_wind_direction = results_0_daily_1["wind_direction"]; // "东"const char* results_0_daily_1_wind_direction_degree = results_0_daily_1["wind_direction_degree"]; // "90"const char* results_0_daily_1_wind_speed = results_0_daily_1["wind_speed"]; // "8.4"const char* results_0_daily_1_wind_scale = results_0_daily_1["wind_scale"]; // "2"const char* results_0_daily_1_humidity = results_0_daily_1["humidity"]; // "92"JsonObject& results_0_daily_2 = results_0_daily[2];const char* results_0_daily_2_date = results_0_daily_2["date"]; // "2021-08-16"const char* results_0_daily_2_text_day = results_0_daily_2["text_day"]; // "多云"const char* results_0_daily_2_code_day = results_0_daily_2["code_day"]; // "4"const char* results_0_daily_2_text_night = results_0_daily_2["text_night"]; // "多云"const char* results_0_daily_2_code_night = results_0_daily_2["code_night"]; // "4"const char* results_0_daily_2_high = results_0_daily_2["high"]; // "28"const char* results_0_daily_2_low = results_0_daily_2["low"]; // "21"const char* results_0_daily_2_rainfall = results_0_daily_2["rainfall"]; // "5.94"const char* results_0_daily_2_precip = results_0_daily_2["precip"]; // "0.84"const char* results_0_daily_2_wind_direction = results_0_daily_2["wind_direction"]; // "东南"const char* results_0_daily_2_wind_direction_degree = results_0_daily_2["wind_direction_degree"]; // "135"const char* results_0_daily_2_wind_speed = results_0_daily_2["wind_speed"]; // "3.0"const char* results_0_daily_2_wind_scale = results_0_daily_2["wind_scale"]; // "1"const char* results_0_daily_2_humidity = results_0_daily_2["humidity"]; // "87"const char* results_0_last_update = results_0["last_update"]; // "2021-08-14T08:00:00+08:00"//赋值,因为现在这些变量是在缓存区,一会将被清空now_day=results_0_daily_0_date;now_address=results_0_location_name;   //北京now_weather=results_0_daily_0_text_day;    //晴now_temperature=results_0_daily_0_high;    //19now_temperature_low=results_0_daily_0_low;now_day_1=results_0_daily_1_date;now_address_1=results_0_location_name;   //北京now_weather_1=results_0_daily_1_text_day;    //晴now_temperature_1=results_0_daily_1_high;    //19now_temperature_1_low=results_0_daily_1_low;now_day_2=results_0_daily_2_date;now_address_2=results_0_location_name;   //北京now_weather_2=results_0_daily_2_text_night;    //晴now_temperature_2=results_0_daily_2_high;    //19now_temperature_2_low=results_0_daily_2_low;now_weather_3=results_0_daily_2_text_day;    //晴now_weather_4=results_0_daily_2_text_night;    //晴String str0 = "晴";String str1 = "阴";String str2 = "大雨";String str3 = "多云";String str4 = "小雨";if(str0==now_weather){tianqinum[0]=0;}else if (str1==now_weather){tianqinum[0]=1;}else if (str2==now_weather){tianqinum[0]=2;}else if (str3==now_weather){tianqinum[0]=3;}else{tianqinum[0]=4;}if(str0==now_weather_1){tianqinum[1]=0;}else if (str1==now_weather_1){tianqinum[1]=1;}else if (str2==now_weather_1){tianqinum[1]=2;}else if (str3==now_weather_1){tianqinum[1]=3;}else{tianqinum[1]=4;}if(str0==now_weather_2){tianqinum[2]=0;}else if (str1==now_weather_2){tianqinum[2]=1;}else if (str2==now_weather_2){tianqinum[2]=2;}else if (str3==now_weather_2){tianqinum[2]=3;}else{tianqinum[2]=4;}if(str0==now_weather_3){tianqinum[3]=0;}else if (str1==now_weather_3){tianqinum[3]=1;}else if (str2==now_weather_3){tianqinum[3]=2;}else if (str3==now_weather_3){tianqinum[3]=3;}else{tianqinum[3]=4;}if(str0==now_weather_4){tianqinum[4]=0;}else if (str1==now_weather_4){tianqinum[4]=1;}else if (str2==now_weather_4){tianqinum[4]=2;}else if (str3==now_weather_4){tianqinum[4]=3;}else{tianqinum[4]=4;}yearn=(now_day[0]-'0')*1000+(now_day[1]-'0')*100+(now_day[2]-'0')*10+(now_day[3]-'0')*1;monthn=(now_day[5]-'0')*10+(now_day[6]-'0');dayn=(now_day[8]-'0')*10+(now_day[9]-'0');today_day=getxingqi(yearn,monthn,dayn);http.end();delay(100);}http.end();https.begin("http://quan.suning.com/getSysTime.do");// 从时间网站获得网页内容int httpCode = https.GET();if (httpCode > 0) {Serial.printf("[HTTP] GET... code: %d\n", httpCode);if (httpCode == HTTP_CODE_OK) {//读取响应内容response = https.getString();Serial.println(response);const size_t capacitys = JSON_OBJECT_SIZE(2) + 60;DynamicJsonBuffer jsonBuffers(capacitys);JsonObject& roots = jsonBuffers.parseObject(response);const char* sysTime2 = roots["sysTime2"]; // "2021-08-15 10:21:34"const char* sysTime1 = roots["sysTime1"]; // "20210815102134"now_time=sysTime1;https.end();delay(100);}} else {Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());}https.end();}
}
  1. 日期转换为星期

int getxingqi(int years,int months,int day)
{int yd, md; // 定义年份和月份代码int dh; // 定义dh为代码和int xin;int yushu1,yushu2;yd = ((years%100)/4 + (years%100))%7;yushu1 = years%4;yushu2 = years%100;if(yushu1 = 0 && yushu2 != 0) // 能被4整除不能被100整除是闰年{if(months == 1){md = 5;}if(months == 2){md = 1;}if(months == 3){md = 2;}if(months == 4){md = 5;}if(months == 5){md = 0;}if(months == 6){md = 3;}if(months == 7){md = 5;}if(months == 8){md = 1;}if(months == 9){md = 4;}if(months == 10){md = 6;}if(months == 11){md = 2;}if(months == 12){md = 4;}xin = (day+md+yd)%7;switch(xin){case 1:return(1);break;case 2:return(2);break;case 3:return(3);break;case 4:return(4);break;case 5:return(5);break;case 6:return(6);break;case 7:return(0);break;}}else{if(months == 1){md = 6;}if(months == 2){md = 2;}if(months == 3){md = 2;}if(months == 4){md = 5;}if(months == 5){md = 0;}if(months == 6){md = 3;}if(months == 7){md = 5;}if(months == 8){md = 1;}if(months == 9){md = 4;}if(months == 10){md = 6;}if(months == 11){md = 2;}if(months == 12){md = 4;}xin = (day+md+yd) % 7;switch(xin){case 1:return(1);break;case 2:return(2);break;case 3:return(3);break;case 4:return(4);break;case 5:return(5);break;case 6:return(6);break;case 7:return(0);break;}}return 0;
}
  1. 屏幕刷新
void setscreen()
{epd.ClearFrameMemory(0xFF);   // bit set = white, bit reset = blackepd.DisplayFrameFull();Serial.println("e-Paper SetFrameMemory");paint.SetRotate(ROTATE_270);paint.SetWidth(15);paint.SetHeight(200);paint.Clear(UNCOLORED);strCat="";sprintf(strCat,"%s             %c%c:%c%c",const_cast<char*>(now_day.c_str()),now_time[8],now_time[9],now_time[10],now_time[11]);paint.DrawStringAt(0, 2, strCat, &Font12, COLORED);epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight());paint.Clear(UNCOLORED);strCat="";paint.DrawFilledRectangle(0, 0, 200, 0, COLORED);sprintf(strCat,"%c%c-%c%c %c%c-%c%c %c%c-%c%c %c%c-%c%c%c%c-%c%c",monthn/10+'0',monthn%10+'0',dayn/10+'0',dayn%10+'0',monthn/10+'0',monthn%10+'0',(dayn+1)/10+'0',(dayn+1)%10+'0',monthn/10+'0',monthn%10+'0',(dayn+2)/10+'0',(dayn+2)%10+'0',monthn/10+'0',monthn%10+'0',(dayn+3)/10+'0',(dayn+3)%10+'0',monthn/10+'0',monthn%10+'0',(dayn+4)/10+'0',(dayn+4)%10+'0');paint.DrawStringAt(0, 2, strCat, &Font12, COLORED);epd.SetFrameMemory(paint.GetImage(), 102, 0, paint.GetWidth(), paint.GetHeight());paint.Clear(UNCOLORED);strCat="";paint.DrawFilledRectangle(0, 15, 200, 15, COLORED);sprintf(strCat," %s.   %s.   %s.   %s.   %s. ",const_cast<char*>(now_temperature.c_str()),const_cast<char*>(now_temperature_1.c_str()),const_cast<char*>(now_temperature_2.c_str()),const_cast<char*>(now_temperature_1_low.c_str()),const_cast<char*>(now_temperature_low.c_str()));paint.DrawStringAt(0, 2, strCat, &Font12, COLORED);epd.SetFrameMemory(paint.GetImage(), 141, 0, paint.GetWidth(), paint.GetHeight());paint.SetWidth(15);paint.SetHeight(200);paint.Clear(UNCOLORED);paint.DrawCharAt(0, 0, ' '+11, &Fontzh14, COLORED);//预paint.DrawCharAt(15, 0, ' '+12, &Fontzh14, COLORED);//报paint.DrawCharAt(120, 0, ' '+9, &Fontzh14, COLORED);//今paint.DrawCharAt(135, 0, ' '+10, &Fontzh14, COLORED);//天paint.DrawCharAt(155, 0, ' '+7, &Fontzh14, COLORED);//星paint.DrawCharAt(169, 0, ' '+8, &Fontzh14, COLORED);//期paint.DrawCharAt(184, 0, ' '+today_day, &Fontzh14, COLORED);//epd.SetFrameMemory(paint.GetImage(), 81, 0, paint.GetWidth(), paint.GetHeight());paint.SetWidth(22);paint.SetHeight(200);paint.Clear(UNCOLORED);paint.DrawCharAt(9, 0, ' '+tianqinum[0], &FontTQ, COLORED);paint.DrawCharAt(49, 0, ' '+tianqinum[1], &FontTQ, COLORED);paint.DrawCharAt(89, 0, ' '+tianqinum[2], &FontTQ, COLORED);paint.DrawCharAt(129, 0, ' '+tianqinum[3], &FontTQ, COLORED);paint.DrawCharAt(169, 0, ' '+tianqinum[4], &FontTQ, COLORED);epd.SetFrameMemory(paint.GetImage(), 118, 0, paint.GetWidth(), paint.GetHeight());paint.Clear(UNCOLORED);paint.DrawCharAt(0, 2, ' '+7, &Fontzh14, COLORED);//星paint.DrawCharAt(15, 2, ' '+8, &Fontzh14, COLORED);//期paint.DrawCharAt(30, 2, ' '+((today_day+1)%7), &Fontzh14, COLORED);//paint.DrawCharAt(89, 0, ' '+tianqinum[1], &FontTQ, COLORED);strCat="";sprintf(strCat,"%s.~%s.",const_cast<char*>(now_temperature_1_low.c_str()),const_cast<char*>(now_temperature_1.c_str()));paint.DrawStringAt(120, 2, strCat, &Font16, COLORED);epd.SetFrameMemory(paint.GetImage(), 157, 0, paint.GetWidth(), paint.GetHeight());paint.Clear(UNCOLORED);paint.DrawCharAt(0, 2, ' '+7, &Fontzh14, COLORED);//星paint.DrawCharAt(15, 2, ' '+8, &Fontzh14, COLORED);//期paint.DrawCharAt(30, 2, ' '+((today_day+2)%7), &Fontzh14, COLORED);///paint.DrawCharAt(89, 0, ' '+tianqinum[2], &FontTQ, COLORED);strCat="";sprintf(strCat,"%s.~%s.",const_cast<char*>(now_temperature_2_low.c_str()),const_cast<char*>(now_temperature_2.c_str()));paint.DrawStringAt(120, 2, strCat, &Font16, COLORED);epd.SetFrameMemory(paint.GetImage(), 178, 0, paint.GetWidth(), paint.GetHeight());paint.SetWidth(64);paint.SetHeight(100);paint.Clear(UNCOLORED);paint.DrawCharAt(0, 0, now_temperature[0]+' '-'0', &Font64, COLORED);paint.DrawCharAt(34, 0, now_temperature[1]+' '-'0', &Font64, COLORED);paint.DrawCharAt(66, 0, ' '+10, &Font64, COLORED);paint.DrawFilledRectangle(99, 0, 99, 64, COLORED);epd.SetFrameMemory(paint.GetImage(), 18, 85, paint.GetWidth(), paint.GetHeight());paint.SetWidth(64);paint.SetHeight(80);paint.Clear(UNCOLORED);paint.DrawCharAt(25, 3, ' '+tianqinum[0], &FontTQ, COLORED);paint.DrawCharAt(25, 28, ' '+today_tianqi[tianqinum[0]][0], &Fontzh14, COLORED);//天气paint.DrawCharAt(40, 28, ' '+today_tianqi[tianqinum[0]][1], &Fontzh14, COLORED);//天气strCat="";sprintf(strCat,"%s.~%s.",const_cast<char*>(now_temperature_low.c_str()),const_cast<char*>(now_temperature.c_str()));paint.DrawStringAt(15, 50, strCat, &Font12, COLORED);epd.SetFrameMemory(paint.GetImage(), 18, 0, paint.GetWidth(), paint.GetHeight());epd.DisplayFrameFull();}
void setup() {get_WIFI();get_WIFI();SPI.pins(CLK_PIN,MISO,SDI_PIN,CS_PIN);SPI.begin();Serial.begin(115200);if (epd.Init() != 0) {Serial.print("e-Paper init failed");return;}epd.ClearFrameMemory(0xFF);   // bit set = white, bit reset = blackepd.DisplayFrameFull();Serial.println("e-Paper SetFrameMemory");time_start_ms = millis();
}

完整工程下载地址

https://download.csdn.net/download/qq_39541326/21090151?spm=1001.2014.3001.5503

ESP8266+1.54英寸e-paper墨水屏物联网时间天气显示相关推荐

  1. CORE-ESP32C3|eink|墨水屏日历+时间日期+温度显示|I2C软件模拟| LuatOS-SOC接口|官方demo|学习(14):墨水屏动态日历+oled日期显示+ AHT10测温模组

    目录 参考博文 源于网友oled+eink+aht10项目 源代码修改及复现说明 主要修改 显示效果 ​编辑硬件准备 软件版本 日志及soc下载工具 软件使用 接线说明 天气显示屏 硬件接线 温度采集 ...

  2. 使用ESP8266驱动微雪e-paer2.13墨水屏

    使用ESP8266驱动微雪e-paer墨水屏 前些时候使用Arduino nona小板子,成功驱动了微雪e-paer2.13墨水屏,但由于Arduino nona小板子内存小.主频低,虽然可以显示,但 ...

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

    非广告,真心推荐:太极创客 太极创客 – Arduino, ESP8266物联网的应用.开发和学习资料http://www.taichi-maker.com/ 项目来源:[开源]教程--4.2寸多功能 ...

  4. 【N32G457】基于RT-Thread和N32G457的墨水屏日历

    本文是RT-Thread用户@xusiwei1236 原创发布,是用于参加RT-Thread与国民技术联手推出N32G457 RT-Thread设计大赛,原文:https://club.rt-thre ...

  5. 【项目分享】基于AB32和RT-Thread的墨水屏智能日历

    基于AB32VG1的墨水屏智能日历 项目背景 本项目是[RT-Thread x RISC-V 应用创新大赛]参赛项目之一,大赛活动页面: RT-Thread X RISC-V 创新应用设计大赛 (el ...

  6. yota3墨水屏调节对比度_双屏手机YOTA3评测:墨水屏能当“Kindle”用,还支持微信!...

    你会如何去看待,一台定位在政商群体的手机呢? 对于这个功能组别不太了解的我,可能会用"离地"来形容这一类产品.总觉得在追求性价比的大环境下,政商定位的手机离我们这些普通用户还是有点 ...

  7. 曲面屏墨水屏显示器!墨水屏手机显示器!北京大上科技发布多款新概念产品

    日前,北京DASUNG大上科技携全新护眼"黑科技"产品再度亮相,发布了全球首款25.3英寸曲面屏墨水屏显示器--Paperlike U与全球首款6.7英寸墨水屏式手机显示器--Li ...

  8. 墨水屏(电子纸)的介绍与使用(附STM32程序~~~)

    电子墨水屏又被称为电子纸显示技术.电子纸显示技术(简称EPD),由美国麻省理工大学教授约瑟夫.雅各布森及其研发团队,经历30余年研发成功. 墨水屏的原理很简单,电子墨水屏是由许多电子墨水组成,电子墨水 ...

  9. yota3墨水屏设置_国产墨水屏“手写平板”评测,10.3英寸大屏,支持无纸化办公...

    随着电子产品的普及,无纸化办公已经成为了一种趋势,手机和平板设备都存在的一个弊端,就是无法获得纸笔书写的体验.听朋友介绍,了解了几款支持手写的电纸书产品,想着平时办公能够写写画画,休闲的时候还可以看看 ...

最新文章

  1. 博客 rss 如何使用_如何使用RSS从您的GatsbyJS博客自动交叉发布
  2. 看下Linux 如何查看端口占用情况
  3. 考考你:输入数字,判定空格和回车
  4. 上帝视角任意切换:三维重建和图像渲染是怎么结合的?
  5. python连接字符串的join
  6. 全国青少年软件编程python等级考试-全国青少年软件编程等级考试:Python一级考试大纲...
  7. hdu3870 基于最短路的最小割
  8. 求正负数交互序列的和的MFC版
  9. Python 实现有道翻译命令行版
  10. android百度地图覆盖物异步加载图片,Android 百度地图marker中图片不显示的解决方法(推荐)...
  11. 【转】Linux操作系统下/etc/hosts文件配置方法
  12. 微信支付配置参数:支付授权目录、回调支付URL
  13. xp搭建 php环境,windows xp 下 LAMP环境搭建
  14. 接口做的好怎么形容_淘宝直播预告怎么做才合格?如何做好?
  15. 戏耍Transaction,多个连接的Transaction处理(非COM+)
  16. C++类占字节数讲解
  17. linux驱动基础开发2——linux 驱动开发前奏(模块编程)-转
  18. java简单增删改查_JAVA JDBC 简单的增删改查
  19. 使用Redis单实例实现分布式锁
  20. 视频教程-CCNA趣味实战无线实验视频课程—含PPPOE、ADSL、CABLE等-思科认证

热门文章

  1. 苹果6p计算机在哪里设置方法,苹果恢复出厂设置在哪里 两种方法设置【图文】...
  2. 从创业和投资角度来看,人工智能和大数据的机会有哪些?
  3. 成都榆熙电子商务有限公司:拼多多月卡都有哪些方式的优惠?
  4. mysql 缓存架构_MySQL架构及SQL的执行流程
  5. Mysql可重复读业务场景_事务可重复读的意义在哪?
  6. access什么意思计算机,Access是什么东东
  7. 双核笔记本电脑软件测试,笔记本电脑,选双核还是四核?.docx
  8. 米联客 ZYNQ/SOC 精品教程 S02-CH25 利用OSD实现双目摄像头字幕叠加
  9. hbase炸了,如何修改
  10. esp8266 css,esp8266 smartconfig-智能配网分析和使用及注意事项