esp8266 lcd 天氣_ESP8266 顯示實時天氣信息

代碼文件

9f5b29e073a086b09201e78430065416.png

getdata.h

#include

#include

#include

#include

#include

#include

#include

#define DEBUG 1

#define MAX_CONTENT_SIZE 2000

const char* ssid = "weather";

const char* password = "mymymymy";

WiFiClient client;

HTTPClient http;

char response[MAX_CONTENT_SIZE];

const char* HOST = "api.seniverse.com";

const char* APIKEY = "**";

const char* CITY = "haikou";

typedef struct UserData{

char city[16];

char weather[32];

char temp[16];

}data;

data d;

bool parseData(data &d);

data getdata();

bool WifiConfig();

void weather_init();

bool sendRequest(const char* host, const char* cityid, const char* apiKey);

void clearResponseBuffer();

void clearResponseBuffer(){

memset(response, 0, MAX_CONTENT_SIZE); //���

memset(d.city,0,sizeof(d.city));

memset(d.weather,0,sizeof(d.weather));

memset(d.temp,0,sizeof(d.temp));

}

data getdata(){

char error[5] = "NULL";

clearResponseBuffer();

if(sendRequest(HOST,CITY,APIKEY)){

Serial.println("Request success!\n\n");

}

if(parseData(d)){

return d;

}else{

strcpy(d.city,error);

strcpy(d.weather,error);

strcpy(d.temp,error);

return d;

}

}

bool WifiConfig(){

WiFi.begin(ssid,password);

while (WiFi.status() != WL_CONNECTED){

delay(500);

Serial.print(".");

}

Serial.println("Connected success!");

Serial.println("");

Serial.println("IP address: ");

Serial.println(WiFi.localIP());

return true;

}

bool parseData(data &d){

DynamicJsonBuffer jsonBuffer;

JsonObject& root = jsonBuffer.parseObject(response);

if(!root.success()){

Serial.println("JSON parse failed!\n");

return false;

}

strcpy(d.city,root["results"][0]["location"]["name"]);

strcpy(d.weather,root["results"][0]["now"]["text"]);

strcpy(d.temp,root["results"][0]["now"]["temperature"]);

return true;

}

bool sendRequest(const char* host, const char* cityid, const char* apiKey) {

//const char *response;

char *Url = (char *)malloc(0x100);

String payload;

sprintf(Url,"%s%s%s%s%s%s%s","http://",host,"/v3/weather/now.json?key=",apiKey,"&location=",cityid,"&language=en");

Serial.printf("GET URL: %s\n",Url);

http.begin(Url);

int httpCode = http.GET();

if(httpCode>0){

Serial.printf("[HTTP] GET... code: %d\n",httpCode);

if(httpCode == 200){

payload = http.getString();

Serial.println(payload);

}else{

delay(5000);

sendRequest(HOST,CITY,APIKEY);

}

}else{

delay(5000);

sendRequest(HOST,CITY,APIKEY);

}

strcpy(response,payload.c_str()); // convert to const char *

free(Url);

return true;

}

void weather_init(){

WifiConfig();

}

配置完 wifi 之后,請求心知天氣的 API 接口,得到 JSON 數據之后,解析返回主代碼文件。

主代碼文件(.ino)

得到返回的數據體解析并顯示在屏幕上(drawstring),5s 鐘更新一次。

#include // Only needed for Arduino 1.6.5 and earlier

#include "SSD1306Wire.h" // legacy include: `#include "SSD1306.h"`

// or #include "SH1106Wire.h", legacy include: `#include "SH1106.h"`

// For a connection via I2C using brzo_i2c (must be installed) include

// #include // Only needed for Arduino 1.6.5 and earlier

// #include "SSD1306Brzo.h"

// #include "SH1106Brzo.h"

#include // Only needed for Arduino 1.6.5 and earlier

#include "SSD1306Spi.h"

// #include "SH1106SPi.h"

// Initialize the OLED display using SPI

// D5 -> CLK

// D7 -> MOSI (DOUT)

// D0 -> RES

// D2 -> DC

// D8 -> CS

SSD1306Spi display(D0, D2, D8);

// or

// SH1106Spi display(D0, D2);

// Initialize the OLED display using brzo_i2c

// D3 -> SDA

