1.项目描述
本项目采用FireBeetle ESP32-E开发板,与dfrobot生产的SEN0289晃动传感器,以及第三方公司生产的dht11数字温湿度传感器,制作了一套远程监控系统,通过ESP32-E控制器,采集目标物体的晃动情况,以及周围环境的温湿度信息,通过WiFi上传至阿里云服务器,使用户能够远程实时监测其状态。
项目所用FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。FireBeetle ESP32-E深度支持ArduinoIDE编程,并且即将支持Scratch图形化编程及MicroPython编程。邮票孔的设计,让它可以方便的嵌入你设计的PCB上,大大缩减你的原型开发成本以及原型测试时间。
数字晃动传感器是一款仅对单方向手摇运动敏感的数字传感器。采用弹簧式震动开关,静止时输出高电平,当用户沿指定方向用力晃动一次,模块输出一个低电平脉冲,板载指示灯同时闪亮。具有较强的抗冲击干扰能力。
2.各功能代码片段及说明
设备上电后,会通过wifi自动连接至阿里云服务器,此后,每隔5s将环境温湿度数据上传至服务器,当设备出现晃动时,会将晃动数据以事件方式上报至服务器。在服务器端可下发控制命令,对设备的led灯进行开关操作。
连接阿里云:
void ConnectAliyun()
{
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
/*根据自动计算的用户名和密码连接到Alinyun的设备,不需要更改*/
if (client.connect(myAliyun.client_id, myAliyun.username, myAliyun.password))
{
Serial.println("connected");
client.subscribe(subTopic);
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
物体晃动检测:
当设备出现晃动时,通过事件方式,上报至服务器。
void Send_shake_state_to_ail()
{
static uint32_t cnt = 0;
if (stateChangeFlag)
{
stateChangeFlag = false;
Serial.println(stateFlag);
client.publish(eventTopic,("{\"id\":"+ClientId+",\"params\":{\""+ShakeIdentifier+"\":"+stateFlag+"},\"method\":\"thing.event.property.post\"}").c_str());
}
}
温湿度数据上传:
设备每隔5s,将环境温湿度信息上报至服务器。
void Send_temp_humi_to_ail()
{
static uint32_t cnt = 0;
if (millis() - cnt > 5000)
{
cnt = millis();
DHT.read(DHT11_PIN);
Serial.print("DHT.temperature=");
Serial.println(DHT.temperature);
Serial.print("DHT.humidity=");
Serial.println(DHT.humidity);
client.publish(pubTopic, ("{\"id\":" + ClientId + ",\"params\":{\"" + TempIdentifier + "\":" + DHT.temperature + ",\"" + HumiIdentifier + "\":" + DHT.humidity + "},\"method\":\"thing.event.property.post\"}").c_str());
}
}
控制命令下发执行:
可在服务器端,远程下发控制命令,对设备的led进行开关操作。
void callback(char *topic, byte *payload, unsigned int len)
{
Serial.print("Recevice [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < len; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
StaticJsonBuffer<300> jsonBuffer;
JsonObject &root = jsonBuffer.parseObject((const char *)payload);
if (!root.success())
{
Serial.println("parseObject() failed");
return;
}
const uint16_t LightStatus = root["params"][Identifier];
if (LightStatus == 1)
{
openLight();
}
else
{
closeLight();
}
String tempMseg = "{\"id\":" + ClientId + ",\"params\":{\"" + Identifier + "\":" + (String)LightStatus + "},\"method\":\"thing.event.property.post\"}";
char sendMseg[tempMseg.length()];
strcpy(sendMseg, tempMseg.c_str());
client.publish(pubTopic, sendMseg);
}
3.功能展示及说明
接通设备电源后,ESP32通过设置的wifi,自动连接至阿里云,在控制端可以看到,设备的上线信息。
设备间隔5s,自动上传环境温湿度信息,通过阿里云控制端可实时查看设备的上传数据。
当设备出现晃动时,会将晃动数据以事件方式上报至阿里云,同时在阿里云控制端口可查看设备上报的事件信息。
可以通过阿里云控制端的在线调试功能,对设备led灯进行远程控制
开灯操作:
关灯操作:
4.对本活动的心得体会
非常感谢此次活动的举办方,虽然第一次使用ESP32控制器,但是借助arduino强大的开发环境,能够非常方便的对其进行开发,各种库用起来也非常方便,通过活动,熟悉了ESP32的开发流程,以及阿里云的使用流程,希望活动能够越办越好。