1讼溺、硬件
用一個四博智聯(lián)提供的nodemcu楣号。一個OLED屏,一個USB線怒坯,4根杜邦線炫狱,可以上網(wǎng)的路由器,電腦剔猿。
? ???3V3---VCC
? ???GND---GND
? ???GPIO4(D2)---SDA
? ???GPIO5(D1)---SCL
2视译、設(shè)置路由器
把路由器賬號設(shè)置為把路由器賬號設(shè)置為
賬號:xh003
密碼:zxd+19901120=
3、燒錄程序
打開ESP_TOOLS下載工具归敬,選擇8266.
工具下載:http://bbs.doit.am/forum.php?mod ... 6&highlight=TOO
點擊START.等待燒錄完成酷含。
燒錄完成后復(fù)位一下nodemcu。等待10s左右汪茧。
測試結(jié)果如下:
Arduino代碼如下:
#include
#include
#include
#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.seniverse.com";
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("www.doit.am",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 jsonBuffer;
//? ? -- 如果堆棧的內(nèi)存池太大呀舔,使用 DynamicJsonBuffer jsonBuffer 代替
??DynamicJsonBuffer jsonBuffer;
??JsonObject& root = jsonBuffer.parseObject(content);
??if (!root.success()) {
? ? Serial.println("JSON parsing failed!");
? ? return false;
??}
??//復(fù)制我們感興趣的字符串
??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"]);
??//??-- 這不是強制復(fù)制,你可以使用指針慌闭,因為他們是指向“內(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);? ?? ?//清空
}
轉(zhuǎn)載地址:http://bbs.doit.am/forum.php?mod=viewthread&tid=442&extra=