文章只涉及程式部分,評論區有完整檔案下載鏈接,有需要自行下載


整個程式:經過多次驗證有效,
#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
標籤:其他
