<noscript id="mmkmi"><source id="mmkmi"></source></noscript>
  • <noscript id="mmkmi"><kbd id="mmkmi"></kbd></noscript>
  • <table id="mmkmi"><source id="mmkmi"></source></table>
  • arduino上傳溫度和發送指令

    作者:一聲嘆息 | 更新時間:2020-12-27 | 瀏覽量:764

    #include <aJSON.h>
    #include <RSCG12864B.h>//引用庫文件
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <SoftwareSerial.h>

    //=============  此處必須修改============
    String DEVICEID = "19567"; // 你的設備ID=======
    String APIKEY = "1008154e0"; // 設備密碼==
    String INPUTID = "17560"; //接口ID==============
    //=======================================

    // 數據輸出腳接開發板數字引腳2(溫度傳感器)
    #define ONE_WIRE_BUS 2 
    char Temp_Buffer[6];
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
     float T_sum;

    int incomedate = 0;
    int relayPin = 8; //繼電器引腳

    int IN1 = 4;   // IN1 connected to pin 4
    int IN2 = 5;   
    int ENA = 3;  

    int IN3 = 6;   // IN3 connected to pin6
    int IN4 = 7;   
    int ENB = 8;  
    unsigned long time = 1200;  //delay time
    int value = 100;   // the duty cycle(0-255)

    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);

      pinMode(relayPin, OUTPUT);

       RSCG12864B.begin();//串口初始化
       RSCG12864B.brightness(255);//屏幕亮度
      sensors.begin(); //初始化總線
      
      RSCG12864B.clear();

       pinMode(IN1, OUTPUT);
        pinMode(IN2, OUTPUT);
         pinMode(IN3, OUTPUT);
        pinMode(IN4, OUTPUT);

      delay(5000);//等一會兒ESP8266

     
    }
    void loop() {

       // put your main code here, to run repeatedly:
       //當前溫度為:B5 B1 C7 B0 CE C2 B6 C8 CE AA A3 BA   
       char chn[]={char(0xB5), char(0xB1),char(0xC7),char(0xB0),char(0xCE),char(0xC2),char(0xB6),char(0xC8),char(0xCE),char(0xAA),char(0xA3),char(0xBA),0,};//當前溫度為:

      sensors.requestTemperatures(); // 發送命令獲取溫度,
      //向總線上所有設備發送溫度轉換請求,默認情況下該方法會阻塞
      dtostrf(sensors.getTempCByIndex(0),5,2,Temp_Buffer); // float 到 char
       RSCG12864B.print_string_12_xy(14,13,chn);//坐標16,15,顯示chn里的內容(當前溫度為:) 
       RSCG12864B.print_string_12(Temp_Buffer);//顯示溫度
      delay(500); 

      //每一定時間查詢一次設備在線狀態,同時替代心跳
      if (millis() - lastCheckStatusTime > postingInterval)
          {
            checkStatus();
          }
      //checkout 50ms 后 checkin
      if ( checkoutTime != 0 && millis() - checkoutTime > 50 )
          {
            checkIn();
            checkoutTime = 0;
          }
          
      //每隔一定時間上傳一次數據
      if (millis() - lastUpdateTime > updateInterval)
          {
            update1(DEVICEID, INPUTID, sensors.getTempCByIndex(0)); //上傳溫度
            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);
        }
      }
    }


    //處理網絡接收到到指令,執行相關動作
    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 == "startdc")     //發送指令 playdc  ,直流電機啟動
        {
             digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
            analogWrite(ENA, value);
            delay(time);
          say(F_C_ID, "d-c generator start!");
        }
        if (C == "stopdc") //發送指令 stopdc  ,直流電機停止
        {
             digitalWrite(IN1, LOW);
        digitalWrite(IN2, LOW);
        digitalWrite(ENA, 0);
        delay(time);
          say(F_C_ID, "d-c generator stop!");
        }
        
        if (C == "waterin") {
             digitalWrite(IN3, HIGH);
        digitalWrite(IN4, LOW);
            delay(time);
          say(F_C_ID, "正在抽水進來!");
        }
        if (C == "waterout") {
             digitalWrite(IN3, LOW);
        digitalWrite(IN4, HIGH);
        delay(time);
          say(F_C_ID, "正在抽水出去!");
        }
        if (C == "waterstop")
        {
             digitalWrite(IN3, LOW);
        digitalWrite(IN4, LOW); 
        delay(time);
          say(F_C_ID, "抽水已經停止!");

        }
            if (C == "Templay")
         {
          digitalWrite(relayPin, LOW);
          say(F_C_ID, "relay 開始啟動!");
       
        }
        if (C == "Temstop")
        {
         digitalWrite(relayPin, HIGH);
          say(F_C_ID, "relay Stop!");
        }
    }
        
      }


    //發送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":"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();
    }

    //上傳一個接口數據
    //{"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("\"}}");
      
    }
     


    評論:共1條

    一聲嘆息 評論于:2020-12-27 00:39:13
    可以上傳溫度,但是不能接收指令, 兩部分分開可以實現功能,整合在一起就不行。有大神遇到過相似問題嗎? 請指點一下我。 謝謝。 qq:1209337072,
    返回頂部
    <noscript id="mmkmi"><source id="mmkmi"></source></noscript>
  • <noscript id="mmkmi"><kbd id="mmkmi"></kbd></noscript>
  • <table id="mmkmi"><source id="mmkmi"></source></table>
  • 三上悠亚在线观看