// D5 -> SCL

// SSD1306Brzo display(0x3c, D3, D5);

// or

// SH1106Brzo display(0x3c, D3, D5);

// Initialize the OLED display using Wire library

//SSD1306Wire display(0x3c, D3, D5);

// SH1106 display(0x3c, D3, D5);

#include "getdata.h"

#define DEMO_DURATION 3000

typedef void (*Demo)(void);

int demoMode = 0;

int counter = 1;

void setup() {

Serial.begin(115200);

Serial.println();

Serial.println();

weather_init();

// Initialising the UI will init the display too.

display.init();

display.flipScreenVertically();

display.setFont(ArialMT_Plain_10);

}

void drawFontFaceDemo() {

char city[10];

char weather[20];

char temp[10];

sprintf(city,"%s: %s","City",getdata().city);

sprintf(weather,"%s: %s","Weather",getdata().weather);

sprintf(temp,"%s: %s","temp",getdata().temp);

// create more fonts at http://oleddisplay.squix.ch/

display.setFont(ArialMT_Plain_16);

display.setTextAlignment(TEXT_ALIGN_LEFT);

display.drawString(10, 0, city);

display.drawString(0, 20, weather);

display.drawString(0, 40, temp);

}

void drawTextFlowDemo() {

display.setFont(ArialMT_Plain_10);

display.setTextAlignment(TEXT_ALIGN_LEFT);

display.drawStringMaxWidth(0, 0, 128,

"Lorem ipsum\n dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore." );

}

void drawTextAlignmentDemo() {

// Text alignment demo

display.setFont(ArialMT_Plain_10);

// The coordinates define the left starting point of the text

display.setTextAlignment(TEXT_ALIGN_LEFT);

display.drawString(0, 10, "Left aligned (0,10)");

// The coordinates define the center of the text

display.setTextAlignment(TEXT_ALIGN_CENTER);

display.drawString(64, 22, "Center aligned (64,22)");

// The coordinates define the right end of the text

display.setTextAlignment(TEXT_ALIGN_RIGHT);

display.drawString(128, 33, "Right aligned (128,33)");

}

void drawRectDemo() {

// Draw a pixel at given position

for (int i = 0; i < 10; i++) {

display.setPixel(i, i);

display.setPixel(10 - i, i);

}

display.drawRect(12, 12, 20, 20);

// Fill the rectangle

display.fillRect(14, 14, 17, 17);

// Draw a line horizontally

display.drawHorizontalLine(0, 40, 20);

// Draw a line horizontally

display.drawVerticalLine(40, 0, 20);

}

void drawCircleDemo() {

for (int i=1; i < 8; i++) {

display.setColor(WHITE);

display.drawCircle(32, 32, i*3);

if (i % 2 == 0) {

display.setColor(BLACK);

}

display.fillCircle(96, 32, 32 - i* 3);

}

}

void drawProgressBarDemo() {

int progress = (counter / 5) % 100;

// draw the progress bar

display.drawProgressBar(0, 32, 120, 10, progress);

// draw the percentage as String

display.setTextAlignment(TEXT_ALIGN_CENTER);

display.drawString(64, 15, String(progress) + "%");

display.setTextAlignment(TEXT_ALIGN_LEFT);

display.setFont(ArialMT_Plain_10);

display.drawString(10, 0, "H4lo nb!");

}

//Demo demos[] = {drawFontFaceDemo, drawTextFlowDemo, drawTextAlignmentDemo, drawRectDemo, drawCircleDemo, drawProgressBarDemo, drawImageDemo};

Demo demos[] = {drawFontFaceDemo};

int demoLength = (sizeof(demos) / sizeof(Demo));

long timeSinceLastModeSwitch = 0;

void loop() {

// clear the display

display.clear();

demos[demoMode]();

delay(15000); //延遲

display.setTextAlignment(TEXT_ALIGN_RIGHT);

display.drawString(10, 128, String(millis()));

// write the buffer to the display

display.display();

if (millis() - timeSinceLastModeSwitch > DEMO_DURATION) {

demoMode = (demoMode + 1) % demoLength;

timeSinceLastModeSwitch = millis();

}

counter++;

delay(10);

}

效果

