ESP8266教程-零基础入门学用物联网

本文最后更新于:2020年10月20日 凌晨

WiFiManager库解析

3-10 JSON 基础

本教程所需的教材和示例程序,可通过太极创客网站-3-4-4-1 JSON基础:获取。

JSON(JavaScript Object Notation) 是一种通用的轻量级数据交换文本格式。它很容易让人阅读和编写,也便于机器进行解析和生成。它使用JavaScript语法来存储和描述数据对象,但是JSON完全独立于JavaScript。JSON可适用于多种流行编程语言。这些特性使JSON成为理想的数据交换格式。

JSON语法规则要点

  • 数据以“名”“值”对呈现
  • 数据“名”和“值”之间由冒号分隔
  • 大括号{}用于标注对象内容
  • 中括号[]用于标注数组内容
  • 逗号用于分隔数据、对象、数组

JSON数据

  • 数据以“名”“值”对呈现
  • 数据“名”和“值”之间由冒号分隔

JSON数据的书写格式是:

1
JSON数据名”:JSON数据值

JSON数据举例:

1
2
“Year”: 2016
“URL”:”www.taichi-maker.com”

JSON数据名称
JSON数据名称需要放在双引号中。以下示例都是合法的JSON数据名:
“Value”、”信息1”

JSON数据值

JSON数据值可以是以下内容:

  • 数字(整数或浮点数)
  • 字符串
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null

注意:一个JSON数据名称只能对应一个值。以下是一系列JSON数据的举例。

3.1 JSON数字数据示例

“value” : 25

3.2 JSON字符串数据示例

“name” : “taichi-maker”

3.3 JSON逻辑值数据示例

“bool_value” : true

3.4 JSON数组数据示例

1
2
3
4
5
6
7
8
9
10
11
"info": [
{
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
},
{
"year": 2020,
"month": 12,
"day": 30
}
]

3.5 JSON对象数据示例

1
2
3
4
"info": {
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
}

3.6 JSON null 数据示例

“value” : null

4. JSON 对象

JSON对象在大括号{} 中书写,对象可以包含单个或者多个JSON数据。
对象(object) 是一个无序的数据集合(“‘名/值’对”集合)。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名/值’ 对”之间使用“,”(逗号)分隔。

以下是含有单个数据的JSON对象示例:

1
2
3
{
"name" : "taichi-maker"
}

以下是含有多个数据的JSON对象示例。该对象由两个JSON数据组成。

1
2
3
4
{
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
}

我们再来看一个含有多个数据的JSON对象示例。该对象包含两个JSON数据。而每一个JSON数据又包含一个JSON对象。

1
2
3
4
5
6
7
8
9
10
11
{
"info": {
"name": "taichi-maker",
"website": "www.taichi-maker.com"
},
"date": {
"year": 2020,
"month": 12,
"day": 30
}
}

5. JSON 数组

数组(array) 是相同元素的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。 如下所示:
[“Tom”,”Jerry”,”Shuke”,”Beita”]
或者
[1,3,5,7]

数组可包含一个或者多个对象。以下是包含单个对象的数组示例:

1
2
3
4
5
6
[
{
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
}
]

以下是包含多个对象的数组示例:

1
2
3
4
5
6
7
8
9
10
11
[
{
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
},
{
"year": 2020,
"month": 12,
"day": 30
}
]
1
2
3
4
5
6
7
8
9
10
11
[
{
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
},
{
"year": 2020,
"month": 12,
"day": 30
}
]

数组也可以包含单个或多个数组,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[
[
{
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
},
{
"year": 2020,
"month": 12,
"day": 30
}
],
[
{
"temperature" : 15,
}
]
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[
[
{
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
},
{
"year": 2020,
"month": 12,
"day": 30
}
],
[
{
"temperature" : 15,
}
]
]

6.JSON 对象与数组混合存放示例

通过以下示例我们可以看到,该JSON对象包含有一个数据,数据名为results,该数据的值是一个数组。此数组只含有一个对象。此对象包含有三个数据。这三个数据的名称分别是:location、now和last_update。其中location的值是含有两个数据的对象。now的值是含有三个数据的对象。last_update的值是字符串”2020-03-01T20:10:00+08:00″。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"results": [
{
"location": {
"name": "Beijing",
"country": "CN"
},
"now": {
"text": "Clear",
"code": "1",
"temperature": "3"
},
"last_update": "2020-03-01T20:10:00+08:00"
}
]
}

3-11 ESP8266 JSON解析

