本帖最后由 sxmwhl 于 2016-12-6 23:39 编辑
一、设备功能
机智云gokit开发板实时上传DHT11温湿度数据,接受控制并进行反馈,保持断线重连,可以通过开发板的usb口,用串口工具调试工具,直接控制esp8266。
二、硬件
gokit开发板2.0v,esp8266网络模块。
三、实现方法
1、gokit扩展板上的esp8266刷AT固件,参见:机智云Gokit2代功能板ESP-12F直接刷AT固件透传方法
2、下载基于ebox系统的stm32,工程文件,点击下载;
3、复制下方代码,粘贴替换下载工程文件中的mian.cpp文件内容;
4、修改文件中的DEVICEID、APIKEY、temp_input_id、hum_input_id,分别为设备id,设备密码,属于该设备下的温度接口和湿度接口id;
5、编译烧录;
6、进行透传设置,直接通过gokit的usb口,使用串口调试工具,向esp8266发送命令进行透传设置,可参见:ESP8266透传设置脚本,设置成功后自动连接贝壳物联平台
四、代码
- //STM32 RUN IN eBox
- #include "ebox.h"
- #include "cJSON.h"
- #include "Dht11.h"
- //================================
- String DEVICEID = "xxx";
- String APIKEY = "xxxxxxxxx";
- String temp_input_id="xxxx";
- String hum_input_id="xxxx";
- //====================================
- Dht11 sensor(&PB3);
- char uart1_rx_str[1024];
- int i=0;
- char uart2_rx_str[1024];
- int j=0;
- uint32_t last_beat_time = 0;
- bool checkinok = false;
- String checkin="{"M":"checkin","ID":""+DEVICEID+"","K":""+APIKEY+""}\n";
- void say(char *toID, char *content)
- {
- uart2.printf("{"M":"say","ID":"%s","C":"%s"}\n",toID,content);
- }
- int processMessage(char *msg){
- cJSON *jsonObj = cJSON_Parse(msg);
- if(!jsonObj)
- {
- uart1.printf("json string wrong!");
- return 0;
- }
- cJSON *method = cJSON_GetObjectItem(jsonObj, "M");
- char *m = method->valuestring;
- if(strncmp(m,"b",1) == 0 || strncmp(m,"WELCOME",7) == 0)
- {
- uart1.printf("sending checkin...\r\n");
- uart2.print(checkin);
- }
- if(strncmp(m,"checkinok",9) == 0)
- {
- checkinok=true;
- }
- if(strncmp(m,"connected",9) == 0)
- {
- checkinok=false;
- uart1.printf("sending checkin...\r\n");
- uart2.print(checkin);
- }
- if(strncmp(m,"checked",7) == 0)
- {
- checkinok=true;
- }
- if(strncmp(m,"login",5) == 0)
- {
- char *from_id = cJSON_GetObjectItem(jsonObj, "ID")->valuestring;
- uart1.printf("saying...");
- char new_content[] = "Dear friend, welcome to BIGIOT !";
- say(from_id,new_content);
- }
- if(strncmp(m,"say",3) == 0)
- {
- char *content = cJSON_GetObjectItem(jsonObj, "C")->valuestring;
- char *from_id = cJSON_GetObjectItem(jsonObj, "ID")->valuestring;
- if(strncmp(content,"play",4) == 0)
- {
- //do something here....
- uart1.printf("saying...");
- char new_content[] = "played";
- say(from_id,new_content);
- }
- else if(strncmp(content,"stop",4) == 0)
- {
- //do something here....
- uart1.printf("saying...");
- char new_content[] = "stoped";
- say(from_id,new_content);
- }
- else{
- //do something here....
- uart1.printf("saying...");
- char new_content[] = "I don't know what you have said...";
- say(from_id,new_content);
- }
- }
- if(jsonObj)cJSON_Delete(jsonObj);
- return 1;
- }
- void uart2_rx_event()
- {
- uint16_t c;
- c = uart2.read();
- uart1.write(c);
- uart2_rx_str[j]=c;
- uart2_rx_str[j+1] = '\0';
- if (c == '\n')
- {
- if(uart2_rx_str[j-1] == '}')
- {
- processMessage(uart2_rx_str);
- }
- if(strncmp(uart2_rx_str,"ERROR",5) == 0)
- {
- checkinok = false;
- }
- j=0;
- }else{
- j++;
- }
- }
- void update_dht11()
- {
- int temp,hum;
- switch (sensor.read())
- {
- case Dht11::OK:
- temp=sensor.getTemperature();
- hum=sensor.getHumidity();
- uart1.printf("{"M":"update","ID":"%s","V":{"%s":"%d","%s":"%d"}}\n",DEVICEID.c_str(),temp_input_id.c_str(),temp,hum_input_id.c_str(),hum);
- uart2.printf("{"M":"update","ID":"%s","V":{"%s":"%d","%s":"%d"}}\n",DEVICEID.c_str(),temp_input_id.c_str(),temp,hum_input_id.c_str(),hum);
- break;
- case Dht11::ERROR_CHECKSUM:
- uart1.printf("Checksum error\r\n");
- break;
- case Dht11::ERROR_TIMEOUT:
- uart1.printf("Timeout error\r\n");
- break;
- default:
- uart1.printf("Unknown error\r\n");
- break;
- }
- }
- void uart1_rx_event()
- {
- uint16_t c;
- c = uart1.read();
- uart1_rx_str<i>=c;
- uart1_rx_str[i+1] = '\0';
- if (c == '\n')
- {
- uart2.printf(uart1_rx_str);
- i=0;
- }else if(strncmp(uart1_rx_str,"+++",3) == 0)
- {
- uart2.printf(uart1_rx_str);
- i=0;
- }else
- {
- i++;
- }
- }
- void setup()
- {
- ebox_init();
- uart1.begin(115200);
- uart2.begin(115200);
- uart1.printf("Working start!\r\n");
- uart1.attach(uart1_rx_event,RxIrq);
- uart2.attach(uart2_rx_event,RxIrq);
- }
- int main(void)
- {
- uint32_t last_update_time = 0;
- uint32_t last_status_time = 0;
- setup();
- while(1)
- {
- if(millis() - last_update_time > 6310 && checkinok)
- {
- update_dht11();
- last_update_time = millis();
- }
- if(millis() - last_status_time > 120000 || last_status_time == 0)
- {
- uart2.printf("{"M":"status"}\n");
- last_status_time = millis();
- }
- }
- }
复制代码
原文出自:http://www.bigiot.net/info/458.html
|