主頁 >  其他 > 最完整程式:基于Arduino的ESP8266天氣預報設計

最完整程式:基于Arduino的ESP8266天氣預報設計

2021-09-20 14:48:19 其他

文章只涉及程式部分,評論區有完整檔案下載鏈接,有需要自行下載
在這里插入圖片描述
在這里插入圖片描述
整個程式:經過多次驗證有效,

#include<U8g2lib.h>
#include<ESP8266WiFi.h>
#include<avr/pgmspace.h>
#include<SPI.h>
#include<SD.h>
#include<ArduinoJson.h>

/*按鍵模擬輸入的值,按鍵的誤差范圍在之后會設定為正負30*/
#define exit_bt 930
#define left_bt 648
#define right_bt  393
#define enter_bt  144
#define null_bt 22      //不按按鍵時的值(由于會受外界干擾不為0)


#define City_Code_MAX 35              //城市數量(0~35)
#define MAX_CONTENT_SIZE  1000        //接受http回應內容的最大位元組數
#define HTTP_TIMEOUT  5000            //最大回應時間

/*幾個要用到的類的物件定義*/
File myFile;                          //讀取sd卡資料
U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI oled(U8G2_R0, 10, 9, 5);      //驅動螢屏
WiFiClient client;                    //客戶端聯接服務器

/*全域變數*/
unsigned char selected[200];          //用于存放取反(黑白倒置)后的影像,做成被選擇的效果
unsigned char weather_lb[64];         //存放從sd卡中讀取的天氣字樣
unsigned char weather_pb[512];        //存放從sd卡中讀取的天氣影像
char response[MAX_CONTENT_SIZE];      //存放http回應的內容
char endOfHeaders[] = "\r\n\r\n";     //http回應頭部結束的標志

bool has_net = false;           //判斷是否聯上網路的標志
bool sd_initial = false;            //判斷初始化時是否成功讀取sd卡保存的上一次設定的標志
short int s = 0;                      //主界面中選擇的狀態
short int City_Code = 35;               //當前設定城市對應的編碼(開始時默認為佛山)
short int weather_Code = 99;            //http回應內容中天氣對應的編碼(開始默認為未知)
short int temper;                       //http回應內容中的溫度

String City_ID = "WS06YNEMPP18";        //心知天氣中城市對應的id,用于url合成
String ssid = "";                       //配網時保存賬號
String password = "";                   //配網時保存密碼

const char* host = "api.seniverse.com";      //服務器網址
const char* key = "smtq3n0ixdggurox";        //心知天氣api的密匙
const char* language = "zh-Hans";            //設定回應的語言-簡體中文

//此結構在決議json資料時存放json中的"code",“溫度”
struct WeatherData {
  char code[8];         //天氣對應的編碼
  char temperature[8];  //溫度
};


/*函式*/
void Get_initial_data();         //讀取上一次設定的城市
void main_Interface();          //主界面
void main_interface_draw();     //主界面繪圖函式

void smart_Config();            //主界面中的“網路”,配網連接wifi
void config_draw(short int);    //“網路”繪圖函式

void city_Set();                              //主界面中的“工具”,設定城市
void city_set_draw(short int, bool = false);  //“工具”繪圖函式
void draw_city_character(short int, short int, short int);  //繪畫城市字樣函式,三個形參分別是基準點x,y坐標及城市字樣對應的數字
void city_set_store();                                      //將設定城市保存到sd卡中

void weather_Report();                                //主界面中的“天氣”,發送請求接收回應內容并顯示天氣
bool SendRequest();                                   //發送請求
bool skipResponseHeaders();                           //跳過回應頭部
void readReponseContent(char* );                      //將回應的資料保存到content陣列中
bool AnalyseData(char* , struct WeatherData*);        //決議content中的josn資料
void printData(const struct WeatherData* );           //列印決議后的資料(主要用來debug)
void exchange(const struct WeatherData* );            //將決議后存在struct中的code和溫度從字串轉換為整數
void weather_Readpic();                               //讀取sd卡中對應的天氣圖片及字樣
void weather_report_draw();                           //繪制天氣顯示
void request_fail();                                  //例外退出函式

/*城市編碼和城市ID的鍵值對陣列*/
//sizeof:36X12B
static const char *ID[] = {
"WX4FBXXFKE4F", "WTW3SJ5ZBJUY", "WS0E9D8WN298", "WS10730EM8EV", "WECNV8ZNE40W", "WEBTFUSKS7HB", "WSQQMXBCC2VS", "WWGQDCW6TBW1", "WM7B0X53DZW2",
"YB1UX38K6DY1", "WZC1EXZ0P9HU", "WXRVB9QYXKY8", "TZY33C4YJBP3", "WRR2Q2Z7CXWM", "WQGDF7NXZRZB", "WWC2MYYCM6J5", "WW8P3NH2TPDT", "WQ82K43YVYU8",
"WWE0TGW4PX6N", "WQ3V4QR6VR6G", "WW0V9QP93VS8", "WQJ6YY8MHZP0", "WTSQQYHVQ973", "WTEMH46Z5N09", "WTMKQ069CCJ7", "WT3Q0FW9ZJ3Q", "WM6N2PM3WY2K",
"WJ2B9TWGFBT5", "WT47HJP3HEMP", "WT029G15ETRJ", "WKEZD7MXE04F", "WSSU6EXX52RE", "WK3N92NQV6RQ", "WKJ1F428HH2F", "W7W3YQKE4QDH", "WS06YNEMPP18"
};


/*影像(一般以pb開頭)、文字(一般以lb開頭)陣列*/

//開機時的影像: 88X50px length:550  sizeof:550B 
const unsigned char pb_start[] U8X8_PROGMEM= {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x00,0xC0,0x07,0x7F,
0xF0,0x8F,0x81,0x21,0x0B,0x00,0x00,0x00,0xE0,0x0F,0xFF,0xF0,0x8F,0x83,0xA1,0x0A,
0x00,0x00,0x00,0x70,0x1C,0xC3,0x31,0x80,0x83,0xA1,0x06,0x60,0x00,0x00,0x30,0x18,
0x83,0x31,0x80,0x87,0x21,0x03,0xF0,0x00,0x00,0x30,0x18,0x83,0x31,0x80,0x8F,0x41,
0x08,0xC2,0x01,0x00,0x30,0x18,0x83,0x31,0x80,0x8D,0x81,0x87,0x87,0x01,0x00,0x30,
0x18,0x83,0xF1,0x8F,0x99,0x01,0xC0,0x83,0x03,0x00,0x30,0x18,0xC3,0xF0,0x8F,0x99,
0x01,0xC0,0x87,0x03,0x00,0x30,0x18,0xFF,0x30,0x80,0xB1,0x01,0x80,0x8C,0x03,0x00,
0x30,0x18,0x7F,0x30,0x80,0xF1,0x01,0x00,0x98,0x03,0x00,0x30,0x18,0x03,0x30,0x80,
0xE1,0x01,0x20,0xF0,0x03,0x00,0x30,0x18,0x03,0x30,0x80,0xC1,0x01,0x60,0xE0,0x01,
0x00,0x30,0x18,0x03,0x30,0x80,0xC1,0x01,0xC0,0xF0,0x00,0x00,0x70,0x1C,0x03,0xF0,
0x8F,0x81,0x01,0xF0,0xFF,0x01,0x00,0xE0,0x0F,0x03,0xF0,0x8F,0x81,0x01,0x70,0x3F,
0x03,0x00,0xC0,0x07,0x03,0x00,0x00,0x00,0x00,0x70,0x00,0x06,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFB,0xF9,0xE3,0xE7,0xC7,0xC3,
0xE3,0xE3,0xC7,0x0F,0xFC,0xFB,0xF9,0xE7,0xEF,0xE7,0xE7,0xF7,0xE7,0xCF,0x0F,0x60,
0x18,0xD8,0x66,0x6C,0xE0,0x66,0x36,0x66,0xCC,0x00,0x60,0x18,0xD8,0x66,0x6C,0x60,
0x60,0x30,0x66,0xCC,0x00,0x60,0x18,0xD8,0x66,0x6C,0x60,0x60,0x30,0x66,0xCC,0x00,
0x60,0xF8,0xD9,0x66,0xEC,0xE7,0x63,0x30,0x66,0xCC,0x0F,0x60,0xF8,0xD9,0xE6,0xE7,
0xC7,0x67,0x30,0xE6,0xC7,0x0F,0x60,0x18,0xD8,0xE6,0x63,0x00,0x66,0x30,0xE6,0xC3,
0x00,0x60,0x18,0xD8,0x66,0x60,0x00,0x66,0x30,0x66,0xC0,0x00,0x60,0x18,0xD8,0x66,
0x60,0x60,0x66,0x36,0x66,0xC0,0x00,0x60,0xF8,0xD9,0x66,0xE0,0xE7,0xE7,0xF7,0x67,
0xC0,0x0F,0x60,0xF8,0xD9,0x66,0xE0,0xC7,0xC3,0xE3,0x63,0xC0,0x0F,0x60,0x00,0x00,
0x60,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00
};


