Skip to content

Commit 1b60f1d

Browse files
committed
修改代码
1 parent b019615 commit 1b60f1d

File tree

3 files changed

+163
-38
lines changed

3 files changed

+163
-38
lines changed

wifi_weather_oled/wifi_weather_oled.ino

+92-8
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,16 @@
55
* 16X16点阵显示 取模方式 阴码+逐行式+顺向
66
**/
77
#include <ESP8266WiFi.h>
8+
#include <ArduinoJson.h>
9+
//#define DEBUG 是否启用debug功能
810

11+
#ifdef DEBUG
912
#define DebugPrintln(message) Serial.println(message)
1013
#define DebugPrint(message) Serial.print(message)
14+
#else
15+
#define DebugPrintln(message)
16+
#define DebugPrint(message)
17+
#endif
1118
#define LED 2
1219

1320
const unsigned long BAUD_RATE = 115200; // serial connection speed
@@ -25,7 +32,15 @@ char endOfHeaders[] = "\r\n\r\n";
2532
unsigned int flag = HIGH;//默认当前灭灯
2633
long lastTime = 0;
2734
// 请求服务间隔
28-
long Delay = 5000;
35+
long Delay = 20000;
36+
37+
// 我们要从此网页中提取的数据的类型
38+
struct UserData {
39+
char city[16];//城市名称
40+
char weather[32];//天气介绍(多云...)
41+
char temp[16];//温度
42+
char udate[32];//更新时间
43+
};
2944

