- Mqtt例程代码修改:
- 点开include的mqtt_config.h
- 修改mqtt_config.h文件里的client_id、user、pass,这是上云的重要步骤
ssid---wifi名称,pass---wifi密码
PS:一定要修改成8266可以连接上的wifi,不然8266上云会失败
最最重要的ps:#define CFG_HOLDER 0x66666663 //持有人标识,一定要修改,别人标识过的数字不能用,随便把3改成任何一个数
-
第一处修改的地方:把订阅主题修改成你自己的主题
-
第二处修改的地方:修改发布传感器标识名,还有主题
-
编译,烧录代码
-
实物效果
-
-
串口调试助手:
-
这样就是wifi连接成功,mqtt上线成功。可以看看自己的云平台在不在线,在线时间是不是当天的时间
-
给云平台发送温湿度的数据:
-
在mqtt成功连接代码里,发布报文,报文格式需要写对,修改成自己温湿度标识名,自己修改温湿度的数据,还有就是修改成自己的主题名
串口调试助手:发布成功
-
在云平台历史数据查看自己发布的数据是否对的上
-
PS:看到主题和发布的地方,都需要改成自己的主题,和温湿度的标识名
-
添加DHT11读取温湿度,oled屏显示:
把dht11例程文件夹app中的driver文件拷贝到自己的mqtt的esp_mqtt_proj文件夹下
把dht11例程文件夹app中的include文件中的driver中的dht11.h拷贝到自己的mqtt的esp_mqtt_proj文件夹中的include的driver文件
把dht11例程文件夹app中的driver文件中的dht11.c拷贝到自己的mqtt的esp_mqtt_proj文件夹中的modules文件
-
打开mqtt例程:
添加DHT11的头文件
定义DHT11的宏定义
全局变量加软件定时器
在毫秒延时函数添加DHT11读取温湿度代码
// 定时的回调函数
//==========================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
if(DHT11_Read_Data_Complete() == 0) // 读取DHT11温湿度值
{
//-------------------------------------------------
// DHT11_Data_Array[0] == 湿度_整数_部分
// DHT11_Data_Array[1] == 湿度_小数_部分
// DHT11_Data_Array[2] == 温度_整数_部分
// DHT11_Data_Array[3] == 温度_小数_部分
// DHT11_Data_Array[4] == 校验字节
// DHT11_Data_Array[5] == 【1:温度>=0】【0:温度<0】
//-------------------------------------------------
// 温度超过30℃,LED亮
//----------------------------------------------------
if(DHT11_Data_Array[5]==1 && DHT11_Data_Array[2]>=80)
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0); // LED亮
else
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // LED灭
// 串口输出温湿度
//---------------------------------------------------------------------------------
if(DHT11_Data_Array[5] == 1) // 温度 >= 0℃
{
os_printf("\r\n湿度 == %d.%d %RH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
os_printf("\r\n温度 == %d.%d ℃\r\n", DHT11_Data_Array[2],DHT11_Data_Array[3]);
// hum = (DHT11_Data_Array[0]+DHT11_Data_Array[1];
// temp = (DHT11_Data_Array[2]+DHT11_Data_Array[3];
}
else // if(DHT11_Data_Array[5] == 0) // 温度 < 0℃
{
os_printf("\r\n湿度 == %d.%d %RH\r\n",DHT11_Data_Array[0],DHT11_Data_Array[1]);
os_printf("\r\n温度 == -%d.%d ℃\r\n",DHT11_Data_Array[2],DHT11_Data_Array[3]);
// hum = (DHT11_Data_Array[0]+DHT11_Data_Array[1];
// temp = (DHT11_Data_Array[2]+DHT11_Data_Array[3];
}
// OLED显示温湿度
//---------------------------------------------------------------------------------
DHT11_NUM_Char(); // DHT11数据值转成字符串
OLED_ShowString(0,2,DHT11_Data_Char[0]); // DHT11_Data_Char[0] == 【湿度字符串】
OLED_ShowString(0,6,DHT11_Data_Char[1]); // DHT11_Data_Char[1] == 【温度字符串】
}
}
// 软件定时器初始化(ms毫秒)
//==========================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init_JX(u32 time_ms, u8 time_repetitive)
{
os_timer_disarm(&OS_Timer_1); // 关闭定时器
os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL); // 设置定时器
os_timer_arm(&OS_Timer_1, time_ms, time_repetitive); // 使能定时器
}
// LED初始化
//==========================================================================================
void ICACHE_FLASH_ATTR LED_Init_JX(void)
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); // IO4 = 1
}
在主函数user_init加串口打印,oled显示初始化
编译程序,用串口助手打印
这是时候你的云平台的历史数据,也会有发布消息,但发布的数据是你自己定义的数据,并不是oled屏读取温湿度实时的数据
这时候就需要修改发布的格式
3.发布格式需要改成变量,不是常量,需要根据oled的显示实时更新数据,上传云平台
格式:os_sprintf(publish_buf_,"{\"datatype\":1,\"datas\":{\"Temp\":%d,\"Temptidy\":%d},\"msgid\":123}",DHT11_Data_Array[2], //可尝试用%c输出,会有什么样的结果
DHT11_Data_Array[0],DHT11_Data_Array[1],DHT11_Data_Array[3]);
//DHT11_Data_Array[2],DHT11_Data_Array[0],DHT11_Data_Array[1],DHT11_Data_Array[3]的意思就是读取温湿度的数据
MQTT_Publish(&mqttClient,"/sys/516552/554834/sensor/datas",publish_buf_,strlen(publish_buf_),0,0); //strenl函数是求的是字符串的实际长度
publish_buf_:要在全局变量里添加一个,不能更发布的publish重名,随便命名一个。但是发布上云数据需要全部修改。
publish_buf_需要你自己定义