/*主界面中的影像字樣*/
//主界面中的"工具"影像: 40X40px length:200  sizeof:200B
const unsigned char pb_tool[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,
0x00,0x7C,0x00,0x40,0x06,0x00,0x63,0x00,0x40,0x0C,0x00,0x31,0x00,0x40,0x30,0x80,
0x18,0x04,0x80,0x20,0x80,0x08,0x06,0x80,0x60,0x40,0x08,0x05,0x00,0x41,0xC0,0x90,
0x04,0x00,0x42,0x80,0x60,0x04,0x00,0x9E,0xC0,0x00,0x04,0x00,0x30,0x61,0x00,0x02,
0x00,0x40,0x32,0x00,0x01,0x00,0x80,0x1C,0xFC,0x00,0x00,0x00,0x09,0x36,0x00,0x00,
0x00,0x12,0x01,0x00,0x00,0x00,0xA7,0x00,0x00,0x00,0x80,0xC9,0x00,0x00,0x00,0xC0,
0x90,0x0C,0x00,0x00,0x60,0x30,0x1B,0x00,0x00,0x30,0xC8,0x31,0x00,0x00,0x18,0x44,
0x64,0x00,0x00,0x0C,0x42,0xC8,0x00,0x00,0x06,0x41,0x92,0x01,0x00,0x83,0xC0,0x24,
0x03,0x80,0x49,0x80,0x49,0x06,0xC0,0x24,0x00,0x93,0x04,0x60,0x12,0x00,0x26,0x04,
0x20,0x09,0x00,0x0C,0x04,0x20,0x04,0x00,0x18,0x04,0x40,0x02,0x00,0x30,0x03,0x80,
0x01,0x00,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 
};