3045
/**
3146
* @Desc 初始化操作
@@ -34,6 +49,16 @@ void setup() {
3449
Serial.begin(BAUD_RATE);
3550
pinMode(LED,OUTPUT);
3651
digitalWrite(LED, HIGH);
52+
if(!autoConfig()){
53+
smartConfig();
54+
while (WiFi.status() != WL_CONNECTED) {
55+
//这个函数是wifi连接状态,返回wifi链接状态
56+
delay(500);
57+
DebugPrint(".");
58+
}
59+
}
60+
DebugPrintln("IP address: ");
61+
DebugPrintln(WiFi.localIP());//WiFi.localIP()返回8266获得的ip地址
3762
lastTime = millis();
3863
}
3964

@@ -47,11 +72,15 @@ void loop() {
4772
}
4873

4974
if(millis()-lastTime>=Delay){
50-
//每间隔5s左右调用一次
75+
//每间隔20s左右调用一次
5176
lastTime = millis();
5277
if (sendRequest(host, city, APIKEY) && skipResponseHeaders()) {
5378
clrEsp8266ResponseBuffer();
5479
readReponseContent(response, sizeof(response));
80+
UserData userData;
81+
if (parseUserData(response, &userData)) {
82+
sendtoArduino(&userData);
83+
}
5584
}
5685
}
5786

@@ -81,8 +110,8 @@ bool sendRequest(const char* host, const char* cityid, const char* apiKey) {
81110
client.print(String("GET ") + GetUrl + " HTTP/1.1\r\n" +
82111
"Host: " + host + "\r\n" +
83112
"Connection: close\r\n\r\n");
84-
Serial.println("create a request:");
85-
Serial.println(String("GET ") + GetUrl + " HTTP/1.1\r\n" +
113+
DebugPrintln("create a request:");
114+
DebugPrintln(String("GET ") + GetUrl + " HTTP/1.1\r\n" +
86115
"Host: " + host + "\r\n" +
87116
"Connection: close\r\n");
88117
delay(1000);
@@ -96,7 +125,7 @@ bool skipResponseHeaders() {
96125
// HTTP headers end with an empty line
97126
bool ok = client.find(endOfHeaders);
98127
if (!ok) {
99-
Serial.println("No response or invalid response!");
128+
DebugPrintln("No response or invalid response!");
100129
}
101130
return ok;
102131
}
@@ -107,10 +136,10 @@ bool skipResponseHeaders() {
107136
void readReponseContent(char* content, size_t maxSize) {
108137
size_t length = client.peekBytes(content, maxSize);
109138
delay(100);
110-
Serial.println("Get the data from Internet!");
139+
DebugPrintln("Get the data from Internet!");
111140
content[length] = 0;
112-
Serial.println(content);
113-
Serial.println("Read data Over!");
141+
DebugPrintln(content);
142+
DebugPrintln("Read data Over!");
114143
client.flush();//这句代码需要加上 不然会发现每隔一次client.find会失败
115144
}
116145

@@ -130,16 +159,25 @@ bool autoConfig(){
130159
WiFi.mode(WIFI_STA); //设置esp8266 工作模式
131160
WiFi.begin();
132161
delay(2000);//刚启动模块的话 延时稳定一下
162+
DebugPrintln("AutoConfiging ......");
133163
for(int i=0;i<20;i++){
134164
int wstatus = WiFi.status();
135165
if (wstatus == WL_CONNECTED){
166+
DebugPrintln("AutoConfig Success");
167+
DebugPrint("SSID:");
168+
DebugPrintln(WiFi.SSID().c_str());
169+
DebugPrint("PSW:");
170+
DebugPrintln(WiFi.psk().c_str());
171+
digitalWrite(LED, LOW);
136172
return true;
137173
}else{
174+
DebugPrint(".");
138175
delay(1000);
139176
flag = !flag;
140177
digitalWrite(LED, flag);
141178
}
142179
}
180+
DebugPrintln("AutoConfig Faild!");
143181
return false;
144182
}
145183

@@ -150,6 +188,7 @@ void smartConfig()
150188
{
151189
WiFi.mode(WIFI_STA);
152190
delay(2000);
191+
DebugPrintln("Wait for Smartconfig");
153192
// 等待配网
154193
WiFi.beginSmartConfig();
155194
while (1){
@@ -158,9 +197,54 @@ void smartConfig()
158197
digitalWrite(LED, flag);
159198
if (WiFi.smartConfigDone()){
160199
//smartconfig配置完毕
200+
DebugPrintln("SmartConfig Success");
201+
DebugPrint("SSID:");
202+
DebugPrintln(WiFi.SSID().c_str());
203+
DebugPrint("PSW:");
204+
DebugPrintln(WiFi.psk().c_str());
205+
digitalWrite(LED, LOW);
161206
WiFi.setAutoConnect(true); // 设置自动连接
162207
break;
163208
}
164209
}
165210
}
166211

212+
bool parseUserData(char* content, struct UserData* userData) {
213+
// -- 根据我们需要解析的数据来计算JSON缓冲区最佳大小
214+
// 如果你使用StaticJsonBuffer时才需要
215+
// const size_t BUFFER_SIZE = 1024;
216+
// 在堆栈上分配一个临时内存池
217+
// StaticJsonBuffer<BUFFER_SIZE> jsonBuffer;
218+
// -- 如果堆栈的内存池太大,使用 DynamicJsonBuffer jsonBuffer 代替
219+
DynamicJsonBuffer jsonBuffer;
220+
221+
JsonObject& root = jsonBuffer.parseObject(content);
222+
223+
if (!root.success()) {
224+
Serial.println("JSON parsing failed!");
225+
return false;
226+
}
227+
228+
//复制我们感兴趣的字符串
229+
strcpy(userData->city, root["results"][0]["location"]["name"]);
230+
strcpy(userData->weather, root["results"][0]["now"]["text"]);
231+
strcpy(userData->temp, root["results"][0]["now"]["temperature"]);
232+
strcpy(userData->udate, root["results"][0]["last_update"]);
233+
// -- 这不是强制复制,你可以使用指针,因为他们是指向“内容”缓冲区内,所以你需要确保
234+
// 当你读取字符串时它仍在内存中
235+
return true;
236+
}
237+
238+
// 打印从JSON中提取的数据
239+
void sendtoArduino(const struct UserData* userData) {
240+
StaticJsonBuffer<300> jsonBuffer;
241+
// StaticJsonBuffer 在栈区分配内存 它也可以被 DynamicJsonBuffer(内存在堆区分配) 代替
242+
// DynamicJsonBuffer jsonBuffer;
243+
//创建根,也就是顶节点
244+
JsonObject& root = jsonBuffer.createObject();
245+
root["city"] = userData->city;
246+
root["weather"] = userData->weather;
247+
root["temp"] = userData->temp;
248+
root["time"] = userData->udate;
249+
root.printTo(Serial);//单行打印
250+
}

wifi_weather_oled_arduino/code.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,39 @@ static const uint8_t PROGMEM Author_16x16[] ={
3737
0x10,0x00,0x1F,0xFC,0x00,0x04,0x00,0x04,0x7F,0xE4,0x00,0x04,0x00,0x28,0x00,0x10,//鸟4
3838
};
3939

40+
static const uint8_t PROGMEM City_16x16[] ={
41+
0x20,0x28,0x20,0x24,0x20,0x20,0x27,0xFE,0x24,0x20,0xFC,0x20,0x24,0x24,0x27,0xA4,
42+
0x24,0xA4,0x24,0xA8,0x24,0xA8,0x3C,0x90,0xE6,0x92,0x49,0x2A,0x08,0x46,0x10,0x82,//城/0
43+
44+
0x02,0x00,0x01,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,
45+
0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x28,0x21,0x10,0x01,0x00,0x01,0x00//市/1
46+
};
47+
48+
static const uint8_t PROGMEM Temp_16x16[] ={
49+
0x10,0x00,0x10,0x00,0x3F,0xFC,0x20,0x00,0x4F,0xF0,0x80,0x00,0x3F,0xF0,0x00,0x10,
50+
0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0A,0x00,0x0A,0x00,0x06,0x00,0x02,//气/0
51+
52+
0x00,0x00,0x23,0xF8,0x12,0x08,0x12,0x08,0x83,0xF8,0x42,0x08,0x42,0x08,0x13,0xF8,
53+
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x00,0x00//温/1
54+
};
55+
56+
static const uint8_t PROGMEM Weather_16x16[] ={
57+
0x00,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,
58+
0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x10,0x10,0x20,0x08,0xC0,0x06,//天/0
59+
60+
0x10,0x00,0x10,0x00,0x3F,0xFC,0x20,0x00,0x4F,0xF0,0x80,0x00,0x3F,0xF0,0x00,0x10,
61+
0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0A,0x00,0x0A,0x00,0x06,0x00,0x02//气/1
62+
};
63+
64+
static const uint8_t PROGMEM Date_16x16[] ={
65+
0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,
66+
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,//日/0
67+
68+
0x22,0x00,0x22,0x7C,0x7F,0x44,0x22,0x44,0x22,0x44,0x3E,0x7C,0x22,0x44,0x22,0x44,
69+
0x3E,0x44,0x22,0x7C,0x22,0x44,0xFF,0x44,0x04,0x84,0x22,0x84,0x41,0x14,0x82,0x08,//期/1
70+
};
71+
72+
73+
74+
4075

wifi_weather_oled_arduino/wifi_weather_oled_arduino.ino

+36-30
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
Adafruit_SSD1306 display(OLED_RESET);
5454

5555
const unsigned long BAUD_RATE = 115200; // serial connection speed
56-
const size_t MAX_CONTENT_SIZE = 1000; // max size of the HTTP response
56+
const size_t MAX_CONTENT_SIZE = 300; // max size of the HTTP response
5757
char response[MAX_CONTENT_SIZE];
5858

5959
// 定义记录按键当前状态的变量
@@ -96,9 +96,6 @@ void setup() {
9696
display.ShowCN_16(0,16, Welcome_16x16,sizeof(Welcome_16x16)/32,WHITE);
9797
display.ShowCN_16(48,32, Author_16x16,sizeof(Author_16x16)/32,WHITE);
9898
display.display();
99-
delay(2000);
100-
display.clearDisplay(); // clears the screen and buffer
101-
display.display();
10299
}
103100

104101
void loop() {
@@ -108,7 +105,9 @@ void loop() {
108105
if(data_size>0){
109106
//开始解析数据
110107
UserData userData;
111-
parseData(response,&userData);
108+
if(parseData(response,&userData)){
109+
showWeather(&userData);
110+
}
112111
}
113112
}
114113
checkButton();
@@ -128,26 +127,7 @@ int ReceiveMessage(char* content, size_t maxSize){
128127

129128
/**
130129
* 数据格式如下:
131-
* {
132-
* "results": [
133-
* {
134-
* "location": {
135-
* "id": "WX4FBXXFKE4F",
136-
* "name": "北京",
137-
* "country": "CN",
138-
* "path": "北京,北京,中国",
139-
* "timezone": "Asia/Shanghai",
140-
* "timezone_offset": "+08:00"
141-
* },
142-
* "now": {
143-
* "text": "多云",
144-
* "code": "4",
145-
* "temperature": "23"
146-
* },
147-
* "last_update": "2017-09-13T09:51:00+08:00"
148-
* }
149-
* ]
150-
*}
130+
* {"city":"Guangzhou","weather":"Cloudy","temp":"28","time":"2017-09-25T22:40:00+08:00"}
151131
*/
152132
bool parseData(char* content,struct UserData* userData) {
153133
// -- 根据我们需要解析的数据来计算JSON缓冲区最佳大小
@@ -161,15 +141,15 @@ bool parseData(char* content,struct UserData* userData) {
161141
JsonObject& root = jsonBuffer.parseObject(content);
162142

163143
if (!root.success()) {
164-
Serial.println("JSON parsing failed!");
144+
DBGLN("JSON parsing failed!");
165145
return false;
166146
}
167147

168148
//复制我们感兴趣的字符串
169-
strcpy(userData->city, root["results"][0]["location"]["name"]);
170-
strcpy(userData->weather, root["results"][0]["now"]["text"]);
171-
strcpy(userData->temp, root["results"][0]["now"]["temperature"]);
172-
strcpy(userData->udate, root["results"][0]["last_update"]);
149+
strcpy(userData->city, root["city"]);
150+
strcpy(userData->weather, root["weather"]);
151+
strcpy(userData->temp, root["temp"]);
152+
strncpy(userData->udate, root["time"],10);
173153
// -- 这不是强制复制,你可以使用指针,因为他们是指向“内容”缓冲区内,所以你需要确保
174154
// 当你读取字符串时它仍在内存中
175155
return true;
@@ -207,3 +187,29 @@ void checkButton(){
207187
void clrEsp8266ResponseBuffer(void){
208188
memset(response, 0, MAX_CONTENT_SIZE); //清空
209189
}
190+
191+
// 打印从JSON中提取的数据
192+
void showWeather(struct UserData* userData) {
193+
display.clearDisplay();
194+
display.setTextSize(1);
195+
display.setTextColor(WHITE);
196+
197+
display.ShowCN_16(0,0, City_16x16,sizeof(City_16x16)/32,WHITE);
198+
display.setCursor(sizeof(City_16x16)/2+8,4);
199+
display.print(userData->city);
200+
201+
display.ShowCN_16(0,16, Weather_16x16,sizeof(Weather_16x16)/32,WHITE);
202+
display.setCursor(sizeof(Weather_16x16)/2+8,18);
203+
display.print(userData->weather);
204+
205+
display.ShowCN_16(0,32, Temp_16x16,sizeof(Temp_16x16)/32,WHITE);
206+
display.setCursor(sizeof(Temp_16x16)/2+8,36);
207+
display.print(userData->temp);
208+
display.print(" C");
209+
210+
display.ShowCN_16(0,48, Date_16x16,sizeof(Date_16x16)/32,WHITE);
211+
display.setCursor(sizeof(Date_16x16)/2+8,52);
212+
213+
display.print(userData->udate);
214+
display.display();
215+
}

0 commit comments

Comments
 (0)