ESP32 arduino 天气显示 后台可控制 定时消息提示 图片提示

1 篇文章 0 订阅

ESP32 arduino 天气显示 后台可控制 定时消息提示 图片提示

后台操作界面

添加图片显示

添加文字轮播

用到的.H库

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WebServer.h>
#include <WiFiMulti.h>

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#include <ArduinoJson.h> //json 序列化库
#include <SimpleTimer.h> //定时库

#include <HTTPClient.h> //HTTP 请求库

ESP32 代码

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WebServer.h>
#include <WiFiMulti.h>

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#include <ArduinoJson.h> //json 序列化库
#include <SimpleTimer.h> //定时库

 
StaticJsonDocument<6000> doc; //存放HTTP返回数据
//const char *json_o; //声明返回信息
char json_o[6000] =  {0};
float x;//轮播

#include <HTTPClient.h> //HTTP 请求库

String HttpApi = "http://www.tnro.cn/api/esp/esp32?id=fl"; //接口请求地址


SimpleTimer HttpTimer; //定义定时任务 http 请求

int httpCode; //HTTP 请求状态码全局
 unsigned char con_http_image[1024] = {0}; //定义图片解析
  String img_s;
  int img_x = 0;
  int index_i = 0;
  char img_b[5];

const char *type; //leix
  

U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 22, /* data=*/ 21, /* reset=*/ U8X8_PIN_NONE);   //定义显示器引脚
const char* AP_SSID  = "小刘的天气Tool"; //热点名称
const char* AP_PASS  = "liufeiling";  //密码
 int OLED_STATUS_ACTION = 1; //开机显示状态 1 是默认配置页面 2 是 http链接状态
 int OLED_STATUS_ELSE = 1; //开机显示 配置步骤状态
 int OLED_STATUS_HTTP = 1; //HTTP 显示配置
 
 int OLED_STATUS_HJSON = 0; //解析设置

 const char *type9 = "9"; //HTTP 状态码
 const char *type2 = "2";//HTTP 状态码
 const char *type1 = "1";//HTTP 状态码
 
 unsigned char con[6000] U8X8_PROGMEM= {0};
const unsigned char content[] U8X8_PROGMEM= {这里是矩阵由于太大没有放下};
const unsigned char actionip[] U8X8_PROGMEM= {这里是矩阵由于太大没有放下};
#define ROOT_HTML  "H5页面"
#define ROOT_WAIT  "H5页面"
#define ROOT_LOVE  "H5页面"
WebServer server(80);
WiFiMulti wifiMulti;

