# ESP32DevkitC + LED + 阿里云物联网平台
这个Demo通过一个云端可控制的LED灯程序和采集单片机的温度湿度等信息,向您展示了如何快速开发LED和采集单片机的温度湿度上云程序。
开发运行本Demo请使用ESP32DevkitC开发板和阿里云IoT推出的在线设备开发Web IDE [Hacklab](https://hacklab.aliyun.com).
#include <Arduino.h>
#include <ArduinoJson.h>
#include <aliyun_mqtt.h>
#include <WiFi.h>
#include "user_dht.h"
#include <lcd.h>
started-with-wifi/
//#define WIFI_SSID "WIFI_SSID"
//#define WIFI_PASSWD "WIFI_PASSWD"
#define WIFI_SSID "WIFI_SSID"
#define WIFI_PASSWD "WIFI_PASSWD"
DHT11 dht11(21);
LCD lcd;
uint16_t
temperature=0,humidity=10,speed0=20,other=30;
#define dustPin 35 //定义风速传感器----adc采集引脚
#define PRODUCT_KEY "XXXXXXX"
#define DEVICE_NAME "XXXXXXX"
#define DEVICE_SECRET "XXXXXXXXXXXXXX"
#define ALINK_BODY_FORMAT "{\"id\":\"%u\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME
"/thing/event/property/post"
#define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"
#define ALINK_METHOD_PROP_POST "thing.event.property.post"
#define
LED 2
#define LED_OFF 0
#define LED_ON 1
int ledState = LED_OFF;
bool needReportStatus = true;
int ledStateMapOutput[2] = {HIGH, LOW}; // ESP32Devkitc built-in LED output flip
// int
ledStateMapOutput[2] = {LOW, HIGH}; // FireBeetle built-in LED output flip
unsigned long lastMqttConnectMs = 0;
unsigned int postMsgId = 0;
unsigned int airTemp=10,Humidity=20,WindSpeed=30;
WiFiClient espClient;
PubSubClient mqttClient(espClient);
String translateEncryptionType(wifi_auth_mode_t encryptionType) {
switch (encryptionType) {
case (WIFI_AUTH_OPEN):
return
"Open";
case (WIFI_AUTH_WEP):
return "WEP";
case (WIFI_AUTH_WPA_PSK):
return "WPA_PSK";
case (WIFI_AUTH_WPA2_PSK):
return "WPA2_PSK";
case
(WIFI_AUTH_WPA_WPA2_PSK):
return "WPA_WPA2_PSK";
case (WIFI_AUTH_WPA2_ENTERPRISE):
return "WPA2_ENTERPRISE";
}
}
void scanNetworks() {
int numberOfNetworks = WiFi.scanNetworks
();
Serial.print("Number of networks found: ");
Serial.println(numberOfNetworks);
for (int i = 0; i < numberOfNetworks; i++) {
Serial.print("Network name: ");
Serial.println
(WiFi.SSID(i));
Serial.print("Signal strength: ");
Serial.println(WiFi.RSSI(i));
Serial.print("MAC address: ");
Serial.println(WiFi.BSSIDstr(i));
Serial.print("Encryption
type: ");
String encryptionTypeDescription = translateEncryptionType(WiFi.encryptionType(i));
Serial.println(encryptionTypeDescription);
Serial.println("-----------------------");
}
}
void connectToNetwork() {
WiFi.begin(WIFI_SSID, WIFI_PASSWD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Establishing connection to WiFi..");
}
Serial.println("Connected to network.");
}
void mqttCheckConnect()
{
bool connected = connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);
if (connected) {
Serial.println("MQTT connect succeed!");
if (mqttClient.subscribe(ALINK_TOPIC_PROP_SET)) {
Serial.println("subscribe done.");
} else {
Serial.println("subscribe failed!");
}
}
}
void mqttPublish()
{
char param[70];
char jsonBuf[180];
airTemp++;
Humidity++;
WindSpeed++;
sprintf(param, "{\"LightSwitch\":%d,\"airTemp\":%d,\"Humidity\":%d,\"WindSpeed\":%d}",
ledState,airTemp,Humidity,WindSpeed);
//sprintf(param, "{\"LightSwitch\":%d}", ledState);
//sprintf(param, "{\"airTemp\":%d}", ledState);
//sprintf(param, "{\"LightSwitch\":%d}",
ledState);
postMsgId += 1;
sprintf(jsonBuf, ALINK_BODY_FORMAT, postMsgId, ALINK_METHOD_PROP_POST, param);
if (mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf)) {
Serial.print("Post
message to cloud: ");
Serial.println(jsonBuf);
} else {
Serial.println("Publish message to cloud failed!");
}
}
void mqttPublish_data1()
{
char param[70];
char jsonBuf[180];
sprintf(param, "{\"LightSwitch\":%d,\"airTemp\":%d,\"Humidity\":%d,\"WindSpeed\":%d}", ledState,temperature,humidity,speed0);
postMsgId += 1;
sprintf(jsonBuf, ALINK_BODY_FORMAT,
postMsgId, ALINK_METHOD_PROP_POST, param);
if (mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf)) {
Serial.print("Post message to cloud: ");
Serial.println(jsonBuf);
} else {
Serial.println("Publish message to cloud failed!");
}
}
void callback(char* topic, byte* payload, unsigned int length)
{
if (strstr
(topic, ALINK_TOPIC_PROP_SET))
{
Serial.print("Set message arrived [");
Serial.print(topic);
Serial.print("] ");
payload[length] = '\0';
Serial.println((char *)payload);
// Deserialization break change from 5.x to 6.x of ArduinoJson
DynamicJsonDocument doc(100);
DeserializationError error = deserializeJson(doc, payload);
if (error)
{
Serial.println("parse json failed");
return;
}
// {"method":"thing.service.property.set","id":"282860794","params":{"LightSwitch":1},"version":"1.0.0"}
JsonObject
setAlinkMsgObj = doc.as<JsonObject>();
// LightSwitch
int desiredLedState = setAlinkMsgObj["params"]["LightSwitch"];
if (desiredLedState == LED_ON || desiredLedState == LED_OFF) {
needReportStatus = true;
ledState = desiredLedState;
const char* cmdStr = desiredLedState == LED_ON ? "on" : "off";
Serial.print("Cloud command: Turn ");
Serial.print(cmdStr);
Serial.println(" the light.");
}
}
}
void setup()
{
lcd.LCD_GPIOInit();
lcd.LCD_Init();
lcd.LCD_Clear(WHITE);
lcd.Show_Str(3,
0,BLACK,WHITE,"wendu:",12,1);///显示英文字符串
lcd.Show_Str(3,20,BLACK,WHITE,"shidu:",12,1);///显示英文字符串
lcd.Show_Str(3,40,BLACK,WHITE,"fengsu:",12,1);///显示英文字符串
lcd.Show_Str(3,60,BLACK,WHITE,"other:",12,1);///显示英文字符串
adcAttachPin(dustPin);////风速传感器----adc采集管脚初始化
adcStart(dustPin);////风速传感器----adc采集开始
Serial.begin(115200);
pinMode(LED, OUTPUT);
scanNetworks();
connectToNetwork();
Serial.println(WiFi.macAddress());
Serial.println(WiFi.localIP());
// WiFi.disconnect
(true);
// Serial.println(WiFi.localIP());
mqttClient.setCallback(callback);
lastMqttConnectMs = millis();
mqttCheckConnect();
}
void loop()
{
unsigned int
temp=1111,dustVal;
temp=dht11.Get_DHT11_Value_ok(); ///温湿度采集
temperature=temp/256;//温度
//humidity=temp%256;//湿度
dustVal=analogRead(dustPin); ///风
速采集
speed0=dustVal;
other++;
humidity++;
if (humidity>99) humidity=0;
lcd.LCD_ShowNum(45,0,temperature,3,12);///显示数字
lcd.LCD_ShowNum(45,20,humidity,3,12);///显示数字
lcd.LCD_ShowNum(45,40,speed0,3,12);///显示数字
lcd.LCD_ShowNum(45,60,other,3,12);///显示数字
mqttPublish_data1();////发
送数据
if (millis() - lastMqttConnectMs >= 5000) {
lastMqttConnectMs = millis();
mqttCheckConnect();
}
if (!
mqttClient.loop()) {
Serial.println("The MQTT client is disconnected!");
}
digitalWrite(LED, ledStateMapOutput[ledState]);
if (needReportStatus) {
mqttPublish();
needReportStatus = false;
}
}
全部资料51hei下载地址:
esp32_0001.7z
(2.18 MB, 下载次数: 90)
|