ili9431液晶 tft_espi图形库演示 时钟、天气、滚动、气象图标

米思齐tft_spi模块库演示程序。心知天气、阿里云时钟、WiFi信号强度检测、1分钟滚屏、更新天气时间为15分钟、加入天气图标。更新天气次数。断网检测 。此程序为tft_eSPI图形库演示、如感觉好可以自行优化。

ili9431tft_espi库是用于ESP32和ESP8266芯片的TFT LCD驱动程序库,可用于控制ILI9341和ILI9431 TFT显示屏。以下是配置ili9431tft_espi库的步骤:

  1. 下载并安装Arduino IDE。

  2. 在Arduino IDE中,导航到“文件”>“首选项”>“附加开发板管理器网址”并输入以下网址:

    https://dl.espressif.com/dl/package_esp32_index.json,http://arduino.esp8266.com/stable/package_esp8266com_index.json

  3. 点击“确定”按钮,关闭“首选项”窗口。

  4. 导航到“工具”>“开发板”>“开发板管理器”。

  5. 在搜索栏中输入“ESP32”或“ESP8266”,然后选择相应的开发板并安装。

  6. 连接ILI9341或ILI9431 TFT显示屏到ESP32或ESP8266芯片。

  7. 在Arduino IDE中,打开一个示例程序(例如:ILI9431test)。

  8. 在示例程序中,确保指定正确的引脚连接和显示屏类型:

    #define TFT_DC 15
    #define TFT_CS 14
    #define TFT_RST -1
    #define TFT_MOSI 23
    #define TFT_CLK 18
    #define TFT_MISO -1

    ESP_ILI9341 tft = ESP_ILI9341(TFT_CS, TFT_DC, TFT_RST, TFT_MOSI, TFT_CLK, TFT_MISO);

  9. 上传示例程序到开发板。

  10. 测试ILI9341或ILI9431 TFT显示屏是否能够正常工作。

程序图 mixly1.20版本,其它版本未测

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码如下:

