跳到內容
  • 版面
  • 最新
  • 標籤
  • 熱門
  • World
  • 使用者
  • 群組
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 預設 (Yeti)
  • 未使用主題設計
Collapse
品牌標誌
  1. 首頁
  2. ESP32教學與討論
  3. TDS Sensor水質硬度傳感器
  4. TDS Sensor水質硬度傳感器-MQTT

TDS Sensor水質硬度傳感器-MQTT

已排程 已置頂 已鎖定 已移動 TDS Sensor水質硬度傳感器
tds sensor水質硬度傳感器mqttesp32
1 貼文 1 Posters 14 瀏覽
  • 從舊到新
  • 從新到舊
  • 最多點贊
回覆
  • 在新貼文中回覆
登入後回覆
此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
  • adminA 離線
    adminA 離線
    admin
    寫於 最後由 編輯
    #1

    2.TDS Sensor-MQTT.pdf

    #include <WiFi.h>
    #include <PubSubClient.h> //請先安裝PubSubClient程式庫
    
    #define TdsSensorPin 33       //TDS感測器接入腳位GPIO 33
    #define VREF 3.3              // analog reference voltage(Volt) of the ADC
    #define SCOUNT  30            // sum of sample point
    // ------ 以下修改成你自己的WiFi帳號密碼 ------
    char* ssid = "SSID";
    char* password = "PASSWORD";
    
    int analogBuffer[SCOUNT];     // store the analog value in the array, read from ADC
    int analogBufferTemp[SCOUNT];
    int analogBufferIndex = 0;
    int copyIndex = 0;
    
    float averageVoltage = 0;
    float tdsValue = 0;
    float temperature = 25;       // 設定當前環境溫度 (計算PPM需使用溫度資訊)
    
    // median filtering algorithm
    int getMedianNum(int bArray[], int iFilterLen){
      int bTab[iFilterLen];
      for (byte i = 0; i<iFilterLen; i++)
      bTab[i] = bArray[i];
      int i, j, bTemp;
      for (j = 0; j < iFilterLen - 1; j++) {
        for (i = 0; i < iFilterLen - j - 1; i++) {
          if (bTab[i] > bTab[i + 1]) {
            bTemp = bTab[i];
            bTab[i] = bTab[i + 1];
            bTab[i + 1] = bTemp;
          }
        }
      }
      if ((iFilterLen & 1) > 0){
        bTemp = bTab[(iFilterLen - 1) / 2];
      }
      else {
        bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
      }
      return bTemp;
    }
    // ------ 以下修改成你MQTT設定 ------
    char* MQTTServer = "broker.mqttgo.io";//免註冊MQTT伺服器
    int MQTTPort = 1883;//MQTT Port
    char* MQTTUser = "";//不須帳密
    char* MQTTPassword = "";//不須帳密
    //推播主題1:推播PPM(記得改Topic)
    char* MQTTPubTopic1 = "YourTopic/class/TDSPPM";
    long MQTTLastPublishTime;//此變數用來記錄推播時間
    long MQTTPublishInterval = 1000;//每10秒推撥一次
    WiFiClient WifiClient;
    PubSubClient MQTTClient(WifiClient);
    
    void setup() {
      Serial.begin(115200);
      pinMode(TdsSensorPin,INPUT);
    
      //開始WiFi連線
      WifiConnecte();
    
      //開始MQTT連線
      MQTTConnecte();
    }
    
    void loop() {
       static unsigned long analogSampleTimepoint = millis();
      if(millis()-analogSampleTimepoint > 40U){     //every 40 milliseconds,read the analog value from the ADC
        analogSampleTimepoint = millis();
        analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);    //read the analog value and store into the buffer
        analogBufferIndex++;
        if(analogBufferIndex == SCOUNT){ 
          analogBufferIndex = 0;
        }
      }   
      
      static unsigned long printTimepoint = millis();
      if(millis()-printTimepoint > 800U){
        printTimepoint = millis();
        for(copyIndex=0; copyIndex<SCOUNT; copyIndex++){
          analogBufferTemp[copyIndex] = analogBuffer[copyIndex];
          
          // read the analog value more stable by the median filtering algorithm, and convert to voltage value
          averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 4096.0;
          
          //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0)); 
          float compensationCoefficient = 1.0+0.02*(temperature-25.0);
          //temperature compensation
          float compensationVoltage=averageVoltage/compensationCoefficient;
          
          //convert voltage value to tds value
          tdsValue=(133.42*compensationVoltage*compensationVoltage*compensationVoltage - 255.86*compensationVoltage*compensationVoltage + 857.39*compensationVoltage)*0.5;
          
          //Serial.print("voltage:");
          //Serial.print(averageVoltage,2);
          //Serial.print("V   ");
          Serial.print("TDS Value:");
          Serial.print(tdsValue,0);
          Serial.println("ppm");
    
        }
      }
    
      //如果WiFi連線中斷,則重啟WiFi連線
      if (WiFi.status() != WL_CONNECTED) { WifiConnecte(); }
    
      //如果MQTT連線中斷,則重啟MQTT連線
      if (!MQTTClient.connected()) {  MQTTConnecte(); }
    
      //如果距離上次傳輸已經超過10秒,則Publish
      if ((millis() - MQTTLastPublishTime) >= MQTTPublishInterval ) {
        byte tds1 = 0;
        tds1 = tdsValue,0;
        // ------ 將TDS送到MQTT主題 ------
        MQTTClient.publish(MQTTPubTopic1, String(tds1).c_str());
        Serial.println("已推播到MQTT Broker");
        MQTTLastPublishTime = millis(); //更新最後傳輸時間
      }
      MQTTClient.loop();//更新訂閱狀態
      delay(50);
    }
    
    //開始WiFi連線
    void WifiConnecte() {
      //開始WiFi連線
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("WiFi連線成功");
      Serial.print("IP Address:");
      Serial.println(WiFi.localIP());
    }
    
    //開始MQTT連線
    void MQTTConnecte() {
      MQTTClient.setServer(MQTTServer, MQTTPort);
      while (!MQTTClient.connected()) {
        //以亂數為ClietID
        String  MQTTClientid = "esp32-" + String(random(1000000, 9999999));
        if (MQTTClient.connect(MQTTClientid.c_str(), MQTTUser, MQTTPassword)) {
          //連結成功,顯示「已連線」。
          Serial.println("MQTT已連線");
    
        } else {
          //若連線不成功,則顯示錯誤訊息,並重新連線
          Serial.print("MQTT連線失敗,狀態碼=");
          Serial.println(MQTTClient.state());
          Serial.println("五秒後重新連線");
          delay(5000);
        }
      }
    }```

    平台使用上有任何問題歡迎寄信至[email protected]詢問

    1 條回覆 最後回覆
    0
    回覆
    • 在新貼文中回覆
    登入後回覆
    • 從舊到新
    • 從新到舊
    • 最多點贊


    風狂logo 藏碳logo 南台logo SDGS2 SDGS7 SDGS12
    • 登入

    • 沒有帳戶? 註冊

    Powered by NodeBB Contributors
    • 第一個貼文
      最後的貼文
    0
    • 版面
    • 最新
    • 標籤
    • 熱門
    • World
    • 使用者
    • 群組