//主界面中的"網路"影像: 40X40px length:200  sizeof:200B
const unsigned char pb_net[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,0xE0,0xFF,0x07,0x00,0x00,0xF8,0xFB,0x1F,0x00,0x00,0xFE,
0x99,0x7F,0x00,0x00,0xEF,0x18,0xF7,0x00,0x80,0xE7,0x18,0xC6,0x00,0x80,0x73,0x18,
0xC6,0x01,0xC0,0x71,0x18,0x8E,0x03,0xE0,0x30,0x18,0x0C,0x07,0xE0,0x3F,0x18,0xFC,
0x07,0xE0,0xFF,0xFF,0xFF,0x0F,0x70,0xFC,0xFF,0x7F,0x0C,0x30,0x18,0x18,0x18,0x0C,
0x30,0x18,0x18,0x18,0x1C,0x38,0x18,0x18,0x18,0x1C,0x38,0x18,0x18,0x00,0x18,0x38,
0x18,0x18,0x1E,0x18,0x38,0x18,0xD8,0x7F,0x18,0x38,0x18,0xE0,0xF7,0x01,0x30,0x18,
0xE0,0xC0,0x01,0x30,0x18,0x70,0x80,0x03,0x70,0xF8,0x37,0x00,0x03,0xF0,0xFF,0x37,
0x00,0x07,0xE0,0x3F,0x30,0x00,0x07,0xE0,0x30,0x30,0x00,0x07,0xC0,0x70,0x30,0x00,
0x07,0xC0,0x63,0x70,0x00,0x03,0x80,0xE7,0xE0,0xC0,0x03,0x00,0xCF,0xE0,0xE3,0x03,
0x00,0xFE,0xC1,0xFF,0x07,0x00,0xF8,0x03,0x3E,0x0F,0x00,0xF0,0x3F,0x00,0x1E,0x00,
0x80,0x3F,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

//主界面中的“天氣”影像:  40X40px length:200  sizeof:200B
const unsigned char pb_weather[]  U8X8_PROGMEM= {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x60,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x60,0x20,0x00,0x00,0xC0,0x00,
0x70,0x00,0x00,0xC0,0xF1,0x38,0x00,0x00,0x80,0xFD,0x13,0x00,0x00,0x00,0x0E,0x07,
0x00,0x00,0x00,0x06,0x0E,0x00,0x00,0x00,0x03,0x1C,0x00,0x00,0x70,0x03,0xF8,0x01,
0x00,0x70,0x03,0xFC,0x0F,0x00,0x00,0x03,0x0E,0x1C,0x00,0x00,0x03,0x07,0x38,0x00,
0x40,0x07,0x03,0x30,0x00,0xE0,0xE6,0x01,0xF0,0x00,0x70,0xFC,0x01,0xE0,0x03,0x20,
0x18,0x00,0x00,0x07,0x80,0x1F,0x00,0x00,0x0E,0xC0,0x01,0x00,0x00,0x1C,0xE0,0x00,
0x00,0x00,0x18,0x60,0x00,0x00,0x00,0x18,0x60,0x00,0x00,0x00,0x18,0x60,0x00,0x00,
0x00,0x1C,0x60,0x00,0x00,0x00,0x0E,0xE0,0xC0,0x03,0x00,0x07,0xC0,0xFF,0xFF,0xFF,
0x03,0x80,0x1F,0xFC,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0xC3,0x30,0x00,
0x00,0x0C,0xC3,0x30,0x00,0x00,0x0C,0xC3,0x30,0x00,0x00,0x0C,0xC3,0x30,0x00,0x00,
0x0C,0xC3,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 
};


//主界面中的電池影像: 16X8px length:16  sizeof:16B
const unsigned char battery[] U8X8_PROGMEM = {
0xFF,0x1F,0x01,0x10,0xFD,0xF7,0xFD,0x97,0xFD,0x97,0xFD,0xF7,0x01,0x10,0xFF,0x1F
};

//主界面中的未聯網影像: 8X8px length:8  sizeof:8B
const unsigned char off_line[] U8X8_PROGMEM ={
0x3C,0x42,0xA5,0x99,0x99,0xA5,0x42,0x3C
};

//主界面中的有網路影像: 8X8px length:8  sizeof:8B
const unsigned char on_line[] U8X8_PROGMEM ={
0x3C,0x42,0x81,0x18,0x24,0x00,0x18,0x18
};

//主界面中的“選單”字樣: 24X13px length:39 sizeof:39B
const unsigned char lb_menu[] U8X8_PROGMEM = {
0x08,0x82,0x20,0xFF,0x1F,0x11,0x08,0xC2,0x7F,0x00,0x4F,0x44,0xFE,0xC4,0x7F,0x24,
0x44,0x44,0x48,0x42,0x44,0x40,0xC0,0x7F,0xFF,0x1F,0x04,0xE0,0x00,0x04,0x50,0xE1,
0xFF,0x4C,0x06,0x04,0x43,0x18,0x04  
};

//主界面中的“工具”字樣: 24X13px length:39 sizeof:39B
const unsigned char lb_tool[] U8X8_PROGMEM = {
0xFF,0xE3,0x3F,0x20,0x20,0x20,0x20,0xE0,0x3F,0x20,0x20,0x20,0x20,0xE0,0x3F,0x20,
0x20,0x20,0x20,0xE0,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0xFF,0x20,0x80,
0x08,0xFF,0x43,0x10,0x00,0x20,0x20
};

//主界面中的“網路”字樣: 24X13px length:39 sizeof:39B
const unsigned char lb_net[] U8X8_PROGMEM = {
0xFF,0x0F,0x11,0x01,0x88,0x10,0x21,0x4A,0xF0,0x65,0x2A,0x89,0xA9,0xEA,0x55,0x11,
0x89,0x20,0x11,0x49,0x50,0xA9,0x2A,0x88,0xA9,0xEA,0x05,0x45,0x08,0xF8,0x23,0x08,
0x88,0x01,0x88,0x89,0x01,0x6E,0xF8 
};

//主界面中的“天氣”字樣: 24X13px length:39 sizeof:39B
const unsigned char lb_weather[] U8X8_PROGMEM = {
0x00,0x80,0x00,0xFC,0x87,0x7F,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x20,0x3F,0xFE,
0x0F,0x00,0x40,0x00,0x00,0xA0,0x80,0x3F,0xA0,0x00,0x20,0x10,0x01,0x20,0x08,0x02,
0xA0,0x04,0x04,0xA0,0x03,0x18,0xC0 
};


/*"網路"中的影像字樣*/
//滿格WiFi影像: 48*48px length:288  sizeof:288
const unsigned char pb_signal_full[] U8X8_PROGMEM= {
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xe0,0xff,0xff,0xff,0x3f,0x00,0x00,
0xfc,0xff,0xff,0x07,0x00,0x00,0xe0,0xff,0xff,0x01,0x00,0x00,0x80,0xff,0x7f,0x00,0x00,0x00,0x00,0xfe,
0x3f,0x00,0x00,0x00,0x00,0xfc,0x0f,0x00,0xe8,0x17,0x00,0xf0,0x07,0x00,0xff,0xff,0x01,0xe0,0x03,0xe0,
0xff,0xff,0x07,0xc0,0x00,0xf8,0xff,0xff,0x1f,0x80,0x01,0xfe,0x0f,0xf8,0x7f,0x00,0x03,0xff,0x01,0x00,
0xff,0xc0,0xc3,0x3f,0x00,0x00,0xfc,0xc3,0xef,0x0f,0x00,0x00,0xf0,0xf7,0xff,0x07,0x00,0x00,0xe0,0xff,
0xff,0x01,0x00,0x00,0x80,0xff,0xff,0x00,0x40,0x01,0x00,0xff,0xff,0x00,0xfc,0x3f,0x00,0xff,0xff,0x00,
0xff,0xff,0x00,0xff,0xff,0xc3,0xff,0xff,0xc3,0xff,0xff,0xe3,0x7f,0xff,0xc7,0xff,0xff,0xff,0x07,0xe0,
0xff,0xff,0xff,0xff,0x01,0x80,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0x7f,0x00,0x00,0xfe,0xff,
0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xe3,0xc7,0xff,0xff,0xff,0xff,
0xfb,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0x1f,0xf8,
0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,
0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x1f,0xf8,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; 

//兩格WiFi影像: 48*48px length:288  sizeof:288
const unsigned char pb_signal_mid[] U8X8_PROGMEM= {
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf8,0xff,0xff,0xff,0xff,0x01,0x00,
  0xff,0xff,0xff,0x3f,0x00,0x00,0xfc,0xff,0xff,0x0f,0x00,0x00,0xf0,0xff,0xff,0x07,0x00,0x00,0xe0,0xff,
  0xff,0x01,0x00,0x00,0x80,0xff,0xff,0x00,0x40,0x01,0x00,0xff,0xff,0x00,0xfc,0x3f,0x00,0xff,0xff,0x00,
  0xff,0xff,0x00,0xff,0xff,0xc3,0xff,0xff,0xc3,0xff,0xff,0xe3,0x7f,0xff,0xc7,0xff,0xff,0xff,0x07,0xe0,
  0xff,0xff,0xff,0xff,0x01,0x80,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0x7f,0x00,0x00,0xfe,0xff,
  0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xe3,0xc7,0xff,0xff,0xff,0xff,
  0xfb,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0x1f,0xf8,
  0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,
  0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x1f,0xf8,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

//一格WiFi影像: 48*48px length:288  sizeof:288
const unsigned char pb_signal_low[] U8X8_PROGMEM= {
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x07,0xe0,
  0xff,0xff,0xff,0xff,0x01,0x80,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0x7f,0x00,0x00,0xfe,0xff,
  0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xe3,0xc7,0xff,0xff,0xff,0xff,
  0xfb,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0x1f,0xf8,
  0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,
  0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x1f,0xf8,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

//零格WiFi影像 : 48*48px length:288  sizeof:288
const unsigned char pb_signal_none[] U8X8_PROGMEM= {
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0x1f,0xf8,
  0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,
  0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0x1f,0xf8,0xff,0xff,0xff,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

//"連接中,,,"字樣: 56X16px sizeof:112B
const unsigned char lb_config[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x84,0x00,0x20,0x00,0x00,0x04,0x01,
0x04,0x01,0x20,0x00,0x00,0xE8,0x1F,0xE4,0x0F,0xFF,0x07,0x00,0x88,0x00,0x5F,0x04,
0x21,0x04,0x00,0x40,0x02,0x84,0x02,0x21,0x04,0x00,0x40,0x02,0xF4,0x1F,0x21,0x04,
0x00,0xEE,0x1F,0x84,0x00,0x21,0x04,0x00,0x08,0x02,0x8C,0x00,0x21,0x04,0x00,0x08,
0x02,0xF7,0x1F,0xFF,0x07,0x00,0xE8,0x3F,0x44,0x04,0x21,0x04,0x00,0x08,0x02,0x64,
0x02,0x20,0x00,0x00,0x08,0x02,0x84,0x01,0x20,0x38,0xE7,0x14,0x02,0x44,0x06,0x20,
0x28,0xA5,0xE2,0x3F,0x37,0x08,0x20,0x38,0xE7,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

//"重新"字樣: 32X16px sizeof:64B
const unsigned char lb_renew[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x1F,0x10,0x20,0xFC,0x00,0xFE,0x1E,
0x80,0x00,0x00,0x02,0xFF,0x7F,0x44,0x02,0x80,0x00,0x28,0x02,0xF8,0x0F,0xFF,0x7E,
0x88,0x08,0x10,0x12,0xF8,0x0F,0x10,0x12,0x88,0x08,0xFE,0x12,0xF8,0x0F,0x10,0x12,
0x80,0x00,0x54,0x12,0xFC,0x1F,0x92,0x12,0x80,0x00,0x11,0x11,0xFF,0x7F,0x14,0x11
};

//"是"字樣: 16X16px sizeof:32B
const unsigned char lb_yes[] U8X8_PROGMEM = {
0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,0x08,0x08,0xF8,0x0F,
0x00,0x00,0xFF,0x7F,0x80,0x00,0x90,0x00,0x90,0x1F,0xA8,0x00,0x48,0x00,0x84,0x3F 
};

//"否"字樣: 16X16px sizeof:32B
const unsigned char lb_no[] U8X8_PROGMEM = {
0x00,0x00,0xFE,0x3F,0x00,0x01,0x80,0x00,0xC0,0x00,0xA0,0x06,0x90,0x18,0x8C,0x20,
0x83,0x40,0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08  
};


/*“工具”中的字樣(城市字樣)*/
//所有城市字樣都是: 32X16px sizeof:36X64B
//依次為:北上廣深港澳臺津渝及各省的省會
const unsigned char Beijing[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x20,0x02,0x40,0x00,0x20,0x02,0x80,0x00,0x20,0x02,0xFF,0x7F,
0x20,0x22,0x00,0x00,0x20,0x12,0x00,0x00,0x3E,0x0A,0xF8,0x0F,0x20,0x06,0x08,0x08,
0x20,0x02,0x08,0x08,0x20,0x02,0x08,0x08,0x20,0x02,0xF8,0x0F,0x20,0x02,0x80,0x00,
0x20,0x42,0x88,0x08,0x38,0x42,0x88,0x10,0x27,0x42,0x84,0x20,0x22,0x7C,0xA2,0x20
};
const unsigned char Shanghai[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x00,0x40,0x00,0x84,0x00,0x40,0x00,0x88,0x3F,
0x40,0x00,0x48,0x00,0x40,0x00,0xA1,0x1F,0x40,0x00,0x82,0x10,0xC0,0x1F,0x92,0x12,
0x40,0x00,0x90,0x14,0x40,0x00,0xE8,0x7F,0x40,0x00,0x88,0x10,0x40,0x00,0x47,0x12,
0x40,0x00,0x44,0x14,0x40,0x00,0xC4,0x3F,0x40,0x00,0x04,0x10,0xFF,0x7F,0x04,0x0A  
};
const unsigned char Guangzhou[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0x08,0x20,0x00,0x01,0x08,0x21,0x00,0x01,0x08,0x21,
0xFC,0x3F,0x08,0x21,0x04,0x00,0x08,0x21,0x04,0x00,0x2A,0x25,0x04,0x00,0x4A,0x29,
0x04,0x00,0x4A,0x29,0x04,0x00,0x09,0x21,0x04,0x00,0x08,0x21,0x04,0x00,0x08,0x21,
0x04,0x00,0x08,0x21,0x04,0x00,0x04,0x21,0x02,0x00,0x04,0x21,0x02,0x00,0x02,0x20  
};
const unsigned char Shenzhen[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0xE4,0x3F,0x88,0x20,0x28,0x20,0x88,0x24,0x28,0x25,0x88,0x24,
0x81,0x08,0x88,0x24,0x42,0x10,0x88,0x24,0x02,0x02,0xBF,0x24,0x08,0x02,0x88,0x24,
0xE8,0x3F,0x88,0x24,0x04,0x02,0x88,0x24,0x07,0x07,0x88,0x24,0x84,0x0A,0x88,0x24,
0x44,0x12,0xB8,0x24,0x34,0x62,0x87,0x24,0x04,0x02,0x42,0x24,0x00,0x02,0x40,0x20  
};
const unsigned char Hongkong[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x0E,0x80,0x08,0xF8,0x01,0x84,0x08,0x80,0x00,0xE8,0x3F,
0x80,0x00,0x88,0x08,0xFF,0x7F,0x81,0x08,0xA0,0x02,0xF2,0x7F,0x90,0x04,0x82,0x08,
0x8C,0x18,0x48,0x10,0xFB,0x6F,0xE8,0x2F,0x08,0x08,0x54,0x48,0x08,0x08,0x47,0x08,
0xF8,0x0F,0xC4,0x0F,0x08,0x08,0x44,0x20,0x08,0x08,0x44,0x20,0xF8,0x0F,0x84,0x3F  
};
const unsigned char Macao[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x00,0x84,0x00,0xC8,0x3F,0xE8,0x3F,0x08,0x20,
0x28,0x22,0x02,0x20,0xA1,0x2A,0x02,0x20,0x22,0x22,0x02,0x20,0xE2,0x3F,0x02,0x20,
0x28,0x27,0x02,0x20,0xA8,0x2A,0x02,0x20,0x24,0x20,0x02,0x20,0x07,0x02,0x02,0x20,
0xF4,0x7F,0x02,0x20,0x04,0x05,0x02,0x20,0x84,0x08,0x02,0x28,0x44,0x10,0x02,0x30 
};
const unsigned char Taipei[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x40,0x00,0x20,0x02,0x40,0x00,0x20,0x02,0x20,0x00,0x20,0x02,
0x10,0x04,0x20,0x22,0x08,0x08,0x20,0x12,0x04,0x10,0x3E,0x0A,0xFE,0x3F,0x20,0x06,
0x04,0x20,0x20,0x02,0x00,0x00,0x20,0x02,0xF8,0x0F,0x20,0x02,0x08,0x08,0x20,0x02,
0x08,0x08,0x20,0x42,0x08,0x08,0x38,0x42,0x08,0x08,0x27,0x42,0xF8,0x0F,0x22,0x7C  
};
const unsigned char Tianjin[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0xFC,0x1F,0x00,0x02,0x80,0x00,0x04,0x02,0x80,0x00,0xC8,0x1F,
0x80,0x00,0x08,0x12,0x80,0x00,0xE1,0x7F,0xFF,0x7F,0x02,0x12,0x80,0x00,0xD2,0x1F,
0x40,0x01,0x10,0x02,0x40,0x01,0x08,0x02,0x20,0x02,0xC8,0x1F,0x20,0x02,0x07,0x02,
0x10,0x04,0x04,0x02,0x08,0x08,0xE4,0x3F,0x04,0x10,0x04,0x02,0x03,0x60,0x04,0x02  
};
const unsigned char Chongqing[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x08,0x80,0x00,0x00,0x1F,0x00,0x01,0xFC,0x00,0xFC,0x7F,
0x80,0x00,0x04,0x00,0xFF,0x7F,0x04,0x01,0x80,0x00,0x04,0x01,0xF8,0x0F,0x04,0x01,
0x88,0x08,0xF4,0x3F,0xF8,0x0F,0x04,0x01,0x88,0x08,0x84,0x02,0xF8,0x0F,0x84,0x02,
0x80,0x00,0x44,0x04,0xFC,0x1F,0x42,0x04,0x80,0x00,0x22,0x08,0xFF,0x7F,0x11,0x10  
};
const unsigned char Harbin[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80,0x80,0x00,0x10,0x80,0x80,0x40,0xFE,
0x4E,0xC1,0x9F,0x42,0x2A,0x42,0x10,0x3C,0x1A,0x2C,0x4A,0x04,0xEA,0x03,0x82,0x7C,
0x0A,0x80,0x0A,0x24,0xEE,0x43,0x92,0xFE,0x2A,0x22,0x92,0x00,0x20,0x82,0xC2,0x28,
0xE0,0x03,0x83,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  
};
const unsigned char Changchun[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x10,0x00,0x80,0x00,0x10,0x08,0x80,0x00,0x10,0x04,0xFE,0x3F,
0x10,0x02,0x80,0x00,0x10,0x01,0xFC,0x1F,0x90,0x00,0x40,0x00,0x10,0x00,0xFF,0x7F,
0xFF,0x7F,0x10,0x04,0x50,0x00,0x08,0x08,0x90,0x00,0xF4,0x17,0x10,0x01,0x13,0x64,
0x10,0x02,0xF0,0x07,0x90,0x04,0x90,0x04,0x50,0x18,0x90,0x04,0x30,0x60,0xF0,0x07  
};
const unsigned char Shenyang[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x02,0x3E,0x00,0x04,0x02,0xA2,0x3F,0x08,0x02,0x92,0x20,
0xE8,0x7F,0x92,0x20,0x21,0x22,0x8A,0x20,0x12,0x12,0x92,0x20,0x02,0x02,0x92,0x20,
0x08,0x05,0xA2,0x3F,0x08,0x05,0xA2,0x20,0x04,0x05,0xA2,0x20,0x87,0x04,0x96,0x20,
0x84,0x04,0x8A,0x20,0x44,0x44,0x82,0x20,0x44,0x44,0x82,0x3F,0x24,0x78,0x82,0x20  
};
const unsigned char Urumchi[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x08,0x02,0x00,0x08,0x04,0x3E,0x10,0x10,0x3E,0x11,0x10,0xFF,
0xA2,0xFE,0x10,0x24,0x22,0x92,0xFE,0x24,0x3A,0xFE,0x10,0x18,0x02,0x92,0x38,0x24,
0x7E,0xFF,0x55,0xC3,0x40,0x00,0x54,0x24,0x40,0xFE,0x92,0x24,0x7F,0x82,0x92,0x24,
0x40,0xFE,0x11,0x25,0x48,0x82,0x10,0x22,0x70,0xFE,0x10,0x22,0x00,0x00,0x00,0x00  
};
const unsigned char Hohhot[] U8X8_PROGMEM = {
0xC0,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x57,0x01,0x01,0x21,0xE5,0x44,0x01,0x79,
0x45,0xC8,0x4F,0x21,0xF5,0x21,0xC1,0x23,0x47,0x04,0x41,0xFD,0x50,0xE8,0x2F,0x21,
0x60,0x00,0x00,0x23,0x08,0x10,0x80,0xFD,0xE6,0xD8,0x4F,0x21,0xA4,0x48,0x08,0x2D,
0xAF,0x44,0x08,0x21,0xA4,0xC4,0x0F,0x29,0xEE,0x00,0x00,0x31,0x15,0x00,0x00,0x00  
};
const unsigned char Yinchuan[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x20,0x88,0x1F,0x08,0x21,0xBC,0x10,0x08,0x21,
0x84,0x10,0x08,0x21,0x82,0x1F,0x08,0x21,0xBD,0x10,0x08,0x21,0x88,0x10,0x08,0x21,
0x88,0x1F,0x08,0x21,0xBF,0x22,0x08,0x21,0x88,0x12,0x08,0x21,0x88,0x0C,0x08,0x21,
0x88,0x04,0x08,0x21,0xA8,0x08,0x04,0x21,0x98,0x12,0x04,0x21,0x88,0x61,0x02,0x20  
};
const unsigned char Shijiazhuang[] U8X8_PROGMEM = {
0x00,0x40,0x00,0x00,0x00,0x80,0x00,0x04,0xFF,0xFD,0x0F,0x04,0x10,0x04,0xC8,0x3F,
0x08,0x02,0x40,0x00,0x08,0xF8,0x47,0x04,0x04,0x40,0x40,0x04,0xFE,0xA1,0x46,0x04,
0x05,0x91,0x41,0x3F,0x04,0x41,0x43,0x04,0x04,0x39,0x45,0x04,0x04,0x81,0x49,0x04,
0x04,0x41,0x21,0x04,0xFC,0x31,0xA1,0x7F,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00  
};
const unsigned char Taiyuan[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0xFC,0x7F,0x80,0x00,0x04,0x01,0x80,0x00,0x84,0x00,
0x80,0x00,0xE4,0x0F,0x80,0x00,0x24,0x08,0xFF,0x7F,0x24,0x08,0x80,0x00,0xE4,0x0F,
0x80,0x00,0x24,0x08,0x40,0x01,0x24,0x08,0x40,0x01,0xE4,0x0F,0x20,0x02,0x04,0x01,
0x20,0x02,0x24,0x09,0x50,0x04,0x12,0x11,0x88,0x08,0x4A,0x21,0x84,0x10,0x81,0x00  
};
const unsigned char Xining[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0xFF,0x7F,0x40,0x00,0x20,0x02,0x80,0x00,0x20,0x02,0x80,0x00,
0x20,0x02,0xFE,0x7F,0xFC,0x1F,0x02,0x40,0x24,0x12,0x01,0x20,0x24,0x12,0x00,0x00,
0x24,0x12,0xFC,0x1F,0x24,0x12,0x80,0x00,0x14,0x1C,0x80,0x00,0x0C,0x10,0x80,0x00,
0x04,0x10,0x80,0x00,0x04,0x10,0x80,0x00,0xFC,0x1F,0x80,0x00,0x04,0x10,0xA0,0x00  
};
const unsigned char Jinan[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x04,0x02,0x80,0x00,0xE8,0x7F,0xFF,0x7F,
0x48,0x10,0x80,0x00,0x81,0x08,0x80,0x00,0x02,0x05,0xFE,0x3F,0x02,0x02,0x12,0x24,
0x88,0x0D,0x22,0x22,0x68,0x70,0xF2,0x27,0x84,0x08,0x82,0x20,0x87,0x08,0x82,0x20,
0x84,0x08,0xFA,0x2F,0x84,0x08,0x82,0x20,0x44,0x08,0x82,0x20,0x44,0x08,0x82,0x28  
};
const unsigned char Lanzhou[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x20,0x10,0x08,0x08,0x21,0x20,0x04,0x08,0x21,
0x20,0x02,0x08,0x21,0x00,0x00,0x08,0x21,0xFE,0x3F,0x2A,0x25,0x00,0x00,0x4A,0x29,
0x00,0x00,0x4A,0x29,0x00,0x00,0x09,0x21,0xFC,0x1F,0x08,0x21,0x00,0x00,0x08,0x21,
0x00,0x00,0x08,0x21,0x00,0x00,0x04,0x21,0x00,0x00,0x04,0x21,0xFF,0x7F,0x02,0x20  
};
const unsigned char Zhengzhou[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x44,0x00,0x08,0x20,0x48,0x7C,0x08,0x21,0x28,0x44,0x08,0x21,
0xFE,0x24,0x08,0x21,0x10,0x24,0x08,0x21,0x10,0x14,0x2A,0x25,0x10,0x24,0x4A,0x29,
0xFF,0x25,0x4A,0x29,0x10,0x44,0x09,0x21,0x10,0x44,0x08,0x21,0x28,0x44,0x08,0x21,
0x48,0x2C,0x08,0x21,0x84,0x14,0x04,0x21,0x82,0x04,0x04,0x21,0x01,0x04,0x02,0x20  
};
const unsigned char Xian[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0xFF,0x7F,0x40,0x00,0x20,0x02,0x80,0x00,0x20,0x02,0xFC,0x3F,
0x20,0x02,0x04,0x20,0xFC,0x1F,0x42,0x10,0x24,0x12,0x40,0x00,0x24,0x12,0x40,0x00,
0x24,0x12,0xFF,0x7F,0x24,0x12,0x20,0x04,0x14,0x1C,0x10,0x04,0x0C,0x10,0x18,0x02,
0x04,0x10,0x60,0x02,0x04,0x10,0x80,0x01,0xFC,0x1F,0x40,0x06,0x04,0x10,0x30,0x08  
};
const unsigned char Nanjing[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0xFF,0x7F,
0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xFE,0x3F,0xF8,0x0F,0x12,0x24,0x08,0x08,
0x22,0x22,0x08,0x08,0xF2,0x27,0x08,0x08,0x82,0x20,0xF8,0x0F,0x82,0x20,0x80,0x00,
0xFA,0x2F,0x88,0x08,0x82,0x20,0x88,0x10,0x82,0x20,0x84,0x20,0x82,0x28,0xA2,0x20  
};
const unsigned char Hefei[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0xBC,0x3F,0x40,0x01,0xA4,0x24,
0x20,0x02,0xA4,0x24,0x10,0x04,0xA4,0x24,0x0C,0x18,0xBC,0x24,0xF3,0x67,0xA4,0x24,
0x00,0x00,0xA4,0x3F,0x00,0x00,0xA4,0x20,0xF8,0x0F,0xBC,0x00,0x08,0x08,0xA4,0x00,
0x08,0x08,0xA4,0x00,0x08,0x08,0xA4,0x40,0x08,0x08,0xA2,0x40,0xF8,0x0F,0x2A,0x7F  
};
const unsigned char Hangzhou[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x08,0x01,0x08,0x20,0x08,0x02,0x08,0x21,0x08,0x02,0x08,0x21,
0xC8,0x3F,0x08,0x21,0x3F,0x00,0x08,0x21,0x08,0x00,0x2A,0x25,0x8C,0x0F,0x4A,0x29,
0x9C,0x08,0x4A,0x29,0xAA,0x08,0x09,0x21,0xAA,0x08,0x08,0x21,0x89,0x08,0x08,0x21,
0x88,0x48,0x08,0x21,0x88,0x48,0x04,0x21,0x48,0x48,0x04,0x21,0x48,0x70,0x02,0x20  
};
const unsigned char Wuhan[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x02,0xE4,0x1F,0x00,0x0A,0x48,0x10,0xFC,0x12,0x48,0x10,
0x00,0x12,0x41,0x10,0x00,0x02,0x82,0x08,0xFF,0x7F,0x92,0x08,0x00,0x02,0x90,0x08,
0x20,0x02,0x08,0x05,0x20,0x02,0x08,0x05,0xE4,0x02,0x07,0x02,0x24,0x04,0x04,0x02,
0x24,0x44,0x04,0x05,0x24,0x48,0x84,0x08,0xE4,0x51,0x44,0x10,0x1F,0x60,0x30,0x60  
};
const unsigned char Chengdu[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x0A,0x10,0x00,0x00,0x12,0x10,0x7D,0x00,0x02,0x7E,0x45,
0xFC,0x7F,0x90,0x24,0x04,0x02,0x50,0x24,0x04,0x02,0xFF,0x17,0x04,0x22,0x10,0x24,
0x7C,0x22,0x08,0x24,0x44,0x22,0xFC,0x44,0x44,0x14,0x86,0x44,0x44,0x14,0x85,0x44,
0x44,0x48,0xFC,0x2C,0x54,0x4C,0x84,0x14,0x22,0x52,0x84,0x04,0x02,0x61,0xFC,0x04  
};
const unsigned char Lhasa[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x08,0x02,0x20,0x02,0x08,0x04,0x20,0x02,0x08,0x04,0xFF,0x7F,
0x08,0x00,0x20,0x02,0xDF,0x7F,0x00,0x04,0x08,0x00,0xBE,0x3F,0x28,0x20,0x22,0x11,
0x98,0x20,0x12,0x0A,0x8C,0x20,0x8A,0x7F,0x0B,0x11,0x92,0x00,0x08,0x11,0xA2,0x00,
0x08,0x11,0xA2,0x00,0x08,0x09,0xAA,0x00,0x08,0x08,0x92,0x00,0xEA,0x7F,0x42,0x00  
};
const unsigned char Nanchang[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0xF8,0x0F,0x80,0x00,0x08,0x08,0xFF,0x7F,0x08,0x08,
0x80,0x00,0xF8,0x0F,0x80,0x00,0x08,0x08,0xFE,0x3F,0x08,0x08,0x12,0x24,0xF8,0x0F,
0x22,0x22,0x00,0x00,0xF2,0x27,0xFC,0x1F,0x82,0x20,0x04,0x10,0x82,0x20,0x04,0x10,
0xFA,0x2F,0xFC,0x1F,0x82,0x20,0x04,0x10,0x82,0x20,0x04,0x10,0x82,0x28,0xFC,0x1F 
};
const unsigned char Changsha[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x10,0x08,0x04,0x02,0x10,0x04,0x08,0x02,
0x10,0x02,0x88,0x12,0x10,0x01,0x81,0x22,0x90,0x00,0x42,0x42,0x10,0x00,0x42,0x42,
0xFF,0x7F,0x28,0x12,0x50,0x00,0x08,0x12,0x90,0x00,0x04,0x12,0x10,0x01,0x07,0x08,
0x10,0x02,0x04,0x08,0x90,0x04,0x04,0x04,0x50,0x18,0x04,0x02,0x30,0x60,0x84,0x01  
};
const unsigned char Guiyang[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0x3E,0x00,0xF8,0x0F,0xA2,0x3F,0x88,0x08,0x92,0x20,
0x88,0x08,0x92,0x20,0xF8,0x0F,0x8A,0x20,0x80,0x00,0x92,0x20,0xFF,0x7F,0x92,0x20,
0x00,0x00,0xA2,0x3F,0xF8,0x0F,0xA2,0x20,0x08,0x08,0xA2,0x20,0x88,0x08,0x96,0x20,
0x88,0x08,0x8A,0x20,0x88,0x08,0x82,0x20,0x40,0x06,0x82,0x3F,0x30,0x18,0x82,0x20 
};
const unsigned char Fuzhou[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x20,0xC4,0x7F,0x08,0x21,0x04,0x00,0x08,0x21,
0x9F,0x3F,0x08,0x21,0x88,0x20,0x08,0x21,0x88,0x20,0x2A,0x25,0x84,0x3F,0x4A,0x29,
0x0C,0x00,0x4A,0x29,0xD6,0x7F,0x09,0x21,0x55,0x44,0x08,0x21,0x44,0x44,0x08,0x21,
0xC4,0x7F,0x08,0x21,0x44,0x44,0x04,0x21,0x44,0x44,0x04,0x21,0xC4,0x7F,0x02,0x20  
};
const unsigned char Kunming[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0xFC,0x0F,0x00,0x3F,0x04,0x08,0x3E,0x21,0x04,0x08,0x22,0x21,
0xFC,0x0F,0x22,0x21,0x04,0x08,0x22,0x3F,0x04,0x08,0x3E,0x21,0xFC,0x0F,0x22,0x21,
0x00,0x00,0x22,0x21,0x04,0x01,0x22,0x3F,0x04,0x21,0x3E,0x21,0x7C,0x19,0x22,0x21,
0x04,0x07,0x80,0x20,0x04,0x21,0x80,0x20,0x64,0x21,0x40,0x28,0x1C,0x3E,0x20,0x10  
};
const unsigned char Nanning[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,
0x80,0x00,0xFE,0x7F,0x80,0x00,0x02,0x40,0xFE,0x3F,0x01,0x20,0x12,0x24,0x00,0x00,
0x22,0x22,0xFC,0x1F,0xF2,0x27,0x80,0x00,0x82,0x20,0x80,0x00,0x82,0x20,0x80,0x00,
0xFA,0x2F,0x80,0x00,0x82,0x20,0x80,0x00,0x82,0x20,0x80,0x00,0x82,0x28,0xA0,0x00  
};
const unsigned char Haikou[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x88,0x3F,0xFC,0x1F,
0x48,0x00,0x04,0x10,0xA1,0x1F,0x04,0x10,0x82,0x10,0x04,0x10,0x92,0x12,0x04,0x10,
0x90,0x14,0x04,0x10,0xE8,0x7F,0x04,0x10,0x88,0x10,0x04,0x10,0x47,0x12,0x04,0x10,
0x44,0x14,0x04,0x10,0xC4,0x3F,0x04,0x10,0x04,0x10,0xFC,0x1F,0x04,0x0A,0x04,0x10  
};
const unsigned char Foshan[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x88,0x04,0x80,0x00,0x88,0x04,0x80,0x00,0x88,0x04,0x80,0x00,
0xF4,0x3F,0x80,0x00,0x84,0x24,0x84,0x10,0x86,0x24,0x84,0x10,0xE6,0x3F,0x84,0x10,
0xA5,0x04,0x84,0x10,0x94,0x04,0x84,0x10,0xF4,0x7F,0x84,0x10,0x84,0x44,0x84,0x10,
0x84,0x44,0x84,0x10,0x44,0x54,0x84,0x10,0x44,0x24,0xFC,0x1F,0x24,0x04,0x00,0x10  
};

//標記的小點點影像: 8X16px  sizeof:16B
const unsigned char lb_dot[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x3E,0x3E,0x3E,0x1C,0x00,0x00,0x00,0x00,0x00  
};

//"設定"字樣: 32X16px sizeof:128B
const unsigned char lb_set[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x84,0x0F,0xFE,0x3F,0x88,0x08,0x22,0x22,0x88,0x08,0xFE,0x3F,
0x80,0x08,0x80,0x00,0x40,0x70,0xFE,0x3F,0x2F,0x00,0x80,0x00,0xC8,0x1F,0xF8,0x0F,
0x88,0x10,0x08,0x08,0x88,0x08,0xF8,0x0F,0x08,0x09,0x08,0x08,0x28,0x05,0xF8,0x0F,
0x18,0x02,0x08,0x08,0x08,0x05,0xF8,0x0F,0xC0,0x18,0x08,0x08,0x30,0x60,0xFF,0x7F  
};

//"1"字樣: 8X13px sizeof:13B
const unsigned char lb_num1[] U8X8_PROGMEM = {
0x00,0x10,0x1C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00
};
//"2"字樣: 8X13px sizeof:13B
const unsigned char lb_num2[] U8X8_PROGMEM = {
0x00,0x3C,0x42,0x42,0x42,0x40,0x20,0x10,0x08,0x04,0x42,0x7E,0x00  
};
//"3"字樣: 8X13px sizeof:13B
const unsigned char lb_num3[] U8X8_PROGMEM = {
0x00,0x3C,0x42,0x42,0x40,0x20,0x18,0x20,0x40,0x42,0x42,0x3C,0x00  
};
//"4"字樣: 8X13px sizeof:13B
const unsigned char lb_num4[] U8X8_PROGMEM = {
0x00,0x20,0x30,0x30,0x28,0x24,0x24,0x22,0xFE,0x20,0x20,0xF8,0x00  
};
//"/"字樣: 8X13px sizeof:13B
const unsigned char lb_slash[] U8X8_PROGMEM = {
0x40,0x20,0x20,0x20,0x10,0x10,0x08,0x08,0x08,0x04,0x04,0x02,0x02  
};

//"成功"字樣: 32X16px sizeof:128B
const unsigned char lb_success[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x02,0x00,0x12,0x00,0x02,0x00,0x02,0x00,0x02,
0xFC,0x7F,0x7F,0x02,0x04,0x02,0x88,0x3F,0x04,0x02,0x08,0x22,0x04,0x22,0x08,0x22,
0x7C,0x22,0x08,0x22,0x44,0x22,0x08,0x22,0x44,0x14,0x08,0x21,0x44,0x14,0x08,0x21,
0x44,0x48,0x78,0x21,0x54,0x4C,0x8F,0x20,0x22,0x52,0x82,0x20,0x02,0x61,0x40,0x14  
};

//“失敗”字樣:  32X16px sizeof:128B
const unsigned char lb_failure[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x02,0x88,0x00,0x3E,0x02,0x88,0x00,0x22,0x02,
0x88,0x00,0x2A,0x01,0xFC,0x1F,0x2A,0x7F,0x84,0x00,0xAA,0x10,0x82,0x00,0x6A,0x11,
0x80,0x00,0x2A,0x11,0xFF,0x7F,0x2A,0x11,0x40,0x01,0x2A,0x0A,0x20,0x02,0x2A,0x0A,
0x20,0x02,0x08,0x04,0x10,0x04,0x14,0x0A,0x08,0x08,0x24,0x11,0x04,0x10,0xA2,0x20  
};


/*“天氣”中的影像字樣*/

//“請求”字樣: 32X16px
const unsigned char lb_request[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x02,0x80,0x04,0x02,0x02,0x80,0x08,0xE4,0x3F,0x80,0x00,
0x04,0x02,0xFE,0x3F,0xC0,0x1F,0x80,0x00,0x00,0x02,0x84,0x10,0xE7,0x7F,0x88,0x08,
0x04,0x00,0x90,0x05,0xC4,0x1F,0xC0,0x02,0x44,0x10,0xA0,0x04,0xC4,0x1F,0x90,0x08,
0x44,0x10,0x88,0x10,0xD4,0x1F,0x86,0x60,0x4C,0x10,0x80,0x00,0x44,0x14,0xA0,0x00  
};

//"中,,,"字樣: 32X16px
const unsigned char lb_ing[] U8X8_PROGMEM = {
0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
0x80,0x00,0x00,0x00,0xFC,0x1F,0x00,0x00,0x84,0x10,0x00,0x00,0x84,0x10,0x00,0x00,
0x84,0x10,0x00,0x00,0x84,0x10,0x00,0x00,0x84,0x10,0x00,0x00,0xFC,0x1F,0x00,0x00,
0x84,0x10,0x00,0x00,0x80,0x00,0xE7,0x1C,0x80,0x00,0xA5,0x14,0x80,0x00,0xE7,0x1C  
};


void setup() {
  delay(3000);
  ESP.wdtEnable(9000);             //設定看門狗復位的時間為9s
  Serial.begin(115200);
  pinMode(15,OUTPUT);               //將gpio15(SS)作為輸出引腳,表明作為主機
  pinMode(10,OUTPUT);               //gpio10連接螢屏的片選(cs)
  pinMode(4,OUTPUT);                //gpio4連接sd卡模塊片選(cs)
  client.setTimeout(HTTP_TIMEOUT);  //設定http最大回應時間為5s
  delay(100);

  if(SD.begin(4)){              //如果成功打開sd卡則讀取上一次設定的城市
    sd_initial = true;          //成功初始化
    Get_initial_data();
  }
  else{                           //失敗則拉高gpio4,拉低gpio10
    Serial.println("sd unopen");
    digitalWrite(4,HIGH);
    digitalWrite(10,LOW);
  }
  
  WiFi.mode(WIFI_STA);          //設定wifi為station模式
  WiFi.disconnect();            //斷開網路連接,清除上一次保存的接入點
  delay(2000);
  
  oled.begin();                 //繪制開機影像
  oled.firstPage();
  do{
    oled.drawXBMP(20,7,88,50,pb_start);
  }while(oled.nextPage());

  while(analogRead(A0) <= null_bt + 30){ESP.wdtFeed();}     //隨便按一個按鍵進入主界面,回圈時要喂狗
  delay(700);
}

void loop() {

  s = 0;
  main_Interface();       //進入主界面
  
  if(s == 1)              //s的數值對應在主界面函式中的選擇,1進入“工具”,2進入“網路”,3進入“天氣”
    city_Set();
  else if(s == 2)
    smart_Config();
  else if(s == 3)
    weather_Report();
    
  delay(50);
}


void Get_initial_data(){              //初始化時讀取sd卡上次設定保存的城市,保存在“INITIAL_DATA.txt”的文本中,以 #城市編碼@ 的格式保存
  
    ESP.wdtFeed();                  //喂狗
    Serial.println("sd open");
    bool sy = false;                //讀取標志,#開始,@結束        
    bool is_read = false;           //有無讀取到資料的標志
    short int tmp = 0;
    digitalWrite(10,HIGH);        
    digitalWrite(4,LOW);          //拉低4拉高10,選擇sd卡模塊為從機
    delay(10);

    myFile = SD.open("INITIAL_DATA.txt", FILE_READ);
    delay(10);
    if(myFile){
      Serial.println("Read data..");
      while(myFile.available()){
        char ch = myFile.read();
        if(sy && ch >= 48 && ch <= 57){         //將讀到的字符轉換為數字
          tmp = tmp * 10 + (ch - 48);
        }
        if(ch == '#')
         sy = true;
        if(ch == '@')
         sy = false;

         delay(2);
      }
      is_read = true;
      Serial.println("read done");
      myFile.close();
    }
    else{
      Serial.println("error open");
    }
    if(tmp >= 0 && tmp <= City_Code_MAX && is_read){      //資料大于等于零,且小于等于最大城市編碼,且是從sd卡中讀取的,則認為合法
      City_Code = tmp;                                    //城市編碼改變為從sd卡中讀取的資料
      City_ID = String(FPSTR(ID[tmp]));                   //城市ID改變
      Serial.println(City_Code);
      Serial.println(City_ID);
    }
      
    digitalWrite(4,HIGH);
    digitalWrite(10,LOW);           //重新把螢屏作為從機
    delay(10);
    return ;
}



void main_Interface(){        //主界面函式,兩層回圈

  while(1){
    oled.firstPage();
    do{
      main_interface_draw();      //當進入主界面時或者小回圈break時重新繪制
    }while(oled.nextPage());
    delay(150);
    
  while(1){
    ESP.wdtFeed();      //喂狗
    
    if(WiFi.status() != WL_CONNECTED && has_net){       //兩種情況: 界面右上角網路標志顯示有網實際沒網,標志顯示斷網實際連接上網路,重繪頁面
        WiFi.disconnect();
        WiFi.setAutoConnect(false);             //斷網時,斷開連接,取消自動連接
        has_net = false;
        break;
      }
    else if(WiFi.status() == WL_CONNECTED && !has_net){
      has_net = true;
      Serial.println("net ok");
      break;
    }
    
    int value = analogRead(A0);                           //時刻掃描A0口的讀取數值
    if(value >= left_bt - 30 && value <= left_bt + 30){   //按下左鍵
      --s;
      if(s < 0)
        s = 3;
      break;
    }
    else if(value >= right_bt - 30 && value <= right_bt + 30){      //按下右鍵
      s = (s + 1) % 4;
      break; 
    }
    else if(value >= enter_bt - 30 && value <= enter_bt + 30 && s)    //按下回車
      return ;  
    }
  delay(4);
  }
}

void main_interface_draw(){             //主界面繪制函式

  if(has_net)
  oled.drawXBMP(102,0,8,8,on_line);
  else
  oled.drawXBMP(102,0,8,8,off_line);
  
  oled.drawXBMP(112,0,16,8,battery);
  
  if(s == 0){ 
    oled.drawXBMP(52,0,24,13,lb_menu);
    oled.drawXBMP(0,16,40,40,pb_tool);
    oled.drawXBMP(42,16,40,40,pb_net);
    oled.drawXBMP(84,16,40,40,pb_weather);
  }
  else if(s == 1){                            //選擇選單中哪個選項,則將影像陣列元素取反,保存到全域陣列中,顯示此陣列就有被選擇的效果了
    oled.drawXBMP(52,0,24,13,lb_tool);
    for(int i = 0; i < 200; ++i){
      selected[i] = ~(unsigned char)pgm_read_byte(&pb_tool[i]);
    }
      
    delay(4);
    oled.drawXBM(0,16,40,40,selected);
    oled.drawXBMP(42,16,40,40,pb_net);
    oled.drawXBMP(84,16,40,40,pb_weather);
  }
  else if(s == 2){
    oled.drawXBMP(52,0,24,13,lb_net);
    for(int i = 0; i < 200; ++i){
      selected[i] = ~(unsigned char)pgm_read_byte(&pb_net[i]);
    }
      delay(4);
    oled.drawXBMP(0,16,40,40,pb_tool);
    oled.drawXBM(42,16,40,40,selected);
    oled.drawXBMP(84,16,40,40,pb_weather);
  }
  else if(s == 3){
    oled.drawXBMP(52,0,24,13,lb_weather);
   for(int i = 0; i < 200; ++i){
      selected[i] = ~(unsigned char)pgm_read_byte(&pb_weather[i]);
    }
      delay(4);
    oled.drawXBMP(0,16,40,40,pb_tool);
    oled.drawXBMP(42,16,40,40,pb_net);
    oled.drawXBM(84,16,40,40,selected);
  }
  delay(6);
  return ;
}



void smart_Config(){

  bool Reset = true;                //以一鍵配網還是wifi.begin()方式聯網的標志
  short int signals = 0;            //四幅wifi影像畫哪一幅
  short int times = 0;              //記錄進入等待配網的時間,防止死回圈,到時間未配網則退出
  WiFi.mode(WIFI_STA);
  WiFi.setAutoConnect(false);
  WiFi.stopSmartConfig();
  WiFi.disconnect();
  delay(1500);

  if(ssid != "" && password != ""){         //此前未配過網
    oled.firstPage();
    do{
      oled.drawXBMP(32,24,32,16,lb_renew);
      oled.drawXBMP(64,24,32,16,lb_set);
      oled.drawXBMP(32,44,16,16,lb_yes);
      oled.drawXBMP(80,44,16,16,lb_no);
    }while(oled.nextPage());

    while(1){
      ESP.wdtFeed();
      int value = analogRead(A0);
      if(value >= left_bt - 30 && value <= left_bt + 30){           //選了重新配網
        ssid = ""; password = ""; break;
      }
      else if(value >= right_bt - 30 && value <= right_bt + 30){      //選了以wifi.begin(ssid,password)的方式聯網
        Reset = false; break;}
    }
  }
  
  if(Reset){                              //一鍵配網
    WiFi.beginSmartConfig();
    Serial.println("\n\rWait for smartConfig.");
    while(1){
      ESP.wdtFeed();
      oled.firstPage();
      do{
        config_draw(signals);
      }while(oled.nextPage());
      signals = (signals + 1) % 4;
    
      int value = analogRead(A0);
      if(value >= exit_bt - 30 && value <= exit_bt + 30){
        WiFi.stopSmartConfig();
        WiFi.setAutoConnect(false);
        WiFi.disconnect();
        delay(2000);
        return ;
      }
      delay(725);
    
      if(WiFi.smartConfigDone()){                       //配網成功
        Serial.println("smartconfig successed.");
        Serial.printf("SSID: %s\n\r", WiFi.SSID().c_str());
        Serial.printf("PSW: %s\n\r", WiFi.psk().c_str());
        ssid = WiFi.SSID();
        password = WiFi.psk();        //配網的賬號密碼保存起來以便聯網不成功再次進入“網路”聯接網路
        WiFi.setAutoConnect(true);
        break;
      }
      else if(times == 25){           //到時間未配網則退出
        WiFi.stopSmartConfig();
        WiFi.setAutoConnect(false);
        WiFi.disconnect();
        delay(2000);
        return ;
      }
      ++times;
    }
  }
  else{
    WiFi.begin(ssid.c_str(), password.c_str());       //選了否,wifi.begin(ssid,password)形式聯網
    delay(100);
    while(WiFi.status() != WL_CONNECTED && times <= 11){
      ESP.wdtFeed();
      ++times;
      oled.firstPage();
      do{
        config_draw(signals);
      }while(oled.nextPage());
      signals = (signals + 1) % 4;
      delay(550);
    }
  }
  
  oled.firstPage();           //動態的wifi連接圖片效果
    do{
      oled.drawXBMP(32,15,32,16,lb_set);
      oled.drawXBMP(64,15,32,16,lb_success);
    }while(oled.nextPage());
    delay(2000);
    return ;
}

void config_draw(short int k){
  if(k == 0)
    oled.drawXBMP(0,8,48,48,pb_signal_full);
  else if(k == 1)
    oled.drawXBMP(0,8,48,48,pb_signal_none);
  else if(k == 2)
    oled.drawXBMP(0,8,48,48,pb_signal_low);
  else if(k == 3)
    oled.drawXBMP(0,8,48,48,pb_signal_mid);

  oled.setFont(u8g2_font_osb18_tf);
  oled.drawStr(50,20,"WiFi");
  oled.drawXBMP(58,25,56,16,lb_config);
}



void city_Set(){                    //城市設定
  short int dpl = City_Code;
  while(1){
    oled.firstPage();
    do{
      city_set_draw(dpl);         //dpl為當前選擇的城市編碼
    }while(oled.nextPage());
    delay(150);

    while(1){
      ESP.wdtFeed();
      int value = analogRead(A0);
      if(value >= exit_bt - 30 && value <= exit_bt + 30)      //退出鍵直接退出
        return ;
      else if(value >= left_bt - 30 && value <= left_bt + 30){        //左鍵
        dpl--;
        if(dpl < 0)
        dpl = City_Code_MAX;
        Serial.println(dpl);
        delay(2);
        break;
      }
      else if(value >= right_bt - 30 && value <= right_bt + 30){    //右鍵
        dpl = (dpl + 1) % (City_Code_MAX + 1);
        Serial.println(dpl);
        delay(2);
        break;
      }
      else if(value >= enter_bt - 30 && value <= enter_bt + 30){      //確定鍵
        City_Code = dpl;
        City_ID = String(FPSTR(ID[dpl]));
        Serial.println(City_Code);
        Serial.println(City_ID);
        oled.firstPage();
        do{
          city_set_draw(-1, true);          //設定完成,繪制提示字樣“設定成功”
        }while(oled.nextPage());
        delay(2000);
        ESP.wdtFeed();
        return ;
      }
      delay(4);
    }
  }
}

void city_set_draw(short int dpl, bool setdone){
  
  if(setdone){
    if(sd_initial){
      city_set_store();       //設定成功的時候把設定的城市編碼寫入sd卡
    }
    oled.drawXBMP(32,15,32,16,lb_set);
    oled.drawXBMP(64,15,32,16,lb_success);
    draw_city_character(48,33,City_Code);
    delay(2);
  }
  
  else{
    if(dpl / 9 == 0){
      oled.drawXBMP(52,51,8,13,lb_num1);
      oled.drawXBMP(60,51,8,13,lb_slash);
      oled.drawXBMP(68,51,8,13,lb_num4);
      
      oled.drawXBMP(8,0,32,16,Beijing);
      oled.drawXBMP(8,17,32,16,Shanghai);
      oled.drawXBMP(8,34,32,16,Guangzhou);

      oled.drawXBMP(48,0,32,16,Shenzhen);
      oled.drawXBMP(48,17,32,16,Hongkong);
      oled.drawXBMP(48,34,32,16,Macao);
      
      oled.drawXBMP(88,0,32,16,Taipei);
      oled.drawXBMP(88,17,32,16,Tianjin);
      oled.drawXBMP(88,34,32,16,Chongqing);

      short int cx = dpl / 3;
      short int cy = dpl % 3;
      oled.drawXBMP(cx*40, cy*17,8,16,lb_dot);
    }
    else if(dpl / 9 == 1){
      dpl = dpl - 9;
      oled.drawXBMP(52,51,8,13,lb_num2);
      oled.drawXBMP(60,51,8,13,lb_slash);
      oled.drawXBMP(68,51,8,13,lb_num4);
      
      oled.drawXBMP(8,0,32,16,Harbin);
      oled.drawXBMP(8,17,32,16,Changchun);
      oled.drawXBMP(8,34,32,16,Shenyang);

      oled.drawXBMP(48,0,32,16,Urumchi);
      oled.drawXBMP(48,17,32,16,Hohhot);
      oled.drawXBMP(48,34,32,16,Yinchuan);
      
      oled.drawXBMP(88,0,32,16,Shijiazhuang);
      oled.drawXBMP(88,17,32,16,Taiyuan);
      oled.drawXBMP(88,34,32,16,Xining);

      short int cx = dpl / 3;
      short int cy = dpl % 3;
      oled.drawXBMP(cx*40, cy*17,8,16,lb_dot);
    }
    else if(dpl / 9 == 2){
      dpl = dpl - 18;
      oled.drawXBMP(52,51,8,13,lb_num3);
      oled.drawXBMP(60,51,8,13,lb_slash);
      oled.drawXBMP(68,51,8,13,lb_num4);
      
      oled.drawXBMP(8,0,32,16,Jinan);
      oled.drawXBMP(8,17,32,16,Lanzhou);
      oled.drawXBMP(8,34,32,16,Zhengzhou);

      oled.drawXBMP(48,0,32,16,Xian);
      oled.drawXBMP(48,17,32,16,Nanjing);
      oled.drawXBMP(48,34,32,16,Hefei);
      
      oled.drawXBMP(88,0,32,16,Hangzhou);
      oled.drawXBMP(88,17,32,16,Wuhan);
      oled.drawXBMP(88,34,32,16,Chengdu);

      short int cx = dpl / 3;
      short int cy = dpl % 3;
      oled.drawXBMP(cx*40, cy*17,8,16,lb_dot);
    }
    else if(dpl / 9 == 3){
      dpl = dpl - 27;
      oled.drawXBMP(52,51,8,13,lb_num4);
      oled.drawXBMP(60,51,8,13,lb_slash);
      oled.drawXBMP(68,51,8,13,lb_num4);
      
      oled.drawXBMP(8,0,32,16,Lhasa);
      oled.drawXBMP(8,17,32,16,Nanchang);
      oled.drawXBMP(8,34,32,16,Changsha);

      oled.drawXBMP(48,0,32,16,Guiyang);
      oled.drawXBMP(48,17,32,16,Fuzhou);
      oled.drawXBMP(48,34,32,16,Kunming);
      
      oled.drawXBMP(88,0,32,16,Nanning);
      oled.drawXBMP(88,17,32,16,Haikou);
      oled.drawXBMP(88,34,32,16,Foshan);

      short int cx = dpl / 3;
      short int cy = dpl % 3;
      oled.drawXBMP(cx*40, cy*17,8,16,lb_dot);
    }
    delay(2);
  }
   return ; 
}

void city_set_store(){        //設定城市編碼寫入sd卡,按#數字@的格式
  ESP.wdtFeed();
  digitalWrite(10,HIGH);
  digitalWrite(4,LOW);
  delay(5);

    myFile = SD.open("INITIAL_DATA.txt", sdfat::O_READ | sdfat::O_WRITE | sdfat::O_CREAT);
    delay(10);
    if(myFile){
      Serial.println("Write data..");
      myFile.println("#" + String(City_Code) + "@");
      delay(4);
      myFile.close();
      Serial.println("store success");
      digitalWrite(10,LOW);
      digitalWrite(4,HIGH);
    }
    else
    {
      Serial.println("file op fail");
      digitalWrite(10,LOW);
      digitalWrite(4,HIGH);
    } 
    delay(3); 
}



void weather_Report(){

  ESP.wdtFeed();
  oled.firstPage();
  do{
    oled.drawXBMP(32,24,32,16,lb_request);
    oled.drawXBMP(64,24,32,16,lb_ing);
  }while(oled.nextPage());
  delay(1000);

  
  if(WiFi.status() != WL_CONNECTED){        //無網路例外
    request_fail();
    return ;   
  }
  
  short int times = 0;
  while (!client.connected()){        //建立tcp連接
    ESP.wdtFeed();
    if (!client.connect(host, 80)){
        Serial.print(".");
        delay(500);
        ++times;
     }
     if(times == 15){
      request_fail();
      return;
     }
  }
  
  if (SendRequest() && skipResponseHeaders()) {   //發送請求,跳過回應頭部
    memset(response, 0, sizeof(response));
    readReponseContent(response);
    WeatherData weatherData;
    if (AnalyseData(response, &weatherData)) {    //決議資料,存到結構中
      exchange(&weatherData);       //將結構中的字符資料轉換為整形資料
      printData(&weatherData);
      weather_Readpic();            //從sd卡中讀儲存天氣影像文字的陣列
      weather_report_draw();
      while(analogRead(A0) <= null_bt + 30){ESP.wdtFeed();}
      return ;
    }
    else{
      request_fail();   //決議資料例外
      return ;
    }
  }
  else{
    request_fail();   //無回應或回應內容非法例外
    return ;
  } 
}


bool SendRequest(){       //發送url請求
  
  String Url = "/v3/weather/now.json?key=";
  Url += key;
  Url += "&location=";
  Url += City_ID;
  Url += "&language=";
  Url += language;
  client.print(String("GET ") + Url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  Serial.println("create a request:");
  Serial.println(String("GET ") + Url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n");
  delay(1000);
  return true;
}

bool skipResponseHeaders() {      //跳過回應頭部
  
  bool is_found = client.find(endOfHeaders);
  if (!is_found) {
    Serial.println("No response or invalid response!");
  }
  return is_found;
}

void readReponseContent(char* content) {                    //保存回應json資料到content陣列中
  int len = client.readBytes(content, MAX_CONTENT_SIZE);
  delay(100);
  Serial.println("Get the data from Internet!");
  content[len] = 0;
  Serial.println(content);
  Serial.println("Read data Over!");
  client.flush();
}

bool AnalyseData(char* content, struct WeatherData* weatherData) {      //決議json資料保存到結構中

  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(content);
   
  if (!root.success()) {
    Serial.println("JSON parsing failed!");
    return false;
  }
    
  strcpy(weatherData->code, root["results"][0]["now"]["code"]);
  strcpy(weatherData->temperature, root["results"][0]["now"]["temperature"]);
  return true;
}
   
void exchange(const struct WeatherData* weatherData){           //結構中資料整形轉換
  short int t1 = 0;
  short int t2 = 0;
  for(short int i = 0; i < 8; ++i){
    if(weatherData->code[i] >= 48 && weatherData->code[i] <= 57)
      t1 = t1 * 10 + (weatherData->code[i] - 48);
    if(weatherData->temperature[i] >= 48 && weatherData->temperature[i] <= 57)
      t2 = t2 * 10 + (weatherData->temperature[i] - 48);
  }
  if((t1 >= 0 && t1 <= 38) || (t1 == 99))
    weather_Code = t1;
  if(t2 > 0 && t2 < 60)
    temper = t2;
}

void printData(const struct WeatherData* weatherData) {
  Serial.println("Print parsed data :");
  Serial.print("Code : ");
  Serial.print(weatherData->code);
  Serial.print(", \t");
  Serial.print("Temp : ");
  Serial.print(weatherData->temperature);
  Serial.print(" C");
  Serial.println("\r\n");
  Serial.println(weather_Code);
  Serial.println(temper);
}

void weather_Readpic(){           //sd卡文本中讀取天氣影像字樣陣列
  digitalWrite(10,HIGH);
  digitalWrite(4,LOW);
  delay(10);

  String tmp = (String)weather_Code + ".txt";       //讀取影像
  myFile = SD.open(tmp.c_str(), FILE_READ);
  delay(10);
  if(myFile){
    unsigned short int s = 0;
    unsigned char tmp = 0;
    Serial.println("read pb");
    while(myFile.available()){
      unsigned char ch = myFile.read();
      if(ch >= 48 && ch <= 57)
        tmp = tmp * 16 + (ch - 48);
      else if(ch >= 65 && ch <= 70)
        tmp = tmp * 16 + (ch - 55);
      else if(ch == ','){
         weather_pb[s] = tmp; 
         tmp = 0;
         ++s;
      }
    }
    weather_pb[s] = tmp;
    myFile.close();
    delay(4);
  }
  
  tmp = (String)weather_Code + "c.txt";           //讀取文字
  myFile = SD.open(tmp.c_str(), FILE_READ);
  delay(10);
  if(myFile){
    unsigned short int s = 0;
    unsigned char tmp = 0;
    Serial.println("read lb");
    while(myFile.available()){
      unsigned char ch = myFile.read();
      if(ch >= 48 && ch <= 57)
        tmp = tmp * 16 + (ch - 48);
      else if(ch >= 65 && ch <= 70)
        tmp = tmp * 16 + (ch - 55);
      else if(ch == ','){
         weather_lb[s] = tmp; 
         tmp = 0;
         ++s;
      }
    }
    weather_lb[s] = tmp;
    myFile.close();
    delay(4);
  }

  digitalWrite(4,HIGH);
  digitalWrite(10,LOW);
  delay(10);
  return ;
}

void weather_report_draw(){           //繪制天氣影像文字,影像都為64X64px,文字都為32X16px
  
    String tmp = (String)temper;
    tmp += "c"; 
    oled.firstPage();
    do{
    oled.drawXBM(0,0,64,64,weather_pb);
    oled.drawXBM(64,39,32,16,weather_lb);
    oled.setFont(u8g2_font_osr29_tf);
    oled.drawStr(63,30,tmp.c_str());
    oled.drawCircle(111,5,2);
    draw_city_character(96, 39, City_Code);
    }while(oled.nextPage());
    delay(4);
} 

void request_fail(){
  Serial.println("request fail");
  client.flush();
  client.stop();
  oled.firstPage();
  do{
    oled.drawXBMP(32,24,32,16,lb_request);
    oled.drawXBMP(64,24,32,16,lb_failure);
  }while(oled.nextPage());
  delay(1500);
}

void draw_city_character(short int x, short int y, short int num){      //城市文字繪制,城市文字都為32X16px
    if(num == 0)
      oled.drawXBMP(x,y,32,16,Beijing);
    else if(num == 1)
      oled.drawXBMP(x,y,32,16,Shanghai);
    else if(num == 2)
      oled.drawXBMP(x,y,32,16,Guangzhou);
    else if(num == 3)
      oled.drawXBMP(x,y,32,16,Shenzhen);
    else if(num == 4)
      oled.drawXBMP(x,y,32,16,Hongkong);
    else if(num == 5)
      oled.drawXBMP(x,y,32,16,Macao);
    else if(num == 6)
      oled.drawXBMP(x,y,32,16,Taipei);
    else if(num == 7)
      oled.drawXBMP(x,y,32,16,Tianjin);
    else if(num == 8)
      oled.drawXBMP(x,y,32,16,Chongqing);
    else if(num == 9)
      oled.drawXBMP(x,y,32,16,Harbin);
    else if(num == 10)
      oled.drawXBMP(x,y,32,16,Changchun);
    else if(num == 11)
      oled.drawXBMP(x,y,32,16,Shenyang);
    else if(num == 12)
      oled.drawXBMP(x,y,32,16,Urumchi);
    else if(num == 13)
      oled.drawXBMP(x,y,32,16,Hohhot);
    else if(num == 14)
      oled.drawXBMP(x,y,32,16,Yinchuan);
    else if(num == 15)
      oled.drawXBMP(x,y,32,16,Shijiazhuang);
    else if(num == 16)
      oled.drawXBMP(x,y,32,16,Taiyuan);
    else if(num == 17)
      oled.drawXBMP(x,y,32,16,Xining);
    else if(num == 18)
      oled.drawXBMP(x,y,32,16,Jinan);
    else if(num == 19)
      oled.drawXBMP(x,y,32,16,Lanzhou);
    else if(num == 20)
      oled.drawXBMP(x,y,32,16,Zhengzhou);
    else if(num == 21)
      oled.drawXBMP(x,y,32,16,Xian);
    else if(num == 22)
      oled.drawXBMP(x,y,32,16,Nanjing);
    else if(num == 23)
      oled.drawXBMP(x,y,32,16,Hefei);
    else if(num == 24)
      oled.drawXBMP(x,y,32,16,Hangzhou);
    else if(num == 25)
      oled.drawXBMP(x,y,32,16,Wuhan);
    else if(num == 26)
      oled.drawXBMP(x,y,32,16,Chengdu);
    else if(num == 27)
      oled.drawXBMP(x,y,32,16,Lhasa);
    else if(num == 28)
      oled.drawXBMP(x,y,32,16,Nanchang);
    else if(num == 29)
      oled.drawXBMP(x,y,32,16,Changsha);
    else if(num == 30)
      oled.drawXBMP(x,y,32,16,Guiyang);
    else if(num == 31)
      oled.drawXBMP(x,y,32,16,Fuzhou);
    else if(num == 32)
      oled.drawXBMP(x,y,32,16,Kunming);
    else if(num == 33)
      oled.drawXBMP(x,y,32,16,Nanning);
    else if(num == 34)
      oled.drawXBMP(x,y,32,16,Haikou);
    else if(num == 35)
      oled.drawXBMP(x,y,32,16,Foshan);
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301629.html

標籤:其他

上一篇:樹莓派4B安裝Ubuntu Server 20.04.3 LTS

下一篇:Linux目錄檔案操作命令篇--(作業常用命令的深度使用,小白必收藏)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more