uint8_t resr_count_down = 120;//重启倒计时s
TimerHandle_t xTimer_rest;
void restCallback(TimerHandle_t xTimer );
void HttpTimerService(); //声明方法
void tq_init();
void text_init(); //文字显示
void image_init(); //图片显示
void setup() {
  Serial.begin(115200);
  u8g2.begin(); //初始化
  u8g2.enableUTF8Print();  

  WiFi.mode(WIFI_AP);//配置为AP模式
  
  boolean result = WiFi.softAP(AP_SSID, AP_PASS);//开启WIFI热点
  if (result)
  {
    IPAddress myIP = WiFi.softAPIP();

    //打印相关信息
//    Serial.println("");
    Serial.print("Soft-AP IP address = ");
    Serial.println(myIP);
    Serial.println(String("MAC address = ")  + WiFi.softAPmacAddress().c_str());
    Serial.println("waiting ...");

    xTimer_rest = xTimerCreate("xTimer_rest", 1000 / portTICK_PERIOD_MS, pdTRUE, ( void * ) 0, restCallback);
    xTimerStart( xTimer_rest, 0 );  //开启定时器

  } else {  //开启热点失败
    Serial.println("WiFiAP Failed");
    delay(3000);
    ESP.restart();  //复位esp32
  }

  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }

  //首页
  server.on("/", []() {
    OLED_STATUS_ELSE = 2;// 配置模式显示
    u8g2_prepare(); //屏幕重置
    init_2(); //显示连接状态
    Serial.print("当前状态:CDN连接");
    server.send(200, "text/html", ROOT_HTML);
  });
    //彩蛋
  server.on("/love", []() {
    server.send(200, "text/html",ROOT_LOVE);
  });

  //连接
  server.on("/connect", []() {

    server.send(200, "text/html",ROOT_WAIT);
    delay(1000);
    WiFi.softAPdisconnect(true);
    //获取输入的WIFI账户和密码
    String ssid = server.arg("ssid");
    String pass = server.arg("pass");
    Serial.println("WiFi Connect SSID:" + ssid + "  PASS:" + pass);
    //设置为STA模式并连接WIFI
    WiFi.mode(WIFI_STA);
//    WiFi.hostname("esp8266_test");
    WiFi.begin(ssid.c_str(), pass.c_str());

    resr_count_down = 120;
    xTimerStop(xTimer_rest, 0);

    uint8_t Connect_time = 0; //用于连接计时,如果长时间连接不成功,复位设备
    uint8_t Connect_num = 1; //用于连接计时, 等待时间;
    char str[20] = "";
    u8g2.setFont(u8g2_font_6x10_tf); //设置字体
//    u8g2_init_dis();// 强行重置渲染

    while (WiFi.status() != WL_CONNECTED  ) {  //等待WIFI连接成功
      delay(500);
//       init_2(); //显示连接中信息
      Serial.print(".");
//      sprintf(str,"%d",Connect_num);//int 转字符串显示

      u8g2.setCursor( 100,55); //显示尝试次数位置
      u8g2.print(Connect_num);
      u8g2.nextPage();
      Connect_num ++;
      Connect_time ++;
      if (Connect_time > 80) {  //长时间连接不上,复位设备
        Serial.println("Connection timeout, check input is correct or try again later!");
        delay(3000);
        ESP.restart();
      }
    }
    OLED_STATUS_ACTION =2;
  });
  server.begin();
  //设置定时任务HttpTimer ,Xtime
  HttpTimer.setInterval(8000, HttpTimerService); //HTTP 请求 8秒一次心跳包
}

void loop() {
  轮播重置/
  if(x<-1000)
  {
    x= 0;
  }
  server.handleClient();
//  Serial.print("系统循环");
  u8g2.firstPage();
  do {
    //这里初始化显示图标
    draw(); //动态选择当前屏幕显示内容

  } while ( u8g2.nextPage());
  
//  while (WiFi.status() == WL_CONNECTED) {
//    //WIFI已连接
//    //进行网络请求
//    u8g2_http();
//    
//  }
    
}
///显示屏初始化
void u8g2_prepare(void) {
  u8g2.setFont(u8g2_font_6x10_tf);
  u8g2.setFontMode(0); //设置字体透明格式显示
  u8g2.setFontRefHeightExtendedText();
  u8g2.setDrawColor(0);
  u8g2.setFontPosTop();
  u8g2.setFontDirection(0);
}
//显示屏显示模式选择
void draw()
{

  switch(OLED_STATUS_ACTION){
    case 1:u8g2_init();break;
    case 2:u8g2_http();break;
//    default:  break;
  }
}
 显示屏初始化
void u8g2_init()
{
  u8g2_prepare(); //屏幕重置
   switch(OLED_STATUS_ELSE){
    case 1:init_1();break; //开机显示配置画面
    case 2:init_2();break; //显示正在连接画面 //由于连接需要循环终端//迁移到 连接中去显示
  }
  
}
//显示屏重置显示 强行重置渲染
void u8g2_init_dis()
{
  for (int i=1; i<=100; ++i) 
    {
       u8g2.nextPage();
    }
}
//初始化完毕进入http
HTTP初始化状态/


