ESP8266 上报数据到贝壳物联

下面贴上代码:

#include <aJSON.h>
#include <SPI.h>  
#include <Wire.h>  
#include <dht11.h>
#include <DS3231.h>

//=============  此处必须修改============
String DEVICEID="1494"; // 你的设备编号   ==
String  APIKEY="d6easd772"; // 设备密码==
String INPUTID1="1583";//接口ID==============
String INPUTID2="1588";//接口ID==============
String INPUTID3="1589";//接口ID==============
String INPUTID4="1590";//接口ID==============
//=======================================
unsigned long lastCheckInTime = 0; //记录上次报到时间
unsigned long lastUpdateTime = 0;//记录上次上传数据时间
const unsigned long postingInterval = 40000; // 每隔40秒向服务器报到一次
const unsigned long updateInterval = 10000; // 数据上传间隔时间10秒
String inputString = "";//串口读取到的内容
boolean stringComplete = false;//串口是否读取完毕
boolean CONNECT = true; //连接状态
boolean isCheckIn = false; //是否已经登录服务器
char* parseJson(char *jsonString);//定义aJson字符串
///****************************************************
dht11 DHT11;
#define DHT11PIN 2

/////////////PM2.5
int measurePin = 1; //Connect dust sensor to Arduino A1 pin
int ledPower = 3; //Connect 3 led driver pins of dust sensor to Arduino D3
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
///////////////////PM2.5
/////******************************************************
int val;//MQ_2
float valTemperature;//定义变量
float valHumidity;//定义变量
void update1(String did, String inputid, float value);
void setup() {
   Serial.begin(115200);//ESP 8266 工作波特率
   Wire.begin();
   int chk = DHT11.read(DHT11PIN);
   pinMode(ledPower,OUTPUT);
   delay(5000);
}
void loop() {
   if(millis() - lastCheckInTime > postingInterval || lastCheckInTime==0) {
     checkIn();
   }
    val=analogRead(0);
    valTemperature = (float)DHT11.temperature; 
    valHumidity = (float)DHT11.humidity; 
    digitalWrite(ledPower,LOW);
    delayMicroseconds(samplingTime);
    voMeasured = analogRead(measurePin); // read the dust value
    delayMicroseconds(deltaTime);
    digitalWrite(ledPower,HIGH); // turn the LED off
    delayMicroseconds(sleepTime);
 
    calcVoltage = voMeasured * (5.0 / 1024.0);
     
    dustDensity = 0.17 * calcVoltage - 0.1;
   if((millis() - lastUpdateTime >= updateInterval) && isCheckIn) 
   {
      update1(DEVICEID,INPUTID1,val);//MQ_2
      update1(DEVICEID,INPUTID2,valTemperature);
      update1(DEVICEID,INPUTID3,valHumidity);
      update1(DEVICEID,INPUTID4,dustDensity);
   ///************************
    }
   serialEvent();
     if (stringComplete) {
       inputString.trim();
       //Serial.println(inputString);
       if(inputString=="CLOSED"){
         Serial.println("connect closed!");
         CONNECT=false;        
       }else{
         int len = inputString.length()+1;    
         if(inputString.startsWith("{") && inputString.endsWith("}")){
           char jsonString[len];
           inputString.toCharArray(jsonString,len);
           aJsonObject *msg = aJson.parse(jsonString);
           processMessage(msg);
           aJson.deleteItem(msg);          
         }
       }      
       // clear the string:
       inputString = "";
       stringComplete = false;    
   }
}
void checkIn() {//定时签到,防止离线
   if (!CONNECT) {
     isCheckIn = false;
     Serial.print("+++");
     delay(500);  
     Serial.print("
"); 
     delay(1000);
     Serial.print("AT+RST
"); 
     delay(6000);
     CONNECT=true;
     lastCheckInTime=0;
   }
   else{
     Serial.print("{"M":"checkin","ID":"");
     Serial.print(DEVICEID);
     Serial.print("","K":"");
     Serial.print(APIKEY);
     Serial.print(""}
");
     lastCheckInTime = millis(); 
     isCheckIn = true;  
   }
}
void processMessage(aJsonObject *msg){
   aJsonObject* method = aJson.getObjectItem(msg, "M");
   aJsonObject* content = aJson.getObjectItem(msg, "C");     
   aJsonObject* client_id = aJson.getObjectItem(msg, "ID");  
   //char* st = aJson.print(msg);
   if (!method) {
     return;
   }
     //Serial.println(st); 
     //free(st);
     String M=method->valuestring;
     String C=content->valuestring;
     String F_C_ID=client_id->valuestring;
     if(M=="say"){
       if(C=="play"){
        // digitalWrite(LED, HIGH);
         sayToClient(F_C_ID,"LED on!");    
       }
       if(C=="stop"){
       //  digitalWrite(LED, LOW);
         sayToClient(F_C_ID,"LED off!");    
       }
       if(C=="wendu"){
          sayToClient(F_C_ID,String(valTemperature));
        }
        if(C=="shidu"){
          sayToClient(F_C_ID,String(valHumidity));
        }
        if(C=="mq2"){
          sayToClient(F_C_ID,String(val));
        }
         if(C=="pm"){
          sayToClient(F_C_ID,String(dustDensity));
        }
       }
}
void sayToClient(String client_id, String content){//命令回复
   Serial.print("{"M":"say","ID":"");
   Serial.print(client_id);
   Serial.print("","C":"");
   Serial.print(content);
   Serial.print(""}
");
   lastCheckInTime = millis();
}
void serialEvent() {
   while (Serial.available()) {
     char inChar = (char)Serial.read();
     inputString += inChar;
     if (inChar == '
') {
       stringComplete = true;
     }
   }
}
//上报数据  拼接json
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(""}}");
  lastCheckInTime = millis();
  lastUpdateTime= millis(); 
}
//同时上传两个接口数据调用此函数
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(""}}");
  lastCheckInTime = millis();
  lastUpdateTime= millis(); 
}
原文地址:https://www.cnblogs.com/nightnine/p/6570994.html