d05a761cdae1a96839205094c225e1b0.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372317.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【VS開發】visual studio 2015的NuGet Manager解決方案管理功能

NuGet的官方說明是&#xff1a;NuGet是一款Visual Studio的擴展&#xff0c;它可以簡單的安裝、升級開源庫和工具。 官網地址&#xff1a;http://www.nuget.org/ 官網最醒目的位置就是下載鏈接&#xff0c;安裝完成后我們來快速體驗一把。 手上有個小項目需要使用到json格式&am…

五. 面向對象高級特性4. 接口的概念和使用

在抽象類中&#xff0c;可以包含一個或多個抽象方法&#xff1b;但在接口(interface)中&#xff0c;所有的方法必須都是抽象的&#xff0c;不能有方法體&#xff0c;它比抽象類更加“抽象”。接口使用 interface 關鍵字來聲明&#xff0c;可以看做是一種特殊的抽象類&#xff0…

智能配料

我們都有多少次聽說“分批處理”會增加延遲&#xff1f; 作為對低延遲系統充滿熱情的人&#xff0c;這讓我感到驚訝。 以我的經驗&#xff0c;正確完成批處理不僅可以提高吞吐量&#xff0c;還可以減少平均延遲并保持一致。 那么&#xff0c;批處理如何神奇地減少延遲呢&#x…

mysql從myisam_將MySQL從MyISAM轉換成InnoDB錯誤和解決辦法

原來自己用的是為了裝的&#xff0c; 所以在設置database usage(如下圖1)的時候按照discuz官方的建議&#xff0c;選的都是Non-Transactional Database Only(只支持MyISAM數據引擎的非事務數據庫)&#xff0c;用MyISAM數據庫&#xff0c;還沒涉及到需要InnoDB&#xff0c;因此打…

相似性度量中用到的一些距離函數

本文目錄 1. 歐氏距離 2. 曼哈頓距離 3. 切比雪夫距離 4. 閔可夫斯基距離 5. 標準化歐氏距離 6. 馬氏距離 7. 漢明距離 8. 杰卡德距離 & 杰卡德相似系數 9. 相關系數 & 相關距離 10. 信息熵 1. 歐氏距離(Euclidean Distance) 歐氏距離是最易于理解的一種距離計算方法&a…

Spring 3.1配置文件和Tomcat配置

Spring 3.1引入了非常有用的功能&#xff0c;稱為配置文件 。 因此&#xff0c;它易于構建&#xff0c;可以在所有環境&#xff08;開發&#xff0c;測試&#xff0c;生產等&#xff09;中部署的軟件包。 通過定義系統屬性spring.profiles.active&#xff0c; Spring允許我們使…

計算1~n之間所有奇數之和_所有奇數長度子數組的和

所有奇數長度子數組的和題目&#xff1a;給你一個正整數數組 arr &#xff0c;請你計算所有可能的奇數長度子數組的和。子數組 定義為原數組中的一個連續子序列。請你返回 arr 中 所有奇數長度子數組的和 。示例 1&#xff1a;輸入&#xff1a;arr [1,4,2,5,3]輸出&#xff1a…

MYSQL AND OR的聯用

MYSQL AND OR的聯用 MYSQL中”AND”和”OR”都是條件控制符。”AND”是求交集&#xff0c;而”OR”則是求并集&#xff0c;非常多情況下&#xff0c;須要聯用它們兩個。下面是兩張表,我僅僅列出實用的字段。 Table:student_score 學生成績 sid(學生ID) cid(課程ID) score(分數)…

九度oj 題目1456:勝利大逃亡

題目描述&#xff1a;Ignatius被魔王抓走了,有一天魔王出差去了,這可是Ignatius逃亡的好機會.魔王住在一個城堡里,城堡是一個A*B*C的立方體,可以被表示成A個B*C的矩陣,剛開始Ignatius被關在(0,0,0)的位置,離開城堡的門在(A-1,B-1,C-1)的位置,現在知道魔王將在T分鐘后回到城堡,I…

JMX:一些入門說明

JMX&#xff08;Java管理擴展&#xff09;是一種J2SE技術&#xff0c;可以管理和監視Java應用程序。 基本思想是實現一組管理對象&#xff0c;并將實現注冊到平臺服務器&#xff0c;在平臺服務器上&#xff0c;可以使用一組連接器或適配器從本地或遠程調用這些實現到JVM。 一個…

