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

news2024/11/30 14:39:53

米思齐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显示屏是否能够正常工作。

程序图

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

完整代码如下:

#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~360
      strcpy(x_direction_degree , results_0_daily_0["wind_direction_degree"]);
      // 风力等级
      strcpy(x_scale , results_0_daily_0["wind_scale"]);
      // 风速/m
      strcpy(x_speed , results_0_daily_0["wind_speed"]);
      // 降水量,0.00 单位mm
      strcpy(x_rainfall , results_0_daily_0["rainfall"]);
      // 降水量,0.00 单位mm
      strcpy(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”);

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

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

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

相关文章

C++基础_Day02

文章目录 四、流程控制语句4.1 选择结构4.1.1 if语句 4.1.2 三目运算符4.1.3 switch语句注意事项 4.1.4 if和switch的区别【CHAT】4.2 循环结构4.2.1 while循环语句4.2.2 do...while循环语句 4.2.3 for循环语句九九乘法表 4.3 跳转语句4.3.1 break语句4.3.2 continue语句4.3.3 …

京东优惠券哪里找到如何领取内部隐藏优惠券怎么使用京东优惠券?

京东优惠券是指通过草柴APP查询要购买京东商品的大额隐藏优惠券&#xff0c;找到后点击进入领取京东优惠券&#xff0c;然后再京东购物可享受领券更便宜的购物方式。 京东优惠券哪里领取内部隐藏优惠券怎么使用&#xff1f; 1、打开京东APP挑选要购买的商品&#xff0c;并点击…

C++简单实现AVL树

目录 一、AVL树的概念 二、AVL树的性质 三、AVL树节点的定义 四、AVL树的插入 4.1 parent的平衡因子为0 4.2 parent的平衡因子为1或-1 4.3 parent的平衡因子为2或-2 4.3.1 左单旋 4.3.2 右单旋 4.3.3 先左单旋再右单旋 4.3.4 先右单旋再左单旋 4.4 插入节点完整代码…

C++指针常量,常量指针以及, 引用和指针的区别

const修饰指针有三种情况 1. const修饰指针 --- 常量指针 2. const修饰常量 --- 指针常量 3. const即修饰指针&#xff0c;又修饰常量 c int main() {int a 10;int b 10;//const修饰的是指针&#xff0c;常量指针&#xff0c;指针指向可以改&#xff0c;指针指向的值不…

linux——进程间通信——管道

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——进程间通信——管道通信 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;进程间通信&#xff08;InterProcess Communication&…

Linux 文件上传、下载

1、通过FinalShell工具虚拟机进行数据交换 在FinalShell软件的下方窗体中&#xff0c;提供了Linux的文件系统视图&#xff0c;可以方便的&#xff1a; 浏览文件系统&#xff0c;找到合适的文件&#xff0c;右键点击下载&#xff0c;即可传输到本地电脑 浏览文件系统&#xff0…

密码技术 (5) - 数字签名

一. 前言 前面在介绍消息认证码时&#xff0c;我们知道消息认证码虽然可以确认消息的完整性&#xff0c;但是无法防止否认问题。而数字签名可以解决否认的问题&#xff0c;接下来介绍数字签名的原理。 二. 数字签名的原理 数字签名和公钥密码一样&#xff0c;也有公钥和私钥&am…

网站使用SSL证书是趋势吗?

随着互联网技术的不断发展&#xff0c;网络安全问题日益受到重视。其中&#xff0c;SSL证书作为网站安全的基石&#xff0c;其重要性不言而喻。SSL证书能够加密网站与用户之间的通信&#xff0c;保护用户隐私&#xff0c;防止信息被窃取和篡改。因此&#xff0c;越来越多的网站…

10.1作业

#include <stdio.h> #include <string.h> #include <stdlib.h> /** function:* 创建一个双向链表&#xff0c;将26个英文字母通过头插的方式插入&#xff0c;通过为尾删的方式读取并删除* param [ in] * param [out] * return */ typedef struct double…

