作者:Justin233 | 更新時間:2019-12-12 | 瀏覽量:746
想要將一個超聲波傳感器的數據實時傳輸到平臺上,源代碼(修改了溫度實時監控所給代碼的數據處理部分,其他的地方沒有改動)如下,為什么平臺上接受到的數據一直是0?
#include <aJSON.h>
//============= 此處必須修改============
String DEVICEID = ""; // 你的設備ID=======
String APIKEY = ""; // 設備密碼==
String INPUTID = ""; //接口ID==============
//=======================================
//const int LM35 = 0;// LM35 Vout 接 A0
const int TrigPin = 6; //發出超聲波
const int EchoPin = 7; //收到反射回來的超聲波
float cm; //因為測得的距離是浮點型的
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() {
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) {
digitalWrite(TrigPin, LOW); //低高低電平發一個短時間脈沖去TrigPin
delayMicroseconds(2); // delayMicroseconds在更小的時間內延時準確
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW); //通過這里控制超聲波的發射
cm = pulseIn(EchoPin, HIGH) / 58.0; //將回波時間換算成cm
cm = (int(cm * 100.0)) / 100.0; //保留兩位小數
//Serial.print("Distance:");
//Serial.print(cm);
//Serial.print("cm");
//Serial.println();
//cm = 100;
update1(DEVICEID, INPUTID, cm);
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");
}
//強制設備下線,用消除設備掉線延時
//{"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("\"}}");
}