最近閑的沒事看到我的8266開發(fā)板
突發(fā)奇想做了個迷你天氣預報
用的是0.96寸oled屏幕
源碼在下面 歡迎討論修改
Arduino源程序如下:
- #include <ESP8266WiFi.h>
- #include <ArduinoJson.h>
- #include <Wire.h>
- #include "OLED.h"
- static const char logo[] PROGMEM={
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0x03,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x1f,0x1c,0xf0,0x1f,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x0f,0x00,0x80,0x7f,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xff,0x01,0x00,0xfc,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xfe,0x03,0x00,0xf8,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xfc,0x07,0x00,0xf8,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xf8,0x0f,0x00,0xf0,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xf0,0x1f,0x00,0xf0,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xf0,0x1f,0x00,0xf0,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xf0,0x1f,0x00,0xf0,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xf0,0x1f,0x00,0xf0,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xf0,0x3f,0x00,0xf0,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xf0,0x1f,0x00,0xf8,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xf0,0x0f,0x00,0xf8,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xf8,0x03,0x00,0xfc,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xfc,0x00,0x00,0x7e,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x7f,0x00,0x00,0x7f,0xf8,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x00,0x00,0x00,0x80,0x1f,0x00,0x80,0x7f,0xf8,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x00,0x00,0x00,0xe0,0x07,0x00,0xc0,0x3f,0xf0,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x00,0x00,0x00,0xf8,0x01,0x00,0xe0,0x3f,0xf0,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0x00,0x00,0x7f,0x00,0x00,0xf8,0x3f,0xf0,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0x00,0xe0,0x1f,0x00,0x00,0xfe,0x0f,0xf0,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0x00,0xf8,0x03,0x00,0x80,0xff,0x0f,0xf8,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0x00,0x7e,0x00,0x00,0xe0,0xff,0x01,0xf0,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0x00,0x1f,0x00,0x00,0xf8,0xff,0x00,0xf8,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0xc0,0x0f,0x00,0x00,0xfe,0x7f,0x00,0xfc,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0xe0,0x03,0x00,0x80,0xff,0x1f,0x00,0xfe,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0xf8,0x01,0x00,0xe0,0xff,0x07,0x00,0xfe,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0x7c,0x00,0x00,0xfc,0xff,0x00,0x00,0xfc,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0x3e,0x00,0x00,0xff,0x07,0x00,0x00,0xfc,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0x7f,0x00,0x0f,0x00,0xc0,0xff,0x07,0x00,0x00,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x80,0x07,0x00,0xf0,0xff,0xff,0x0f,0xc0,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xc0,0x03,0x00,0xf8,0xff,0xff,0x3f,0xf8,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xc0,0x01,0x00,0xfe,0xf8,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xe1,0x01,0x00,0x7f,0xc0,0x03,0x87,0x00,0xfe,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xe1,0x00,0xc0,0x7f,0x80,0x01,0x86,0x00,0xfe,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x63,0x00,0xe0,0x7f,0x80,0x01,0x86,0x00,0xfe,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x63,0x00,0xe0,0x7f,0x8c,0x31,0x86,0xc3,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x67,0x00,0xc0,0x7f,0x8c,0x31,0x86,0x83,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x6f,0x00,0xc0,0x7f,0x8c,0x31,0x86,0x83,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x7f,0x00,0xc0,0x7f,0x8c,0x31,0x86,0x83,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0x7f,0x00,0xc0,0x7f,0x8c,0x31,0x86,0x83,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x00,0x80,0x7f,0x80,0x01,0x86,0x83,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x01,0x00,0x7f,0x80,0x01,0x86,0x83,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x03,0x00,0x7c,0xc0,0x03,0x87,0x83,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x07,0x00,0xf8,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x0f,0x00,0xe0,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xfe,0x07,0xfc,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f
- };
- //GPIO4(SDA) GPIO5(SCL)
- OLED display(4, 5);
-
- const char* ssid = "xh003"; // XXXXXX -- 使用時請修改為當前你的 wifi ssid
- const char* password = "zxd+19901120="; // XXXXXX -- 使用時請修改為當前你的 wifi 密碼
- const char* host = "api.seniversecom";
- const char* APIKEY = "wcmquevztdy1jpca"; //API KEY
- const char* city = "shenzhen";
- const char* language = "en";//zh-Hans 簡體中文 會顯示亂碼
-
- const unsigned long BAUD_RATE = 115200; // serial connection speed
- const unsigned long HTTP_TIMEOUT = 5000; // max respone time from server
- const size_t MAX_CONTENT_SIZE = 1000; // max size of the HTTP response
-
- // 我們要從此網(wǎng)頁中提取的數(shù)據(jù)的類型
- struct UserData {
- char city[16];//城市名稱
- char weather[32];//天氣介紹(多云...)
- char temp[16];//溫度
- char udate[32];//更新時間
- };
-
- WiFiClient client;
- char response[MAX_CONTENT_SIZE];
- char endOfHeaders[] = "\r\n\r\n";
-
- /**
- * @Desc 初始化操作
- */
- void setup() {
- WiFi.mode(WIFI_STA); //設(shè)置esp8266 工作模式
- Serial.begin(BAUD_RATE);
- delay(10);
- Serial.println();
- Serial.println();
- Serial.print("Connecting to ");//寫幾句提示,哈哈
- Serial.println(ssid);
- WiFi.begin(ssid, password); //連接wifi
- while (WiFi.status() != WL_CONNECTED) {
- //這個函數(shù)是wifi連接狀態(tài),返回wifi鏈接狀態(tài)
- delay(100);
- Serial.print(".");
- }
- Serial.println("");
- Serial.println("WiFi connected");
- delay(100);
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());//WiFi.localIP()返回8266獲得的ip地址
- client.setTimeout(HTTP_TIMEOUT);
- }
-
- /**
- * @Desc 主函數(shù)
- */
- void loop() {
- //初始化oled
- display.begin();
- //測試顯示信息
- display.print("Hello DOIT",2,3);
- display.print("doitam",4,3);
- delay(2*1000);
- display.clear();
- while (!client.connected()){
- if (!client.connect(host, 80)){
- Serial.println("connection....");
- delay(100);
- }
- }
- if (sendRequest(host, city, APIKEY) && skipResponseHeaders()) {
- clrEsp8266ResponseBuffer();
- readReponseContent(response, sizeof(response));
- UserData userData;
- if (parseUserData(response, &userData)) {
- printUserData(&userData);
- }
- }
- delay(300);//每5s調(diào)用一次
- }
-
- /**
- * @發(fā)送請求指令
- */
- bool sendRequest(const char* host, const char* cityid, const char* apiKey) {
- // We now create a URI for the request
- //心知天氣
- String GetUrl = "/v3/weather/now.json?key=";
- GetUrl += apiKey;
- GetUrl += "&location=";
- GetUrl += city;
- GetUrl += "&language=";
- GetUrl += language;
- // This will send the request to the server
- client.print(String("GET ") + GetUrl + " HTTP/1.1\r\n" +
- "Host: " + host + "\r\n" +
- "Connection: close\r\n\r\n");
- Serial.println("create a request:");
- Serial.println(String("GET ") + GetUrl + " HTTP/1.1\r\n" +
- "Host: " + host + "\r\n" +
- "Connection: close\r\n");
- delay(100);
- return true;
- }
-
- /**
- * @Desc 跳過 HTTP 頭,使我們在響應(yīng)正文的開頭
- */
- bool skipResponseHeaders() {
- // HTTP headers end with an empty line
- bool ok = client.find(endOfHeaders);
- if (!ok) {
- Serial.println("No response or invalid response!");
- }
- return ok;
- }
-
- /**
- * @Desc 從HTTP服務(wù)器響應(yīng)中讀取正文
- */
- void readReponseContent(char* content, size_t maxSize) {
- size_t length = client.peekBytes(content, maxSize);
- delay(100);
- Serial.println("Get the data from Internet!");
- content[length] = 0;
- Serial.println(content);
- Serial.println("Read data Over!");
- client.flush();//這句代碼需要加上 不然會發(fā)現(xiàn)每隔一次client.find會失敗
- }
-
- /**
- * @Desc 解析數(shù)據(jù)
- * 數(shù)據(jù)格式如下:
- * {
- * "results": [
- * {
- * "location": {
- * "id": "WX4FBXXFKE4F",
- * "name": "北京",
- * "country": "CN",
- * "path": "北京,北京,中國",
- * "timezone": "Asia/Shanghai",
- * "timezone_offset": "+08:00"
- * },
- * "now": {
- * "text": "多云",
- * "code": "4",
- * "temperature": "23"
- * },
- * "last_update": "2017-09-13T09:51:00+08:00"
- * }
- * ]
- *}
- */
- bool parseUserData(char* content, struct UserData* userData) {
- // -- 根據(jù)我們需要解析的數(shù)據(jù)來計算JSON緩沖區(qū)最佳大小
- // 如果你使用StaticJsonBuffer時才需要
- // const size_t BUFFER_SIZE = 1024;
- // 在堆棧上分配一個臨時內(nèi)存池
- // StaticJsonBuffer<BUFFER_SIZE> jsonBuffer;
- // -- 如果堆棧的內(nèi)存池太大,使用 DynamicJsonBuffer jsonBuffer 代替
- DynamicJsonBuffer jsonBuffer;
-
- JsonObject& root = jsonBuffer.parseObject(content);
-
- if (!root.success()) {
- Serial.println("JSON parsing failed!");
- return false;
- }
-
- //復制我們感興趣的字符串
- strcpy(userData->city, root["results"][0]["location"]["name"]);
- strcpy(userData->weather, root["results"][0]["now"]["text"]);
- strcpy(userData->temp, root["results"][0]["now"]["temperature"]);
- strcpy(userData->udate, root["results"][0]["last_update"]);
- // -- 這不是強制復制,你可以使用指針,因為他們是指向“內(nèi)容”緩沖區(qū)內(nèi),所以你需要確保
- // 當你讀取字符串時它仍在內(nèi)存中
- return true;
- }
-
- // 打印從JSON中提取的數(shù)據(jù)
- void printUserData( struct UserData* userData) {
- Serial.println("Print parsed data :");
- display.print("City: ",0,0);
- display.print(userData->city,0,6);
- display.print("Weat: ",2,0);
- display.print(userData->weather,2,6);
- display.print("Temp: ",4,0);
- display.print(userData->temp,4,6);
- // display.print("Last Updata : ",7,2);
- display.print(userData->udate,6,0);
- // display.print("\r\n");
- delay(4*1000);
- }
-
- // 關(guān)閉與HTTP服務(wù)器連接
- void stopConnect() {
- Serial.println("Disconnect");
- client.stop();
- }
-
- void clrEsp8266ResponseBuffer(void){
- memset(response, 0, MAX_CONTENT_SIZE); //清空
- }
復制代碼
51hei.png (2.9 KB, 下載次數(shù): 58)
下載附件
2022-1-25 19:13 上傳
bin文件下載:
ESP8266獲取天氣文件.zip
(191.1 KB, 下載次數(shù): 47)
2022-1-25 10:31 上傳
點擊文件名下載附件
源碼 下載積分: 黑幣 -5
|