ECharts多个数据视图进行自适应大小的解决方案

项目场景&#xff1a; 在制作数据视图时经常会遇到多个数据视图的情况&#xff0c;在多个数据视图的情况下做自适应是比较麻烦的&#xff0c;这里就详细的分析一下该如何去制作&#xff0c;分享一下我的解决办法及思路。 定义 DOM 容器 这里需要注意一个地方&#xff0c;在定…

《Jetpack Compose从入门到实战》第八章 Compose页面 导航

添加依赖&#xff1a;implementation “androidx.navigation:navigation-compose:$nav_version” Navigation for Compose class MainActivity : AppCompatActivity() {var theme: BloomTheme by mutableStateOf(BloomTheme.LIGHT)override fun onCreate(savedInstanceState:…

Vue3核心源码解析 (一) : 源码目录结构

通过软件框架阅读源码可以对框架本身运行机制进行学习&#xff0c;更能了解框架的API设计、原理及流程、设计思路&#xff1b;我们要知其然&#xff0c;更知其所以然。 Vue 3的源码相对于Vue 2版本有了较大程度的改变&#xff0c;采用Monorepo规范的目录结构&#xff0c;同时使…

JavaScript——APIs

复习&#xff1a; splice() 方法用于添加或删除数组中的元素。 **注意&#xff1a;**这种方法会改变原始数组。 删除数组&#xff1a; splice(起始位置&#xff0c; 删除的个数) 比如&#xff1a;1 let arr [red, green, blue] arr.splice(1,1) // 删除green元素 consol…

【ArcGIS Pro二次开发】(69):使用MapTool实现隐藏和隔离图层

一、MapTool简介 在ArcGIS Pro SDK中&#xff0c;MapTool是一个重要的组件&#xff0c;用于自定义地图操作工具&#xff0c;使用户能够在ArcGIS Pro中执行特定的地图交互操作。 在VS中添加新项&#xff0c;可以找到ArcGIS Pro 地图工具&#xff0c;即为MapTool。 新建后打开c…

全连接网络实现回归【房价预测的数据】

也是分为data&#xff0c;model&#xff0c;train&#xff0c;test import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optimclass FCNet(nn.Module):def __init__(self):super(FCNet,self).__init__()self.fc1 nn.Linear(331,200)s…

​萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

​萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书 ​萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

mysql join语句优化实战

生产环境的大表join语句性能经常很差。这里给出大表join语句的优化思路。 准备材料 两张表&#xff0c;t1表N行&#xff0c;t2表M行 CREATE TABLE identity.t1 (id INT NOT NULL COMMENT Id,a INT NULL,PRIMARY KEY (id));CREATE TABLE identity.t2 (id INT NOT NULL COMMEN…

react create-react-app 配置less

环境信息&#xff1a; create-react-app:v5 react:18.2.0 node:18.16.0 如果你不必须使用 less 建议直接使用scss。 因为less配置会遇到很多问题。 配置less过程&#xff1a; 如果你只需要 sass的话&#xff0c;就可以直接使用sass。因为默认配置了scss。 npm、yarn、cnpm、…

wordpress搭建自己的博客详细过程以及踩坑

WordPress作为一款开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;具有诸多优势。首先&#xff0c;它的易用性使得即使对于没有编程经验的用户来说也能轻松上手&#xff0c;通过直观的用户界面和友好的管理工具&#xff0c;用户可以方便地创建、编辑和发布内容。其…

Mac 上没有 Total Commander,可以用这两款软件来代替

在 Windows 上&#xff0c;我用的最多的文件管理软件是 Total Commander&#xff0c;但转到 macOS 上却没有一款和它功能一样的软件&#xff0c;让人有些不爽。 经过一番搜寻&#xff0c;终于找到了 2 款可以部分代替 Total Commander 的软件&#xff0c;在此与大家分享。 1、…