#include <zh_font20.h>
#include <FxLED_32.h>
#include <weathz.h>
#include <textmatrix.h>
#include <SPI.h>
#include <TFT_eSPI.h>
#include <ESP8266WiFi.h>
#include <TimeLib.h>
#include <NtpClientLib.h>
#include <TJpg_Decoder.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>volatile int shu;
volatile int start_xz;
volatile unsigned long dingshi_xz;
volatile unsigned long now_xz;
volatile int code_day;
volatile int code_ye;
volatile bool clear;
int8_t timeZone = 8;
const PROGMEM char *ntpServer = "ntp1.aliyun.com";char x_map[4] = "" ;
char x_night[12] = "" ;
char code_night[4] = "" ;
char x_day[12] = "" ;
char iconday[4] = "" ;
char x_wdhigh[6] = "" ;
char x_wdlow[6] = "" ;
char x_humidity[5] = "" ;
char x_wind_direction[20] = "" ;
char x_direction_degree[5] = "" ;
char x_scale[3] = "" ;
char x_speed[5] = "" ;
char x_rainfall[6] = "" ;
char x_precip[6] = "" ;
TFT_eSPI tft = TFT_eSPI();
bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap)
{if (y >= tft.height()) return 0;tft.pushImage(x, y, w, h, bitmap);return 1;
}void dispaly_clear() {if (clear == false) {tft.fillScreen(TFT_BLACK);clear = true;}
}void nowifi() {int num = 0;while (!(WiFi.status() == WL_CONNECTED)) {dispaly_clear();tft.drawRect(28,98,180,11,TFT_WHITE);tft.fillRect(30,100,num,7,TFT_YELLOW);tft.loadFont(zh_font20);tft.setCursor(70,120);tft.setTextColor(TFT_GREEN,TFT_BLACK);tft.println("网络失败!!");tft.setCursor(60,150);tft.print("请配置网络!!!");tft.unloadFont();//卸载字库占用内存delay(80);num++;if (num >= 178) {num = 0;tft.fillScreen(TFT_BLACK);}if (WiFi.status() == WL_CONNECTED == 1) {tft.fillScreen(TFT_BLACK);break;}}
}void shibai() {tft.fillScreen(TFT_BLACK);tft.loadFont(zh_font20);tft.setCursor(30,120);tft.setTextColor(TFT_PURPLE,TFT_BLACK);tft.print("请配置 wifi  网络");tft.unloadFont();//卸载字库占用内存
}String getzhenshu(int zhs) {String s = "";if (zhs < 10) {s = String("0") + String(zhs);} else {s = zhs;}return s;
}uint8_t getwifiriis() {uint32_t db = WiFi.RSSI();if (db <= -100) {return 0;} else if (db >= -50) {return 100;} else {return (2 * (db + 100));}return db;
}String getday_yyr() {String s = "";s = String(NTP.getDateYear()) + String("年") + String(getzhenshu(NTP.getDateMonth())) + String("月") + String(getzhenshu(NTP.getDateDay())) + String("日");return s;
}String gettime_m() {String s = "";s = String(getzhenshu(NTP.getTimeSecond()));return s;
}String gettime_hf() {String s = "";s = String(getzhenshu(NTP.getTimeHour24())) + String(":") + String(getzhenshu(NTP.getTimeMinute()));return s;
}String getweek() {String s = "";switch (NTP.getDateWeekday()) {case 1:s = "星期一";break;case 2:s = "星期二";break;case 3:s = "星期三";break;case 4:s = "星期四";break;case 5:s = "星期五";break;case 6:s = "星期六";break;case 7:s = "星期日";break;default:break;}return s;
}TFT_eSprite spr = TFT_eSprite(&tft);
TFT_eSprite clk = TFT_eSprite(&tft);
void tft_weathr() {tft.setTextColor(TFT_SILVER ,TFT_BLACK);tft.setCursor(0,1,1);tft.print(String("up data:") + String(shu));tft.loadFont(zh_font20);tft.setTextColor(TFT_YELLOW,TFT_BLACK);tft.drawString(String("白天:") + String(x_day),1,155);tft.drawString(String("夜间:") + String(x_night),120,155);tft.drawString(String("高温:") + String(String(x_wdhigh) + String("℃")),1,176);tft.drawString(String("低温:") + String(String(x_wdlow) + String("℃")),120,176);tft.drawString(String("湿度:") + String(x_humidity),1,197);tft.drawString(String("等级:") + String(x_scale),120,197);tft.drawString(String("风速:") + String(x_speed),1,218);tft.drawString(String("角度:") + String(x_direction_degree),120,218);tft.drawString(String("雨量:") + String(x_rainfall),1,239);tft.drawString(String("雨概率:") + String(x_precip),120,239);tft.drawString(String("风向:") + String(x_wind_direction),1,260);tft.unloadFont();//卸载字库占用内存TJpgDec.drawJpg(15,96,weatherico(code_day), sizeof(wico10));TJpgDec.drawJpg(130,96,weatherico(code_ye), sizeof(wico10));
}void weathr_up() {// 40分钟更新一次if (millis() - dingshi_xz > 1500000 || start_xz == 0) {dingshi_xz = millis();shu++;String weather;WiFiClient client;HTTPClient http;BearSSL::WiFiClientSecure wificlient;wificlient.setInsecure();http.begin(client,"http://api.seniverse.com/v3/weather/daily.json?key=你的心知天气密钥&location=ip&language=zh-Hans&unit=c&start=0&days=1");int httpCode = http.GET();if (httpCode > 0) {Serial.printf("[HTTP] GET... code: %d", httpCode);Serial.println();if (httpCode == HTTP_CODE_OK) {String payload = http.getString();weather += payload;}}http.end();delay(10);StaticJsonDocument<1024> doc;DeserializationError error = deserializeJson(doc,weather);if (error) {Serial.print(F("deserializeJson() failed: "));Serial.println(error.f_str());return;}JsonObject results_0 = doc["results"][0];;JsonObject results_0_location = results_0["location"];;strcpy(x_map , results_0_location["name"]);JsonObject results_0_daily_0 = results_0["daily"][0];;strcpy(x_day , results_0_daily_0["text_day"]);strcpy(iconday , results_0_daily_0["code_day"]);strcpy(x_night , results_0_daily_0["text_night"]);strcpy(code_night , results_0_daily_0["code_night"]);strcpy(x_wdhigh , results_0_daily_0["high"]);strcpy(x_wdlow , results_0_daily_0["low"]);strcpy(x_humidity , results_0_daily_0["humidity"]);// 风向 东南西北风// 风向文字strcpy(x_wind_direction , results_0_daily_0["wind_direction"]);// 风向角度,范围0~360strcpy(x_direction_degree , results_0_daily_0["wind_direction_degree"]);// 风力等级strcpy(x_scale , results_0_daily_0["wind_scale"]);// 风速/mstrcpy(x_speed , results_0_daily_0["wind_speed"]);// 降水量,0.00 单位mmstrcpy(x_rainfall , results_0_daily_0["rainfall"]);// 降水量,0.00 单位mmstrcpy(x_precip , results_0_daily_0["precip"]);tft.fillScreen(TFT_BLACK);start_xz = 1;if (NTP.getTimeHour24() == 0) {shu = 0;}}
}void time_man() {clk.setColorDepth(8);clk.loadFont(zh_font20);clk.createSprite(140,21);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_YELLOW,TFT_BLACK);clk.drawString((getday_yyr()),68,11);clk.pushSprite(50,14);clk.deleteSprite();clk.unloadFont();clk.setColorDepth(8);clk.setTextFont(7);clk.createSprite(135,48);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_GREEN,TFT_BLACK);clk.drawString((gettime_hf()),67,24);clk.pushSprite(20,42);clk.deleteSprite();clk.unloadFont();clk.setColorDepth(8);clk.loadFont(zh_font20);clk.createSprite(61,21);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_WHITE,TFT_BLACK);clk.drawString((getweek()),30,11);clk.pushSprite(173,40);clk.deleteSprite();clk.unloadFont();clk.setColorDepth(8);clk.loadFont(FxLED_32);clk.createSprite(38,30);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_ORANGE,TFT_BLACK);clk.drawString((gettime_m()),19,16);clk.pushSprite(160,59);clk.deleteSprite();clk.unloadFont();
}void wifi_riis() {spr.setColorDepth(8);spr.createSprite(10,10);spr.fillSprite(TFT_BLACK);spr.setTextDatum(CC_DATUM);for(int i = 0;i<4;i ++){for(int j = 0;j<(2 * (i + 1));j++){if (getwifiriis() > i * 25 || j == 0) {spr.drawPixel((2 + 2 * i),(8 - j),TFT_GREEN);}}}spr.pushSprite(231,1);spr.deleteSprite();clk.setColorDepth(8);clk.setTextFont(1);clk.createSprite(22,10);clk.fillSprite(TFT_BLACK);clk.setTextDatum(CC_DATUM);clk.setTextColor(TFT_WHITE,TFT_BLACK);clk.drawString(String(((String)(getwifiriis()))) + String("%"),11,5);clk.pushSprite(207,1);clk.deleteSprite();clk.unloadFont();
}void setup(){shu = 0;start_xz = 0;dingshi_xz = 0;now_xz = 0;code_day = 0;code_ye = 0;clear = false;Serial.begin(9600);tft.begin();tft.setRotation(0);tft.fillScreen(TFT_BLACK);tfts.init();setupScrollArea(TOP_FIXED_AREA, BOT_FIXED_AREA);WiFi.mode(WIFI_STA);int cnt = 0;while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");if (cnt++ >= 10){WiFi.beginSmartConfig();while (1) {delay(1000);if (WiFi.smartConfigDone()) {Serial.println();Serial.println("SmartConfig: Success");break;}Serial.print("|");shibai();//无判断条件:可不创建函数。加判断条件:请创建shibai();。}}}WiFi.printDiag(Serial);Serial.println(WiFi.localIP());Serial.println("网络配置成功。可以上网啦!");NTP.setInterval (600);NTP.setNTPTimeout (1500);NTP.begin (ntpServer, timeZone, false);TJpgDec.setJpgScale(1);TJpgDec.setSwapBytes(true);TJpgDec.setCallback(tft_output);}void loop(){code_day = atoi(iconday);code_ye = atoi(code_night);nowifi();wifi_riis();weathr_up();time_man();tft_weathr();clear = false;if (String((gettime_m())).equals(String("00"))) {scroll_slow(62,30);}}

效果演示

在这里插入图片描述

#include <zh_font20.h> //自制中文字库

#include <FxLED_32.h>//段码时间小字库

#include <weathz.h> //气象图标

#include <textmatrix.h>//滚屏

#include <TJpg_Decoder.h>//图片库

如用arduino IDE需将上边库文件放到一个文件夹下即可编译。

如用mixly 米思齐编译器 上边文件必须放在这安装目录下。如:D:\Mixly1.20back\arduino\portable\sketchbook\libraries\Fonts 。Fonts这为新建文件夹名字。

在这里插入图片描述

总之比较麻烦,按步骤操作。打包送喜欢爱折腾的你。

注意这里: http.begin(client,“http://api.seniverse.com/v3/weather/daily.json?key=你的心知天气密钥&location=ip&language=zh-Hans&unit=c&start=0&days=1”);

下载地址:https://download.csdn.net/download/lnwqh/88388748

有问题可以私信或留言,没事点点赞或留个言多交流。哈哈哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023版 STM32实战6 输出比较(PWM)包含F407/F103方式

输出比较简介和特性 -1-只有通用/高级定时器才能输出PWM -2-占空比就是高电平所占的比例 -3-输出比较就是输出不同占空比的信号 工作方式说明 -1-1- PWM工作模式 -1-2- 有效/无效电平 有效电平可以设置为高或低电平&#xff0c;是自己配置的 周期选择与计算 周期重…

安卓教材学习

文章目录 教材学习第一行代码 Android 第3版环境配置gradle配置下载包出现问题 教材学习 摘要&#xff1a;选了几本教材《第一行代码 Android 第3版》&#xff0c;记录一下跑案例遇到的问题&#xff0c;和总结一些内容。 第一行代码 Android 第3版 环境配置 gradle配置 gradl…

UGUI交互组件Toggle

一.Toggle对象的构造 Toggle和Button类似&#xff0c;是交互组件的一种 如果所示&#xff0c;通过菜单创建了两个Toggle&#xff0c;Toggle2中更换了背景和标记资源 对象说明Toggle含有Toggle组件的对象Background开关背景Checkmark开关选中标记Label名称文本 二.Toggle组件属…

力扣 -- 377. 组合总和 Ⅳ

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int combinationSum4(vector<int>& nums, int target) {int nnums.size();vector<double> dp(target1);//初始化dp[0]1;//填表for(int i1;i<target;i){for(int j0;j<n;j){//填表if(…

解密京东面试:如何应对Redis缓存穿透?

亲爱的小伙伴们&#xff0c;大家好&#xff01;欢迎来到小米的微信公众号&#xff0c;今天我们要探讨一个在面试中可能会遇到的热门话题——Redis缓存穿透以及如何解决它。这个话题对于那些渴望进入技术领域的小伙伴们来说&#xff0c;可是必备的哦&#xff01; 认识Redis缓存…

C++设计模式-原型(Prototype)

目录 C设计模式-原型&#xff08;Prototype&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-原型&#xff08;Prototype&#xff09; 一、意图 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 二、适用性 当…

springmvc中DispatcherServlet关键对象

以下代码为 spring boot 2.7.15 中自带的 spring 5.3.29 RequestMappingInfo 请求方法相关信息封装&#xff0c;对应的信息解析在 RequestMappingHandlerMapping 的 createRequestMappingInfo() 中实现。 对于 RequestMapping 赋值的相关信息进行解析 protected RequestMappi…

网课搜题 小猿题库多接口微信小程序源码 自带流量主

多接口小猿题库等综合网课搜题微信小程序源码带流量主&#xff0c;网课搜题小程序, 可以开通流量主赚钱 搭建教程1, 微信公众平台注册自己的小程序2, 下载微信开发者工具和小程序的源码3, 上传代码到自己的小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_…

set和map的封装

目录 介绍 红黑树代码 set insert的迭代器转换问题 为什么会有这样的问题? 如何解决 代码 map 注意点 代码 介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map 红黑树代码 #pragma once#include <…

力扣 -- 873. 最长的斐波那契子序列的长度

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int lenLongestFibSubseq(vector<int>& nums) {int nnums.size();unordered_map<int,int> hash;for(int i0;i<n;i){hash[nums[i]]i;}int ret2;vector<vector<int>> dp(n,v…

beego-简单项目写法--路径已经放进去了

Beego案例-新闻发布系统 1.注册 后台代码和昨天案例代码一致。,所以这里面只写一个注册的业务流程图。 **业务流程图 ** 2.登陆 业务流程图 登陆和注册业务和我们昨天登陆和注册基本一样&#xff0c;所以就不再重复写这个代码 但是我们遇到的问题是如何做代码的迁移&…

Vue中如何进行移动端手势操作

当开发移动端应用程序时&#xff0c;手势操作是提高用户体验的关键部分之一。Vue.js是一个流行的JavaScript框架&#xff0c;它提供了一种简单而强大的方式来实现移动端手势操作。本文将介绍如何在Vue.js中进行移动端手势操作&#xff0c;包括基本手势&#xff0c;如点击、滑动…

nodejs+vue中医体质的社区居民健康管理系统elementui

可以实现首页、中医体质量表、健康文章、健康视频、我的等&#xff0c;在我的页面可以对医生、小区单元、医疗药品等功能进行操作。目前主要的健康管理系统是以西医为主&#xff0c;而为了传扬中医文化&#xff0c;提高全民健康意识&#xff0c;解决人民日益增长的美好生活需要…

NPDP产品经理知识(产品创新流程)

1.复习组合管理: 组合管理的目标 ===> 价值最大化,项目平衡,战略一致,管道平衡(资源需求和供给),盈利充分 (实现财务目标) 产品创新流程就是管理风险的过程。 模糊前端: 产品创新章程:PIC 包含 =====> 背景,聚焦舞台,目标和目的,特别准则,可持续性 新产…

复习 --- 消息队列

进程间通信机制(IPC) 简述 IPC&#xff1a;Inter Process Communication 进程和进程之间的用户空间相互独立&#xff0c;但是4G内核空间共享&#xff0c;进程间的通信就是通过这4G的内核空间 分类 传统的进程间通信机制 无名管道&#xff08;pipe&#xff09; 有名管道&…

归并排序含非递归版

目录 1.归并排序的原理 2.实现归并排序 2.1框架 2.2区间问题和后序遍历 2.3归并并拷贝 2.4归并排序代码 2.5测试 3.非递归实现归并排序 3.1初次实现 3.2测试 3.3修改 3.4修改测试 1.归并排序的原理 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治…

Python 列表推导式深入解析

Python 列表推导式深入解析 列表推导式是 Python 中的一种简洁、易读的方式&#xff0c;用于创建列表。它基于一个现有的迭代器&#xff08;如列表、元组、集合等&#xff09;来生成新的列表。 基本语法&#xff1a; 列表推导式的基本形式如下&#xff1a; [expression for…

EM聚类(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

【uniapp+vue3+ts】请求函数封装,请求和上传文件拦截器

1、uniapp 拦截器 uni.addInterceptor(STRING,OBJECT) 拦截器中包括基础地址、超时时间、添加请求头标识、添加token utils文件夹下新建http.ts 拦截uploadFile文件上传&#xff0c;rquest请求接口 cosnt baseUrl xxxx// 添加拦截器 const httpInterceptor {//拦截前触发i…

来聊一聊独热码检测

国庆假期不小心扭伤了脚踝&#xff0c;在家没事看到一篇文章挺有意思&#xff0c;于是写出来分享给大家。 这是一道数字电路面试题&#xff0c;也是很多面试官很喜欢考察面试者的一道题目&#xff0c;题干很简单&#xff1a;给定一个4bit的信号A&#xff0c;设计逻辑来判断A是…