IDE
Lib
Arduino新建工程时,只有两个函数setup()
和loop()
,一个用于初始化,只执行一次,另一个是死循环,用于循环执行的任务;
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
在Arduino的main()
函数中,就知道为什么只需要实现这两个函数了:
#include
int main(void)
{
init();
initVariant();
setup(); // setup()
for (;;) {
loop(); // loop()
if (serialEventRun) serialEventRun();
}
return 0;
}
UCloud物联网平台提供海量的设备连接,支持MQTT、规则引擎等功能,目前公测阶段,还是免费的,具体可以参考使用教程创建产品
、设备
,设备注册分为动态注册和静态注册两种:
静态注册
MQTT Server IP: mqtt-cn-sh2.iot.ucloud.cn
Client ID: #productsn#.#devicesn# // 比如:7y94syp89zig70fi.421o3357z4nojejj
User Name: #productsn#|#devicesn#|#authmode# //比如:7y94syp89zig70fi|421o3357z4nojejj|1
Password: #devicesecret# // 比如:wurajvme8rdh5tp7
注:authmode为1时为静态注册,使用设备密钥作为password;
为2时为动态注册,使用产品密钥作为password
动态注册(需在控制台打开动态注册)
#devicesn#
需要自己生成,字符 串长度<64
字符,禁止使用*#/|.:
等字符,若发生和已经激活的设备重 复,会登录失败,需要更换新的#devicesn#
。/$system/#productsn#/#devicesn#/password
获取#devicesecret#
,用户在本地做持久化保存,下次即可使用#devicesecret#
按照静态注册的方式登录。MQTT Server IP: mqtt-cn-sh2.iot.ucloud.cn
Client ID: #productsn#.#devicesn# // 比如:7y94syp89zig70fi.00016C06A629
User Name: #productsn#|#devicesn#|#authmode# //比如:7y94syp89zig70fi|00016C06A629|2
Password: #productsecret# // 比如:sqx0eltqbj402z7z
注:1. authmode为1时为静态注册,使用设备密钥作为password;
为2时为动态注册,使用产品密钥作为password
EspMQTTClient Library
EspMQTTClient
对象,包含EspMQTTClient client(
"mqtt-cn-sh2.iot.ucloud.cn", // MQTT Server IP
1883, // MQTT Server Port
"7y94syp89zig70fi|pcur1q7jm2lb57rj|1", // User Name
"hly3dk1u5x8fq0b9", // Password
"7y94syp89zig70fi.pcur1q7jm2lb57rj" // Client ID
);
void setup()
{
Serial.begin(115200);
// Enable debugging messages sent to serial output
client.enableDebuggingMessages();
}
void loop()
{
client.loop();
}
// MQTT连接成功后的回调
void onConnectionEstablished()
{
}
// 订阅某个Topic,以及收到该Topic后的回调
void subscribe(const String &topic, MessageReceivedCallback messageReceivedCallback)
{
}
// 发布消息到某个Topic
void publish(const String &topic, const String &payload, bool retain)
{
}
设备影子可以保证设备在断线的情况下用户应用程序还能获取到设备的属性状态,同时也能帮助应用程序在不需要频繁访问设备的情况下直接获取到设备的状态。
上报温度,湿度,烟感值到设备影子:
// msg packet
snprintf(msg, 150, "{\"Method\":\"update\",\"St\":{\"Reported\":{\"temperature\":%.1f,\"humidity\":%.1f,\"smoke\":%.1f}},\"Version\":%d}", temperature, humidity, smoke, shadow_v);
// publish to shadow topic
client.publish("/$shadow/upstream/7y94syp89zig70fi/pcur1q7jm2lb57rk", msg);
DHT11 Library
#define DHT11_IO 5 // GPIO5 DHT11
void setup()
{
dht.setup(DHT11_IO, DHTesp::DHT11); // Connect DHT sensor to GPIO 5
}
void loop()
{
// 获取温度和湿度
float humidity = dht.getHumidity();
float temperature = dht.getTemperature();
}
void loop()
{
// 使用AD获取烟感值,ESP8266的ADC是一个10位ADC,默认为读取外部电压
float smoke = (float)analogRead(A0) * 100 / 1024; // 换算成百分比
}
SmartConfig的原理是利用已经具备 Wi-Fi 网络接入能力的设备(例如智能手机)向接入点 (AP) 发送一系列 UDP 包,使用每一包的长度(即 Length 字段按照一定的通信协议(乐鑫叫做ESP-TOUCH)进行编码,SSID 和密码就包含在 Length字段中,随后设备便便可以获得并解析出所需的信息。
SmartConfig Library
乐鑫实现SmartConfig的叫ESP-TOUCH 技术,乐鑫已经在ESP8266WiFi
实现了该技术。主要分为下面三部:
WiFi.beginSmartConfig()
WiFi.smartConfigDone()
WiFi.stopSmartConfig()
WiFi.SSID().c_str()
和WiFi.psk().c_str()
具体实现:
#include
#include
void dosmartconfig(char* wifissid, char* password) {
// do smart config
unsigned long _start = 0;
justwifi_states_t _state = STATE_SMARTCONFIG_START;
while (_state != STATE_IDLE) {
switch (_state) {
case STATE_SMARTCONFIG_START:
if (!WiFi.beginSmartConfig()) {
_state = STATE_SMARTCONFIG_FAILED;
}
_state = STATE_SMARTCONFIG_ONGOING;
_start = millis();
break;
case STATE_SMARTCONFIG_ONGOING:
if (WiFi.smartConfigDone()) {
_state = STATE_SMARTCONFIG_SUCCESS;
} else if (millis() - _start > JUSTWIFI_SMARTCONFIG_TIMEOUT) {
_state = STATE_SMARTCONFIG_FAILED;
}
break;
case STATE_SMARTCONFIG_FAILED:
WiFi.stopSmartConfig();
WiFi.enableSTA(false);
_state = STATE_IDLE;
break;
case STATE_SMARTCONFIG_SUCCESS:
strncpy(wifissid, WiFi.SSID().c_str(), 20);
strncpy(password, WiFi.psk().c_str(), 20);
infoWifi();
_state = STATE_IDLE;
break;
}
delay(20);
}
}
引用头文件
#include "FS.h"
打开文件
// load
File configFile = SPIFFS.open("/config.json", "r");
// save
File configFile = SPIFFS.open("/config.json", "w+");
读写文件
File.read()
File.write()