解析JSON格式信息是一个较为繁琐的工作,因此我们将借助解析Arduino – ESP8266平台中解析JSON格式信息的第三方库——ArduionJson库。该库是目前最受好评的解析JSON信息第三方库。其基本信息如下:

作者:BENOIT BLANCHON
官网:https://arduinojson.org/
GitHub: https://github.com/bblanchon/ArduinoJson
本站下载地址:太极创客网站下载页Arduino / ESP8266-NodeMCU第三方库下载部分

JSON解析示例-1:单一对象JSON解析

在以下示例中,您将会看到如何使用ESP8266配合ArduinoJson库来解析只有一个对象的简单JSON信息。该信息如下:

1
2
3
4
{
"name": "taichi-maker",
"number": 1
}

以下是该示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**********************************************************************
项目名称/Project : 零基础入门学用物联网
程序名称/Program name : arduinojosn_1_object
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO朔
日期/Date(YYYYMMDD) : 20200424
程序目的/Purpose :
此程序用于演示如何使用arduinojson库解析以下json信息。该json包含一个对象,
对象中有一个数据。
{
"name": "taichi-maker",
"number": 1
}
-----------------------------------------------------------------------
本示例程序为太极创客团队制作的《零基础入门学用物联网》中示例程序。
该教程为对物联网开发感兴趣的朋友所设计和制作。如需了解更多该教程的信息,请参考以下网页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/
***********************************************************************/
#include <ArduinoJson.h>

void setup() {
Serial.begin(9600);
Serial.println("");

// 重点1:DynamicJsonDocument对象
const size_t capacity = JSON_OBJECT_SIZE(2) + 30;
DynamicJsonDocument doc(capacity);

// 重点2:即将解析的json文件
String json = "{\"name\":\"taichi-maker\",\"number\":1}";

// 重点3:反序列化数据
deserializeJson(doc, json);

// 重点4:获取解析后的数据信息
String nameStr = doc["name"].as<String>();
int numberInt = doc["number"].as<int>();

// 通过串口监视器输出解析后的数据信息
Serial.print("nameStr = ");Serial.println(nameStr);
Serial.print("numberInt = ");Serial.println(numberInt);
}

void loop() {}

Cannot pass objects of non-trivially-copyable type ‘class String’ through ‘…’

IOT物联网技术

IOT物联网技术

连接阿里云+远程控制通信

aliyunIOTSDK库方法

基于Arduino(ESP8266)与阿里云物联网产品开发基础教程
怎样 3 行代码运用 arduino 接入阿里云物联网途径
yu-tou/arduino-aliyun-iot-sdk
手把手教你用Arduino接入阿里云物联网平台,ESP8266连接阿里云物联网平台必看教程…

MQTT协议自写库方法

ESP8266基于MQTT连接阿里云物联网平台
[C]NodeMCU(ESP8266)接入阿里云物联网平台
将ESP8266通过MQTT协议链接阿里云IoT物联网平台
ESP8266 for arduino 如何连接到阿里云物联网平台(AliYun)
Arduino Esp8266开发 (三)上传数据到阿里云MQTT服务器
只要会用电脑就能看懂的物联网教程(阿里云+esp8266+微信小程序)

MQTT

Arduino Client for MQTTAPI Documentation
浅谈物联网开发最热协议—MQTT协议
LiteOS云端对接教程03-LiteOS基于MQTT对接EMQ-X服务器
教程ESP8266 连接到的免费的 EMQ X MQTT 服务器
EMQ X Enterprise
MQTT系列教程2(消息服务器EMQ的搭建和使用)
EMQ 安装及简单使用

Ethernet + SD Card

ESP HTTP Client file download in sdcard
DOWNLOADING LARGE FILE USING HTTPCLIENT AND WIFICLIENT CRASH
Downloading large files to spiffs via https #5175
HTTP client file download. #2861
Serving Files over Ethernet
HTTP Client
Downloading file using HTTP GET & Saving to SD card using Arduino MKR1400 GSM
HTTP client file download.
Arduino – SD库
SD Card Tutorial for Arduino, ESP8266 and ESP32
How to use SD card with esp8266, esp32 and Arduino

SD文件时间

