本帖最后由 yaojin919000 于 2021-1-4 15:15 编辑
本文简单介绍利用STM32和esp8266等元器件,利用ONENET平台,实现手机端、电脑端和大屏三种办法对现场温湿度光照度和开关信息的采集显示,并在手机端和电脑端对现场的LED灯以及蜂鸣器进行控制。
实现思路:根据ONENET平台的协议要求,先选择多协议接入建立一个产品,记住产品ID,在这个产品下再创建两个设备,记住设备的ID和鉴权信息,这些信息在编程的过程中需要使用。为了体现使用平台的灵活性,我创建了2个不同硬件的设备,一个是使用STM32+8266ESP-01S的硬件组成,一个是采用NODEMCU模块的硬件组成,两个设备都可以独立运行使用,各自单独组成一个独立的控制系统。两个设备通过ONENET平台每5秒钟发布一次数据,并且随时等待平台对自己的控制命令并完成执行。
硬件部分介绍:设备一采用nodemcu设备硬件简单,直接某宝购买(十几元)用杜邦线外配几个LED灯。自己配上5V电源和手机充电线(见图一)完活。设备二稍微复杂一点,选用STM32F103C8T6最小系统板,参照萝卜兄弟设计一个PCB线路板,把蜂鸣器、BHT11、BHT1750、0.96OLED、通讯模块8266ESP01S还有TCP1211,再配上两个按钮和LED指示灯(参图二),线路板选择嘉立创线上编辑,直接5片一元下单,一周内顺丰邮到家,全部硬件成本约50-60元。
软件部分介绍:针对两个不同设备,分别开发两套独立的软件。主要的功能都是完成数据采集,打包,上传,对平台下发的数据进行解析并执行相关的操作。下面将详细讲解一下:使用STM32+8266ESP-01S的软件讲:这部分软件采用c语言编写,参照ONENET平台上张继瑞老师和正点原子的例程,分成几个部分:
初始化部分:/硬件初始化void Hardware_Init(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
Usart1_Init(115200); //串口1初始化为115200
Usart2_Init(115200); //串口2,驱动ESP8266用
EXTIX_Init(); //外部中断初始化
LED_Init(); //LED初始化
ADCx_Init(); //ADC DMA初始化
DHT11_GPIO_Config(); //DHT11温湿度传感器初始化
BH1750_Init(); //光照
KEY_Init();
BEEP = 0;//鸣叫提示接入成功
delay_ms(250);
BEEP = 1;
数据采集部分:
/*光照度传感器获取数据*/
value_light = LIght_Intensity();
/* 温湿度传感器获取数据*/
/*调用Read_DHT11读取温湿度,若成功则输出该信息*/
if( Read_DHT11(&DHT11_Data)==SUCCESS)
{
sprintf(str, "温度:%d.%d ℃ ",DHT11_Data.temp_int,DHT11_Data.temp_deci);
sprintf(str, "湿度:%d.%d %c ",DHT11_Data.humi_int,DHT11_Data.humi_deci,'%');
}
else
{
printf("Read DHT11 ERROR!\r\n");//读取数据失败,串口打印:Read DHT11 ERROR.
}
Led_Status = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);//读取LED0的状态
Led_Status1 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);//读取LED1的状态
上传部分:
memset(buf, 0, sizeof(buf));
body_len = OneNet_FillBuf(buf); //获取当前需要发送的数据流的总长度
printf("send data:%s\n",buf);
if(body_len)
{
if(MQTT_PacketSaveData(DEVID, body_len, NULL, 5, &mqttPacket) == 0) //封包
{
for(; i < body_len;