• <table id="0ws66"></table>
  • <noscript id="0ws66"><source id="0ws66"></source></noscript>

    esp01 relay代碼分享一下 smartconfig連網 arduino版

    作者:tengfei | 更新時間:2020-06-23 | 瀏覽量:729

    替換key和id后即可使用。 還有需要改進的地方, 高手路過的話給些建議。 斷電后通電自動連網比較慢,不能像官方的那么快。大神給點建議。

    功能:

    1. smartconfig連網
    2. 下次自動連網
    3. 連wifi成功,閃一下
    4. 連貝殼物聯成功,閃兩下
    5. pay: 開
    6. stop: 關
    7. timer : 定時器。倒計時自動關閉

     

    #include
    #include

    //=============  此處必須修該============
    String DEVICEID = "xxx"; // 你的設備編號   ==
    String  APIKEY = "xxxx"; // 設備密碼==
    //=======================================
    unsigned long lastCheckInTime = 0; //記錄上次報到時間
    const unsigned long postingInterval = 40000; // 每隔40秒向服務器報到一次
    unsigned long timerTime = 0; //定時器

    const char* host = "www.embanju.org";
    const int httpPort = 8181;

    int pins = 0;
    unsigned char num = 0;
    void smartConfig()
    {
      WiFi.mode(WIFI_STA);
      Serial.println("Waitting SmartConfig!");
      WiFi.beginSmartConfig();          //開啟SmartConfig服務
      while (1)
      {
        delay(500);
        if (WiFi.smartConfigDone())       //連接成功標志
        {
          Serial.println("SmartConfig Success!");

          delay(500);
          Serial.println();
          Serial.printf("SSID:%s\t\n", WiFi.SSID().c_str());      //顯示WIFi名
          Serial.printf("PASSWORD:%s\t\n", WiFi.psk().c_str());   //顯示WIFi密碼
         
          //wifi通后 閃一下
          digitalWrite(pins, LOW);//開
          delay(500);
          digitalWrite(pins, HIGH);//先關閉
          
          Serial.printf("IP address: ");
          Serial.println(WiFi.localIP());
          break;
        }
        else {
          delay(500);
          Serial.print(".");
          num++;
          if (num >= 10)
          {
            Serial.print("\n");
            num = 0;
          }
        }
      }
    }


    WiFiClient client;

    void setup() {

      Serial.begin(115200);

        pinMode(pins, OUTPUT);
        digitalWrite(pins, HIGH);//先關閉
        Serial.println("wifi SSID: ");
        Serial.println(WiFi.SSID());
        Serial.println("wifi PSK: ");
        Serial.println(WiFi.psk());
        WiFi.begin();

      unsigned long startTime = millis();//等20秒
      while (WiFi.status() != WL_CONNECTED && millis() - startTime < 20000)
      {
        Serial.println('.');
        delay(500);
      }
      
       if(WiFi.status() == WL_CONNECTED)  {
          Serial.println("WiFi connected");
          Serial.println("IP address: ");
          Serial.println(WiFi.localIP());

          //wifi通后 閃一下
          digitalWrite(pins, LOW);//開
          delay(500);
          digitalWrite(pins, HIGH);//關閉
        }else{
          //10秒后不閃,說明無wifi,進入配置模式
          Serial.println("WiFi not connected!");
          smartConfig();
        }

    }


    void loop() {

      if (!client.connected()) {
        if (!client.connect(host, httpPort)) {
          Serial.println("connection failed");
          delay(2000);
          return;
        }else{
          Serial.println("connection successd");
        }
      }

      if (millis() - lastCheckInTime > postingInterval || lastCheckInTime == 0) {
        checkIn();
      }

      // Read all the lines of the reply from server and print them to Serial
      if (client.available()) {
      
        String inputString = client.readStringUntil('\n');
        inputString.trim();
        Serial.println(inputString);
        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);
        }
      }
    }

    void processMessage(aJsonObject *msg) {
      aJsonObject* method = aJson.getObjectItem(msg, "M");
      aJsonObject* content = aJson.getObjectItem(msg, "C");
      aJsonObject* seconds = aJson.getObjectItem(msg, "sign");
      aJsonObject* client_id = aJson.getObjectItem(msg, "ID");
      if (!method) {
        return;
      }
      String M = method->valuestring;
      if (M == "checkinok") {
        //登陸成功通后閃2下
          digitalWrite(pins, LOW);//開
          delay(500);
          digitalWrite(pins, HIGH);//關閉
          delay(500);
          digitalWrite(pins, LOW);//開
          delay(500);
          digitalWrite(pins, HIGH);//關閉
      }
      if (M == "say") {
        String C = content->valuestring;
        String F_C_ID = client_id->valuestring;
        
        if (C == "timer") {//定時器 盡量不用,計時器,設備不能接收其它命令,且顯示不在線。
          String S = seconds->valuestring;
          timerTime = millis();
          digitalWrite(pins, LOW);//開
          sayToClient(F_C_ID, "timmer "+S+" sec");
          Serial.println("timmer "+S+" sec");
          S = S.toInt()*1000;
          while (millis() - timerTime < S.toInt())
          {
            Serial.write('.');
            delay(1000);
          }
          Serial.println("");
          Serial.println("timmer end!");
          digitalWrite(pins, HIGH);//關閉
          sayToClient(F_C_ID, "timmer end!");
         }else if (C == "play") {
          digitalWrite(pins, LOW);
          sayToClient(F_C_ID, "LED All on!");
         }else if (C == "stop") {
          digitalWrite(pins, HIGH);
          sayToClient(F_C_ID, "LED All off!");
        }
        else {
          int pin = C.toInt();//.toInt()
          pinMode(pin, OUTPUT);
          digitalWrite(pin, LOW);
          sayToClient(F_C_ID, "LED pin:" + C+" is LOW");
          delay(3000);
          digitalWrite(pin, HIGH);
          sayToClient(F_C_ID, "LED pin:" + C+" is HIGH");
        }
      }
    }

    void checkIn() {
      Serial.println("checkIn");
      String msg = "{\"M\":\"checkin\",\"ID\":\"" + DEVICEID + "\",\"K\":\"" + APIKEY + "\"}\n";
      client.print(msg);
      lastCheckInTime = millis();
    }

    void sayToClient(String client_id, String content) {
      Serial.println("sayToClient");
      String msg = "{\"M\":\"say\",\"ID\":\"" + client_id + "\",\"C\":\"" + content + "\"}\n";
      client.print(msg);
      lastCheckInTime = millis();
    }


    評論:共0條

    返回頂部
    国产综合在线