解釋java程序中的異常機制_Java編程中的異常機制

本文旨在以初學者的角度來學習Java異常的知識&#xff0c;盡量簡單&#xff0c;一些細枝末節的知識不會講述&#xff0c;但不影響對知識的掌握。&#xff08;比如try-catch可以嵌套&#xff0c;不太會這么用&#xff09;1.什么是異常我們先舉個例子int x 10/0;在IDE里輸入這樣…

keras做多層神經網絡

一、 背景與目的 背景&#xff1a;配置好了theano&#xff0c;弄了gpu&#xff0c; 要學dnn方法。 目的&#xff1a;本篇學習keras基本用法&#xff0c; 學習怎么用keras寫mlp&#xff0c;學keras搞文本的基本要點。 二、 準備 工具包&#xff1a; theano、numpy、keras等工具包…

配置環境變量

由于寫了一個關于生成簽名需要配置環境變量&#xff0c;所以在這里順便把配置環境變量的步驟說一下 1.右鍵點擊計算機&#xff0c;然后點擊高級系統設置 2.點擊環境變量&#xff0c;下方出現的即為系統變量&#xff0c;雙擊path就能直接修改&#xff0c; 轉載于:https://www.cn…

使用JavaFX AnimationTimer

回想一下&#xff0c;給AnimationTimer起個名字可能不是一個好主意&#xff0c;因為它不僅可以用于動畫&#xff0c;還可以用于測量&#xff1a;fps速率&#xff0c;碰撞檢測&#xff0c;模擬步驟&#xff0c;游戲主循環等實際上&#xff0c;大部分時間我都看到了AnimationTime…

python列表姓氏_python數據分析實例(六) 中國姓氏數據

bokeh聯動柱狀圖&#xff0c;Excel空間柱狀圖、空間熱力圖&#xff0c;Echarts空間柱狀圖&#xff0c;常用函數&#xff1a;df[工作地_省] df[工作地].str.split(省).str[0]df[工作地_市] df[工作地_市] df[工作地].str.split(省).str[1].str.split(市).str[0]df[工作地_市][…

JavaFX 2 GameTutorial第3部分

介紹 ?他是與一個六個部分組成的系列的第3部分的JavaFX 2游戲教程。 如果您錯過了第1部分和第2部分 &#xff0c;建議您在開始本教程之前先進行閱讀。 回顧第二部分&#xff0c;我討論了游戲循環的內部工作原理&#xff0c;其中我們使用動畫&#xff08;JavaFX Timeline &…

Selenium WebDriver + python 自動化測試框架

目標 組內任何人都可以進行自動化測試用例的編寫 完全分離測試用例和自動化測試代碼&#xff0c;就像寫手工測試用例一下&#xff0c;編寫excel格式的測試用例&#xff0c;包括步驟、檢查點&#xff0c;然后執行自動化工程&#xff0c;即可執行功能自動化測試用例&#xff0c;包…

mysql游戲減少積分活動圖_plantuml-繪制狀態圖和活動圖和部署圖?

背景狀態圖&#xff1a;對象的所有狀態&#xff0c;以及基于事件發生的狀態改變的過程&#xff1b;活動圖&#xff1a;用例的工作流程&#xff1b;部署圖&#xff1a;系統的軟硬件物理體系結構&#xff1b;狀態圖基本語法元素語法說明開始和結束狀態[*]標識開始和結束狀態箭頭-…

windows中當你的鍵盤無法使用時我們可以用另一種方法哦

1.使用WinR打開cmd窗口 2.輸入osk回車就出現了一個虛擬的小鍵盤啦&#xff0c;當你的鍵盤壞掉后非常實用哦 轉載于:https://www.cnblogs.com/qianzf/p/6780496.html

python web.py 404_找不到web.py開發服務器-favicon.ico-404

py API文檔引用了一個“web.SEE OTHER()”函數&#xff0c;該函數生成一個303 SEE OTHER響應&#xff0c;將瀏覽器重定向到另一個位置。(請參見http://webpy.org/docs/0.3/api#web.application)這是一個服務器端的解決方案&#xff0c;它不需要在html文件中更改頭&#xff1b;如…