这是 ESP8266 for arduino 2.7.4 版本(和以前版本)的一个bug。在网络上查找许多资料,都涉及到一个函数:setTimeCallback / dateTimeCallback。(后者为老版本函数,后被前者代替)。函数的原本作用是用该函数设置一个回调函数,该回调函数在你打开一个文件,并关闭该文件时被调用,函数内有修改文档时间的语句。
但经过测试,该回调函数并未被调用,最终在官方 issues 中找到答案,该问题也14天前刚发布的。
setTimeCallback is not working for ESP8266 with both SD.h and SDFS too #7682
问题内容就是说回调函数不起作用,在后面的官方回答中Hook up custom timestamp proc for SD/SDFS解决了该问题,通过修改 ESP8266 库。但最新版还未发布,所以截至目前(2020/11/13),我们唯一结局的办法就是自己手动修改库文件。
ESP8266开发板库安装在 (2371是你的用户名)C:\Users\23714\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\SDFS\src

修改如下:

只是官方的修改记录,可自行对查看修改,下面仅做解释说明:
Hook up custom timestamp proc for SD/SDFS (#7686)

在 SDFS.cpp 文件中,第40,41行添加代码

1
2
// Required to be global because SDFAT doesn't allow a this pointer in it's own time call
time_t (*__sdfs_timeCallback)(void) = nullptr;

在SDFS.h 文件中,第208-212行添加代码

1
2
3
4
5
virtual void setTimeCallback(time_t (*cb)(void)) override {
extern time_t (*__sdfs_timeCallback)(void);
__sdfs_timeCallback = cb;
}

删除原 213 行的语句 time_t now = time(nullptr);并在该语句后(216-222行)添加

1
2
3
4
5
6
7
       time_t now;
extern time_t (*__sdfs_timeCallback)(void);
if (__sdfs_timeCallback) {
now = __sdfs_timeCallback();
} else {
now = time(nullptr);
}

最后测试修改源码后仍然没用,怀疑是已经将将库文件编译好了,有使用记录。所以卸载了arduino并重新安装,同时安装esp8266开发板库。此时并未打开任何工程文件,先按照上述方式修改后,再重新打开之前写好的工程文件,测试结果正确。

参考链接:
Hook up custom timestamp proc for SD/SDFS (#7686)
setTimeCallback is not working for ESP8266 with both SD.h and SDFS too #7682
Why dateTimeCallback in sd.h does not work?
Add DATE and TIME to your SD CARD Files.
LITTLEFS HOW TO SET A SPECIFIC DATE TIME FOR FILE TIMESTAMP?
setTimeCallback not working for ESP8266 with SD.h
enter description here
SD file creation date

获取网络时间

configTime with TZ offset causes incorrect UTC time
基于基于esp32的联网获取时间

OTA

【阿里云生活物联网架构师专题 ④】分享可商用的ESP8266 SDK连接阿里云物联网生活平台的在线远程升级OTA笔记。
MQTT之ESP8266 OTA固件升级
使用Arduino开发ESP32(17):固件更新演示
SimonLiu的ESP8266与AliOS Things 学习教程系列之十七:AliOS Things之OTA和upgrade over err:-17错误解决
ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
001-使用阿里云物联网平台 OTA 远程升级STM32程序-基于ESP8266
ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
OTA Updates
ESP8266 Arduino Core
ESP8266 OTA之服务器更新
基于 arduino开发的esp8266 通过阿里云实现固件升级

其它

ArduinoJson Assistant
ESP8266 如何保存远程的图片到SPIFFS或SD卡呢
arduino 开发的一些实用小技巧
extension://bfdogplmndidlpjfhoijckpakkdjkkil/pdf/viewer.html?file=https%3A%2F%2Fwww.dfrobot.com.cn%2Fimages%2Fupload%2FFile%2F20190911180239nqyna5.pdf

3.5寸

TF卡GND不能直连电源GND,否则会检测TF卡存在显示蓝屏并提示信息(5秒后在进入第一幅界面)。
测试在TF卡GND和电源GND之间串联10R以上电阻,TF卡不能工作,且无法检测卡存在。反之,使用一个导通电阻 <10R 的芯片控制 GND 的通断,就可控制串口屏对TF卡的检测,从而 消除蓝皮提示。目前查找符合该条件的为:

模拟开关RS2105XN

SD NAND

FAT、FAT32-1024KB可识别

TF卡工作电流

某个博客上偶然看到的一个文章:

  1. 在TF卡中写时不要直接在根目录下写文件,最好先建立一个文件夹,在文件夹里写,这样工作电流就会小很多,而且电流也很稳定(主要原因)
  2. 小容量卡写电流小,大容量卡写电流大(2G:40mA,4G:50mA,16G:100mA,)

TF卡的工作电流有多大 ?


ESP8266教程-零基础入门学用物联网
http://lonlypan.com/2020/10/20/ESP8266教程-零基础入门学用物联网/
作者
LonlyPan
发布于
2020年10月20日
许可协议