Arduino+esp8266控制和上传数据问题

作者:1122334455 | 更新时间:2020-05-05 | 浏览量:1048

为什么我把示例里面的Arduino+esp8266开关代码和传感器代码合并在一起之后在手机不能显示传感器数据,只能进行控制

   望各路大神批评指正


评论:共4条

Space 评论于:2020-04-30 16:25:59
建议把代码贴出来,要不然不好判断
wwwWwww 评论于:2020-04-30 17:24:23
我合并在一起只能显示数据,不能进行控制
wwwWwww 评论于:2020-04-30 17:46:35
差不多这样把
/*
注意 :Arduino IDE版本请使用1.6.5-1.8.2
ESP8266模块在接Arduino之前请确定透传稳定性,在串口查看ESP8266是否能多次收到WELCOME TO BIGIOT,
能多次收到说明透传稳定且能自动重连。
时间:2018.12.4
作者:www.bigiot.net
*/

#include <aJSON.h>
//============= 此处必须修改============
String DEVICEID = "***"; // 你的设备ID=======
String APIKEY = "*****"; // 设备密码==
String INPUTID = "***"; //接口ID==============
//=======================================
const int LED = 4;// LED正极连接针脚4
const int LM35 = 0;// LM35 Vout 接 A0
unsigned long lastCheckStatusTime = 0; //记录上次报到时间
unsigned long lastUpdateTime = 0;//记录上次上传数据时间
const unsigned long postingInterval = 40000; // 每隔40秒向服务器报到一次
const unsigned long updateInterval = 5000; // 数据上传间隔时间5秒
unsigned long checkoutTime = 0;//登出时间
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(115200);
delay(5000);//等一会儿ESP8266
}
void loop() {
//每一定时间查询一次设备在线状态,同时替代心跳
if (millis() - lastCheckStatusTime > postingInterval) {
checkStatus();
}
//checkout 50ms 后 checkin
if ( checkoutTime != 0 && millis() - checkoutTime > 50 ) {
checkIn();
checkoutTime = 0;
}
//每隔一定时间上传一次数据
if (millis() - lastUpdateTime > updateInterval) {
float val;//定义变量
int dat;//定义变量
dat = analogRead( LM35 ); // 读取传感器的模拟值并赋值给dat
//val=(125*dat)>>8;//温度计算公式
val = dat * (4.76 / 1023.0 * 100);
update1(DEVICEID, INPUTID, val);
lastUpdateTime = millis();
}
//读取串口信息
while (Serial.available()) {
String inputString = Serial.readStringUntil('\n');
//检测json数据是否完整
int jsonBeginAt = inputString.indexOf("{");
int jsonEndAt = inputString.lastIndexOf("}");
if (jsonBeginAt != -1 && jsonEndAt != -1) {
//净化json数据
inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);
int len = inputString.length() + 1;
char jsonString[len];
inputString.toCharArray(jsonString, len);
aJsonObject *msg = aJson.parse(jsonString);
processMessage(msg);
aJson.deleteItem(msg);
}
}
}
//设备登录
//{"M":"checkin","ID":"xx1","K":"xx2"}\n
void checkIn() {
Serial.print("{\"M\":\"checkin\",\"ID\":\"");
Serial.print(DEVICEID);
Serial.print("\",\"K\":\"");
Serial.print(APIKEY);
Serial.print("\"}\n");
}
//处理网络接收到到指令,执行相关动作
void processMessage(aJsonObject *msg) {
aJsonObject* method = aJson.getObjectItem(msg, "M");
if (!method) {
return;
}
String M = method->valuestring;
if (M == "WELCOME TO BIGIOT") {
checkOut();
checkoutTime = millis();
return;
}
if (M == "connected") {
checkIn();
}
if (M == "say") {
aJsonObject* content = aJson.getObjectItem(msg, "C");
aJsonObject* client_id = aJson.getObjectItem(msg, "ID");
String C = content->valuestring;
String F_C_ID = client_id->valuestring;
if (C == "play") {
digitalWrite(LED, HIGH);
say(F_C_ID, "LED on!");
}
if (C == "stop") {
digitalWrite(LED, LOW);
say(F_C_ID, "LED off!");
}
}
}

//发送say指令,用于设备与用户、设备与设备间通讯
//{"M":"say","ID":"xx1","C":"xx2","SIGN":"xx3"}\n
void say(String ID, String c) {
Serial.print("{\"M\":\"say\",\"ID\":\"");
Serial.print(ID);
Serial.print("\",\"C\":\"");
Serial.print(c);
Serial.print("\"}\r\n");
}
//强制设备下线,用消除设备掉线延时
//{"M":"checkout","ID":"xx1","K":"xx2"}\n
void checkOut() {
Serial.print("{\"M\":\"checkout\",\"ID\":\"");
Serial.print(DEVICEID);
Serial.print("\",\"K\":\"");
Serial.print(APIKEY);
Serial.print("\"}\n");
}

//查询设备在线状态
//{"M":"status"}\n
void checkStatus() {
Serial.print("{\"M\":\"status\"}\n");
lastCheckStatusTime = millis();
}
/******************
//处理来自ESP8266透传的数据
void processMessage(aJsonObject *msg) {
aJsonObject* method = aJson.getObjectItem(msg, "M");
if (!method) {
return;
}
String M = method->valuestring;
if (M == "WELCOME TO BIGIOT") {
checkOut();
checkoutTime = millis();
return;
}
if (M == "connected") {
checkIn();
}
}
******************/
//上传一个接口数据
//{"M":"update","ID":"2","V":{"2":"120"}}\n
void update1(String did, String inputid, float value) {
Serial.print("{\"M\":\"update\",\"ID\":\"");
Serial.print(did);
Serial.print("\",\"V\":{\"");
Serial.print(inputid);
Serial.print("\":\"");
Serial.print(value);
Serial.println("\"}}");
}
//同时上传两个接口数据调用此函数
//{"M":"update","ID":"112","V":{"6":"1","36":"116"}}\n
void update2(String did, String inputid1, float value1, String inputid2, float value2) {
Serial.print("{\"M\":\"update\",\"ID\":\"");
Serial.print(did);
Serial.print("\",\"V\":{\"");
Serial.print(inputid1);
Serial.print("\":\"");
Serial.print(value1);
Serial.print("\",\"");
Serial.print(inputid2);
Serial.print("\":\"");
Serial.print(value2);
Serial.println("\"}}");
}
//上传更多数据,可以参考上面的写法,和通讯协议,自己添加。
//贝壳物联通讯协议:https://www.bigiot.net/help/1.html
1122334455 评论于:2020-05-05 13:46:45
现在都可以,就是APP按钮需要按好几次才会有反应
返回顶部