void u8g2_http()
{
  开始网络请求//
  HttpTimer.run();
//  if(httpCode == HTTP_CODE_OK){
//    json_I = json_o;
    if(OLED_STATUS_HJSON == 1)
    {
      deserializeJson(doc, json_o);
      OLED_STATUS_HJSON =0;
      //屏幕重置
 

          u8g2.setFontDirection(0);
          u8g2.firstPage();
          u8g2.setFont(u8g2_font_wqy14_t_gb2312);
        
          type = doc["data"]["type"];
          if(strcmp(type, type1) == 0)
          {
            String AS = doc["data"]["con"];
             for(img_x;img_x<1023;img_x++){
                  img_s = AS.substring(index_i,index_i+4);
                  strcpy(img_b,img_s.c_str());
                  con_http_image[img_x] = strtoul(img_b,0,0);
                  index_i+=5; //下一个解析
//                  Serial.println(con[img_x]); //链接成功输出IP
             }
             img_x = 0; //重置
             index_i = 0; //重置
            u8g2_prepare(); //屏幕重置
            
          };
      
    }
   
    
   
//    Serial.println("进行对比"); //输出
    if(strcmp(type, type9) == 0)
    {
      tq_init();
      Serial.println("天气类型已执行"); //输出
    };
    if(strcmp(type, type2) == 0)
    {
      init_init();
      Serial.println("文字类型已执行"); //输出
    };
    if(strcmp(type, type1) == 0)
    {
      image_init();
      Serial.println("图片类型已执行"); //输出
    };
    
    
 

}
//HTTP 网络请求API 方法
void tq_init()
{
   
   
    ///显示第一天
    u8g2.setCursor(0, 1);
    const char *dayTq00 = doc["data"]["v0"][0];
    const char *dayTq01 = doc["data"]["v0"][1];
    u8g2.print(dayTq00);
    u8g2.setCursor(100, 1);
    u8g2.print(dayTq01);
   //第1天 提示语句
    const char *dayTq10 = doc["data"]["v1"][0]; //第一天提示
    
    u8g2.setCursor((int)x, 17);
    u8g2.print(dayTq10);
    u8g2.drawLine(0, 33, 127, 33); //画横线
    
     /第2天/第二天 天气提示
    const char *dayTq20 = doc["data"]["v2"][0];
    const char *dayTq21 = doc["data"]["v2"][1];
    u8g2.setCursor(0, 36);
    u8g2.print(dayTq20);
    
    u8g2.setCursor(100, 36);
    u8g2.print(dayTq21);
     ///第3天///
    const char *dayTq30 = doc["data"]["v3"][0];
    const char *dayTq31 = doc["data"]["v3"][1];
   
    u8g2.setCursor(0, 50);
    u8g2.print(dayTq30);

    u8g2.setCursor(100, 50);
    u8g2.print(dayTq31);
    x-=0.3;
    Serial.println(x); //输出
    
}
void init_init()
{
      ///显示第一行
    u8g2.setCursor(0, 1);
    const char *dayTq00 = doc["data"]["v0"];
    u8g2.print(dayTq00);
  
   //第2行 提示语句
    const char *dayTq10 = doc["data"]["v1"];  
    
    u8g2.setCursor((int)x, 17);
    u8g2.print(dayTq10);
  
    
     /第3行天///
    const char *dayTq20 = doc["data"]["v2"];
    u8g2.setCursor(0, 36);
    u8g2.print(dayTq20);

     ///第4天///
    const char *dayTq30 = doc["data"]["v3"];
   
    u8g2.setCursor(0, 50);
    u8g2.print(dayTq30);

    x-=0.3;
};
void image_init()
{
   
 
    u8g2.setDrawColor(1);// Black
    u8g2.drawXBMP(0, 0, 128, 64, con_http_image);
};


显示屏初始化调用方法区域*
//开机显示连接画面
void init_1()
{
  u8g2.setDrawColor(1);// Black
  u8g2.drawXBMP(0, 0, 128, 64, actionip);
}
//显示正在连接画面
void init_2()
{
  u8g2.setDrawColor(1);// Black
  u8g2.drawXBMP(0, 0, 128, 64, content);
}

显示屏初始化调用方法区域*
void restCallback(TimerHandle_t xTimer ) {  //长时间不访问WIFI Config 将复位设备
  resr_count_down --;
  Serial.print("resr_count_down: ");
  Serial.println(resr_count_down);
  if (resr_count_down < 1) {
    ESP.restart();
  }
}
HttpTimerService/
void HttpTimerService(){
  Serial.print("5秒定时请求测试..... ");
   HTTPClient http; //实例化
  http.begin(HttpApi);// 开始请求的地址
  httpCode = http.GET(); //获取请求返回的code 码
  if (httpCode == HTTP_CODE_OK) { // 状态码正常 200
    String results = http.getString(); //获取响应内容
 
     for (int i = 0; i < results.length(); i++) //string类型转char[]类型
        {
            json_o[i]=results[i];
        }

    OLED_STATUS_HJSON =1;
    

  } else {
    //不正常 //异常请求
    Serial.println("请求错误,状态码: yic");
 
  }
  http.end();
  
}

 

效果图

 

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值