AquaMon – Tuya IoT के साथ एक्वापोनिक्स और फिश टैंक मॉनिटरिंग

क्या आप समुद्री जीवों से प्यार करते हैं? मुझे नहीं लगता कि मुझे एक भी ऐसा व्यक्ति मिलेगा जिसे समुद्री जानवरों से प्यार नहीं होगा। उनके पूरे शरीर पर जीवंत, शानदार रंग, बनावट छलावरण, समुद्री परिस्थितियों के अनुकूल होने और आकर्षण के लिए अनुकूलित। हालाँकि मुझे कभी भी समुद्र या महासागरों में गहरी गोता लगाने और सुंदरता का अनुभव करने का मौका नहीं मिला, मैं हर दिन अपनी पालतू मछली और एक छोटे से एक्वेरियम के साथ इसका आनंद लेता हूं। मछली उन लोगों के लिए आदर्श पालतू जानवर हैं जिनके पास अन्य सामान्य पालतू जानवरों के लिए बहुत समय या स्थान नहीं है। जब भी मैं उदास होता हूं या नए विचारों की तलाश में होता हूं तो सबसे अच्छा काम मैं करता हूं, एक्वेरियम में मछली देखना। इसने मुझे वास्तव में तनाव में सुधार करने और कोविड महामारी के दौरान दिन के सभी व्यस्त कार्यक्रमों के बीच एक खुशी का क्षण प्राप्त करने में मदद की। यह वैज्ञानिक रूप से भी सिद्ध है- "मछली को आगे-पीछे तैरते देखने का सम्मोहक प्रभाव बच्चों को शांत और आराम करने में मदद करता है... मछली देखना न केवल रक्तचाप और हृदय गति को कम करता है बल्कि तनाव और चिंता को कम करता है, मनोदशा में सुधार करता है जिससे हमें शांत और आराम महसूस करने में मदद मिलती है। एक प्राकृतिक और चिकित्सीय एडीएचडी और ऑटिज्म जैसी स्थितियों से पीड़ित बच्चों की मदद करने के लिए उपकरण।" इसलिए जब आपके समुद्री मित्र आपके जीवन में इतना मूल्य जोड़ते हैं कि आप किसका इंतजार कर रहे हैं, तो उनकी ठीक से देखभाल करें ताकि वे पनप सकें। इसके लिए आपको बड़े बजट की आवश्यकता नहीं है, इसे इन सस्ते बोर्डों- Arduino UNO और ESP8266 के साथ आसानी से बनाया जा सकता है। मैं आपको यह भी दिखाने जा रहा हूं कि Tuya IoT प्लेटफॉर्म के साथ एक अच्छा इंटरनेट-कनेक्टेड गैजेट और मोबाइल ऐप बनाना कितना आसान और मजेदार है।

Tuya IoT क्या है और इसका उपयोग क्यों करें?

Tuya एक अग्रणी वैश्विक IoT क्लाउड प्लेटफ़ॉर्म है जो ब्रांडों, ओईएम, डेवलपर्स और खुदरा श्रृंखलाओं की बुद्धिमान आवश्यकताओं को जोड़ता है। यह प्लेटफॉर्म डेवलपर्स को वन-स्टॉप IoT Paa-लेवल सॉल्यूशन प्रदान करता है जिसमें हार्डवेयर डेवलपमेंट टूल्स, ग्लोबल क्लाउड सर्विसेज और स्मार्ट बिजनेस प्लेटफॉर्म डेवलपमेंट शामिल हैं, Tuya दुनिया के अग्रणी IoT क्लाउड प्लेटफॉर्म के निर्माण के लिए टेक्नोलॉजी से लेकर मार्केटिंग चैनलों तक व्यापक इकोसिस्टम सशक्तिकरण की पेशकश करता है। Tuya सभी के लिए खुला है, बीटा टेस्टर और डेवलपर के रूप में अपनी Arduino लाइब्रेरी और Tuya डेवलपमेंट किट रिलीज़ के साथ जुड़ें। साइन अप करें और Tuya Developer Arduino बीटा टेस्ट में शामिल हों।
मैंने Tuya IoT प्लेटफॉर्म का उपयोग करने का निर्णय लिया क्योंकि यह सरल, शक्तिशाली है, और Esp8266 जैसे सस्ते मॉड्यूल पर चल सकता है। साथ ही, Tuya IoT प्लेटफॉर्म आपको चलते-फिरते अपना IoT android और iOS मोबाइल ऐप बनाने के लिए एक ड्रैग-एंड-ड्रॉप MIT ऐप आविष्कारक जैसी सुविधा देता है। तो, आपका प्रोटोटाइप Tuya प्लेटफॉर्म के साथ अगला स्मार्ट IoT उत्पाद हो सकता है। Tuya के बारे में अधिक जानकारी के लिए, Tuya IoT प्लेटफॉर्म के परिचय पर मेरे पिछले प्रोजेक्ट को देखें: https://steptostem.com/2021/08/getting-started-with-arduino-iot-control-with-tuya-iot-platform/

आइए शुरू करते हैं:

फिश टैंक में तापमान, पीएच और टीडीएस जैसे प्रमुख मापदंडों को मापने के लिए 3 सेंसर उपलब्ध हैं। इसके अलावा, आप पानी को गर्म करने या ठंडा करने, मछली को खिलाने, पानी बदलने या दवाओं के प्रशासन के लिए पंपों को सक्रिय करने और दिन/रात के घेरे को अनुकरण करने के लिए प्रकाश की तीव्रता को नियंत्रित करने जैसे कार्यों को स्वचालित करने के लिए कई अलग-अलग एक्ट्यूएटर जोड़ सकते हैं। मैं इस लेख में विस्तार से बताऊंगा।
पीएच(pH) सेंसर: पीएच पानी की अम्लता या क्षारीयता को मापता है। 7 का पीएच मान तटस्थ होता है, जिसमें कम संख्या अम्लता में बढ़ती है और उच्च संख्या क्षारीयता में बढ़ती है। कई मछलियाँ पीएच स्थितियों की एक सीमा में पनप सकती हैं, आमतौर पर 6.5 से 7.5 पीएच तक फैली हुई हैं। हालांकि, कुछ मछलियों को इस सीमा के बाहर विशिष्ट पीएच स्थितियों की आवश्यकता होती है। हालांकि, पीएच समय के साथ बह सकता है, इसलिए एक्वेरियम के पानी का नियमित रूप से परीक्षण करना महत्वपूर्ण है। ज्यादातर समय, अगर अकेला छोड़ दिया जाए, तो पानी में एसिड के जुड़ने के कारण समय के साथ पीएच स्तर कम हो जाएगा। ये एसिड कहां से आ सकते हैं?
यहां कुछ सामान्य स्रोत दिए गए हैं:
  • टैंक में घुल रही हवा में कार्बन डाइऑक्साइड
  • टैनिन पौधे के पदार्थ से पानी में लीचिंग
  • नाइट्रोजन चक्र के माध्यम से टैंक को अम्लीकृत करने वाले अपशिष्ट पचाने वाले बैक्टीरिया
  • दुर्भाग्य से, कोई स्पष्ट संकेत नहीं हैं कि कोई परिवर्तन हुआ है, इसलिए लगातार निगरानी ही यह सुनिश्चित करने का एकमात्र तरीका है कि पानी स्वस्थ और रहने योग्य बना रहे।
    टीडीएस(TDS) सेंसर: टीडीएस घोल के कुल घुले हुए ठोस या घुले हुए ठोस कणों की सांद्रता को मापता है। सामान्य तौर पर, टीडीएस मूल्य जितना अधिक होता है, पानी में घुलनशील ठोस पदार्थ उतने ही अधिक घुलते हैं, और पानी कम साफ होता है। इसलिए, पानी की स्वच्छता को दर्शाने के लिए टीडीएस को एक संदर्भ के रूप में इस्तेमाल किया जा सकता है।
    तापमान(Temperatur) संवेदक: एक्वेरियम का तापमान अक्सर पहली चीज है जिसे लोग घर के एक्वैरियम के लिए परीक्षण करते हैं और मछली में स्वस्थ चयापचय कार्यों को बनाए रखने के लिए महत्वपूर्ण है। अधिकांश मछलियाँ पोइकिलोथर्मिक होती हैं (जिसका अर्थ है कि वे आंतरिक शरीर के तापमान को नियंत्रित नहीं करती हैं) बल्कि वे अपने पर्यावरण पर निर्भर करती हैं इसलिए तापमान एक महत्वपूर्ण कारक है।

    Step 1: सभी सेंसर और मॉड्यूल को जोड़ना

    हार्डवेयर कनेक्शन इस प्रकार हैं।

    Step 2: Tuya पर नया अनुप्रयोग बनाना

    मैं एक स्मार्ट डिवाइस विकसित करने के लिए Tuya IoT प्लेटफॉर्म का उपयोग करने जा रहा हूं। Tuya IoT क्लाउड की सादगी और तेज़ प्रतिक्रिया समय अद्भुत है, आपको केवल फ़ंक्शन परिभाषाएँ, डिज़ाइन ऐप पैनल और बर्न ऑथराइज़ेशन फ़र्मवेयर सेट करने की आवश्यकता है और आपका डिवाइस Tuya Android और iOS ऐप के साथ जाने के लिए तैयार है। नीचे किसी भी तुया उत्पाद विकास के प्रवाह की जाँच करें। नीचे देखें, Tuya IoT प्लेटफॉर्म पर एक नया उत्पाद बनाने के चरण, यदि आपने अभी तक पंजीकरण नहीं किया है, तो यहां पंजीकरण (Register) करें। फिर, Tuya IoT प्लेटफॉर्म पर जाएं और क्लिक करें: बनाएं श्रेणी नहीं मिल रही है?
    आवश्यक उत्पाद जानकारी दर्ज करें:
    Protocol ➡ Wi-Fi
    Power Type ➡ Standard Power Consumption
    नीचे दिखाए गए डेटा प्रकार और गुणों के साथ अपने सेंसर के लिए कस्टम फ़ंक्शन परिभाषाएं बनाएं। मानक फ़ंक्शंस से उन सुविधाओं का चयन करें जिन्हें आप अपने उत्पाद में जोड़ना चाहते हैं या मानक फ़ंक्शंस द्वारा समर्थित नहीं होने पर नए (कस्टम) बनाएं। मानक कार्य तुया द्वारा उनके उत्पाद श्रेणियों के लिए प्रदान किए गए कार्यों को इंगित करते हैं। चूंकि बहुत सारे अंतर्निर्मित उत्पाद हैं, इसलिए आपको आवश्यक कार्यों को ढूंढना आसान है। साथ ही, आप अपने प्रोजेक्ट के आधार पर कस्टम फ़ंक्शंस नामक अपने विशेष फ़ंक्शंस बना सकते हैं।

    डेटा पॉइंट (DP) किसी फ़ंक्शन का सार प्रतिनिधित्व है, और प्रत्येक फ़ंक्शन में एक ID और डेटा प्रकार(datatype) होता है। ?

    डेटा पॉइंट आईडी (डीपी आईडी): डेटा पॉइंट (फ़ंक्शन) के कोड को इंगित करता है। तुया क्लाउड डेटा पॉइंट आईडी के माध्यम से डेटा भेजता या प्राप्त करता है। मैं टीडीएस, पीएच और टेम्प सेंसर के लिए तीन कस्टम डीपी बनाता हूं और किसी भी एक्ट्यूएटर्स को नियंत्रित करने के लिए एक मानक स्विच डीपी बनाता हूं (आप फिश फीडर, बफर सॉल्यूशंस पंप, वाटर कूलिंग फैन जैसे एक्ट्यूएटर्स को नियंत्रित करने के लिए अधिक स्विच जोड़ सकते हैं)।
    हार्डवेयर विकास खंड में मानक Tuya ESP8266 मॉड्यूल SDK का चयन करें।

    Step 3: हमारे AquaMon डिवाइस के लिए ऐप पैनल डिज़ाइन करना

    डिवाइस पैनल में, ब्लैंक पैनल चुनें, और इसे कस्टमाइज़ और सुशोभित करें। आप अपने सभी DP UI तत्वों को देखने में सक्षम होंगे जिन्हें आप संशोधित कर सकते हैं। वास्तव में, आपके लिए ड्रैग-एंड-ड्रॉप और शानदार पैनल बनाने के लिए बहुत सारे UI उपलब्ध हैं। एक बार जब यह तैयार हो जाए, तो रिलीज बटन पर क्लिक करें।
    एक बार आपका पैनल जारी हो जाने के बाद आप मोबाइल पर Tuya IoT ऐप के माध्यम से स्कैन करके इसे देख और उपयोग करने में सक्षम होना चाहिए,

    Step 4: Tuya IoT फर्मवेयर के साथ ESP8266 को अधिकृत करना

    इस परियोजना के लिए एक Tuya उत्पाद के रूप में NodeMCU ESP8266 का उपयोग करने में सक्षम होने के लिए, आपको आवश्यक फर्मवेयर के साथ इसे फ्लैश और अधिकृत करने की आवश्यकता है। ESP8266 को अधिकृत करने के लिए, आपको उत्पाद आईडी (PID) और अपना Tuya IoT खाता नाम (ई-मेल) [email protected] पर भेजना होगा। थोड़ी देर बाद, वे आपको एक टोकन आईडी भेजेंगे। फिर, नीचे दिए गए चरणों का पालन करें:
    सबसे पहले, Tuya PMS सर्विस पेज https://pms.tuya.com/en/login पर जाएं और अगर आपके पास अकाउंट नहीं है तो साइन अप करें। फिर जाएं, उत्पाद के लिए उत्पादन प्रमाणपत्र सक्रिय करने के लिए, टोकन आईडी दर्ज करें। जब टोकन आईडी की पुष्टि हो जाती है, तो ESP8266 फ्लैश और अधिकृत होने के लिए तैयार होता है। याद रखें कि केवल एक बार आईडी एक खाते से अधिकृत कर सकती है। अपने सक्रिय टोकन की जांच करने के लिए प्रोडक्शन मैनेज -> वर्क ऑर्डर मैनेजमेंट लिस्ट में एक्टिवेशन कोड लिस्ट पर जाएं। आप पीएमएस कंसोल सॉफ्टवेयर डाउनलोड सेक्शन से क्लाउड ऑथ टोकन बर्निंग एप्लिकेशन डाउनलोड कर सकते हैं या Google ड्राइव पर इंस्टॉलेशन पैकेज डाउनलोड कर सकते हैं https://drive.google.com/file/d/1SF-rM5qDLaPJiuMHrkqFauVyRXSSHMkj/view?usp=sharing Tuya ESP8266 से गाइड (संदर्भ अनुभाग में लिंक) और अपने पीएमएस खाते से लॉग इन करें। बॉड दर और परीक्षण बॉड सेट करें जैसा कि ऊपर की छवि में दिखाया गया है। इसके अलावा, टोकन दर्ज करें बटन पर क्लिक करें और Tuya [email protected] ईमेल उत्तर से प्राप्त टोकन दर्ज करें।
    अब, NodeMCU V3 LoLin ESP8266 को USB केबल के माध्यम से कंप्यूटर से कनेक्ट करें और इसका पोर्ट नंबर चुनें, जैसे COM5। यदि आपने इसे पहले Arduino IDE या अन्य कंपाइलर के साथ उपयोग नहीं किया है, तो आपको इसके ड्राइवर को स्थापित करने की आवश्यकता हो सकती है। अंत में, टोकन को जलाने के लिए फ्लैश पर क्लिक करें। यदि कुछ भी नहीं टूटता है तो आपको सफलता के साथ एक हरा बॉक्स दिखाई देगा।

    Step 5: प्रोग्रामिंग और चमकती Arduino

    मैं Tuya IoT Arduino पुस्तकालय के विवरण में जाकर इस भाग को सरल बना दूंगा। सबसे पहले, सीरियल पर सेंसर और ESP8266 के साथ काम करने के लिए सभी आवश्यक पुस्तकालयों को आयात करें। सेटअप तुया सीरियल कनेक्शन,
    SoftwareSerial conn(10, 11); // RX,TX TuyaWifi my_device(&conn); /* Current LED status */
    unsigned char led_state = 0; /*Connect network button pin*/
    int key_pin = 7;
    अपना नया डिवाइस बनाते समय Tuya IoT प्लेटफॉर्म पर बनाए गए सभी DP id को परिभाषित और स्टोर करें।
    #define DPID_Switch 101
    #define DPID_Ph_Sensor_Data 112
    #define DPID_TDS_Sensor_Data 113
    #define DPID_Water_Temperature 114
    /* Stores all DPs and their types. PS: array[][0]:dpid, array[][1]:dp type. 
     *                                     dp type(TuyaDefs.h) : DP_TYPE_RAW, 
     *                                     DP_TYPE_BOOL, DP_TYPE_VALUE, DP_TYPE_STRING, DP_TYPE_ENUM, DP_TYPE_BITMAP
    */
    unsigned char dp_array[][2] =
    {
      {DPID_Switch, DP_TYPE_BOOL},
      {DPID_Ph_Sensor_Data, DP_TYPE_VALUE},
      {DPID_TDS_Sensor_Data, DP_TYPE_VALUE},
      {DPID_Water_Temperature, DP_TYPE_VALUE},
    };
    
    
    Tuya IoT कंसोल और फर्मवेयर संस्करण से अपना PID भरें।
    unsigned char pid[] = {"2dhjbzgya8mk2sv3"};
    unsigned char mcu_ver[] = {"3.1.4"};
    Setup void () में आइए हम सभी कॉलबैक को Tuya IoT क्लाउड पर प्रारंभ करें,
    void setup()
    {  
      Serial.begin(9600);
      conn.begin(9600);
      
      pinMode(key_pin, INPUT_PULLUP);
      pinMode(LED_BUILTIN, OUTPUT);
      digitalWrite(LED_BUILTIN, LOW);
    
      //Enter the PID and MCU software version
      my_device.init(pid, mcu_ver);
      //incoming all DPs and their types array, total DPs created (quantity)
      my_device.set_dp_cmd_total(dp_array, 4);
      //register DP download processing callback function
      my_device.dp_process_func_register(dp_process);
      //register upload all DP callback function
      my_device.dp_update_all_func_register(dp_update_all);
      delay(300);
      last_time = millis();  
    }
    हमें Arduino को सीरियल पर ESP8266 पर डेटा प्राप्त करने और भेजने की अनुमति देने के लिए uart सेवा शुरू करने की आवश्यकता है, और ESP8266 बदले में इसे Tuya IoT क्लाउड पर भेजता है।
    सबसे पहले, जांचें कि डिवाइस नेटवर्क मोड में है या नहीं और क्लाउड से जुड़ा है या नहीं, आप एलईडी के माध्यम से स्थिति देख पाएंगे, अगर एलईडी स्थिर है तो इसका मतलब है कि यह क्लाउड से जुड़ा है, अगर ब्लिंक करने का मतलब कनेक्शन मोड में है।
    void loop(){
    my_device.uart_service();
      
      //Enter the connection network mode when Pin7 is pressed.
      if (digitalRead(key_pin) == LOW) {
        delay(80);
        if (digitalRead(key_pin) == LOW) {
          my_device.mcu_set_wifi_mode(SMART_CONFIG);
        }
      }
      /* LED blinks when network is being connected */
      if ((my_device.mcu_get_wifi_work_state() != WIFI_LOW_POWER) && 
      (my_device.mcu_get_wifi_work_state() != WIFI_CONN_CLOUD) && 
      (my_device.mcu_get_wifi_work_state() != WIFI_SATE_UNKNOW)) {
        if (millis()- last_time >= 500) {
          last_time = millis();
    
          if (led_state == LOW) {
            led_state = HIGH;
          } else {
            led_state = LOW;
          }
          digitalWrite(LED_BUILTIN, led_state);
        }
      }
    
    
    अब, Tuya IoT क्लाउड और ऐप Panelmcu_dp_update(DPID, value, 1) पर डेटा भेजने के लिए अपने प्रोग्राम लॉजिक को लागू करें, यदि डिवाइस क्लाउड से जुड़ा है तो अपने डेटा मान इस तरह भेजें।
    phVal = calcPhVal();
      tdsVal = calcTDSVal();
      wTemp = waterTemp();
    
      /* report the pH, TDS and temperature data */
      if ((my_device.mcu_get_wifi_work_state() == WIFI_CONNECTED) || (my_device.mcu_get_wifi_work_state() == WIFI_CONN_CLOUD)) 
      {
        my_device.mcu_dp_update(DPID_Switch, true, 1);
        my_device.mcu_dp_update(DPID_Ph_Sensor_Data, phVal, 1);
        my_device.mcu_dp_update(DPID_TDS_Sensor_Data, tdsVal, 1);
        my_device.mcu_dp_update(DPID_Water_Temperature, wTemp, 1);
      }
      delay(500);  
    }
    
    
    हमारे पास dp_process() फ़ंक्शन भी है, लेकिन इसका उपयोग तब किया जाता है जब आप कमांड प्राप्त करना चाहते हैं और Arduino पिन पर नियंत्रण रखना चाहते हैं, जैसे एक्ट्यूएटर्स को नियंत्रित करना, बस एक स्विच केस लागू करना और ट्रिगर किए गए चार dpid मान के आधार पर आवश्यक क्रियाएं करना। dp_process() के उपयोग पर पिछले ट्यूटोरियल की जाँच करें।
    /**
     * @description: DP download callback function.
     * @param {unsigned char} dpid
     * @param {const unsigned char} value
     * @param {unsigned short} length
     * @return {unsigned char}
     */
    unsigned char dp_process(unsigned char dpid,const unsigned char value[], unsigned short length){
      /* all DP only report, if you want to take actions based upon user interactions with app modify dp_process*/
      return SUCCESS;
    }
    
    
    अंत में सभी मानों को अपडेट करें, यह सुनिश्चित करता है कि आपके सभी डेटा मान लगातार अपडेट किए जाते हैं, आप void loop() में mcu_dp_update(DPID, value, 1) को छोड़ने का प्रयास कर सकते हैं क्योंकि हमारे पास पहले से ही एक dp_update_all() फ़ंक्शन सभी मानों को अपडेट करने के लिए लगातार चल रहा है लेकिन सुनिश्चित करें कि वे चर वैश्विक हैं।
    /**
     * @description: Upload all DP status of the current device.
     * @param {*}
     * @return {*}
     */
    void dp_update_all(void)
    {
      my_device.mcu_dp_update(DPID_Switch, true, 1);
      my_device.mcu_dp_update(DPID_Ph_Sensor_Data, phVal, 1);
      my_device.mcu_dp_update(DPID_TDS_Sensor_Data, tdsVal, 1);
      my_device.mcu_dp_update(DPID_Water_Temperature, wTemp, 1);
    }
    
    

    पूर्ण स्रोत कोड (Codes)

    /**
     * Project: AquaMon (Aquarium Monitoing to help you understand your marine friends needs)
     * Author: Sumit
     **/
    
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <TuyaWifi.h>
    #include <SoftwareSerial.h>
    
    // Data wire is plugged into digital pin 2 on the Arduino
    #define ONE_WIRE_BUS 2
    // Setup a oneWire instance to communicate with any OneWire device
    OneWire oneWire(ONE_WIRE_BUS);  
    // Pass oneWire reference to DallasTemperature library
    DallasTemperature sensors(&oneWire);
    
    #define PHPin A2           //pH meter Analog output to Arduino Analog Input 0
    #define Offset 41.02740741      //deviation compensate
    #define samplingInterval 20
    #define publishInterval 500
    #define ArrayLenth  40    //times of collection
    
    int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
    int pHArrayIndex = 0;
    
    #define TDSPin A3
    
    SoftwareSerial conn(10, 11); // RX, TX
    TuyaWifi my_device(&conn);
    /* Current LED status */
    unsigned char led_state = 0;
    /* Connect network button pin */
    int key_pin = 7;
    
    /* Data point define */
    #define DPID_Switch 101
    #define DPID_Ph_Sensor_Data 112
    #define DPID_TDS_Sensor_Data 113
    #define DPID_Water_Temperature 114
    /* Stores all DPs and their types. PS: array[][0]:dpid, array[][1]:dp type. 
     *                                     dp type(TuyaDefs.h) : DP_TYPE_RAW, 
     *                                     DP_TYPE_BOOL, DP_TYPE_VALUE, DP_TYPE_STRING, DP_TYPE_ENUM, DP_TYPE_BITMAP
    */
    unsigned char dp_array[][2] =
    {
      {DPID_Switch, DP_TYPE_BOOL},
      {DPID_Ph_Sensor_Data, DP_TYPE_VALUE},
      {DPID_TDS_Sensor_Data, DP_TYPE_VALUE},
      {DPID_Water_Temperature, DP_TYPE_VALUE},
    };
    
    unsigned char pid[] = {"2dhjbzgya8mk2sv3"};
    unsigned char mcu_ver[] = {"3.1.4"};
    
    /* last time */
    unsigned long last_time = 0;
    int phVal = 0;
    int tdsVal = 0;
    int wTemp = 0;
    
    void setup()
    {  
      Serial.begin(9600);
      conn.begin(9600);
      sensors.begin();  // Start up the library
      //Initialize networking keys.
      pinMode(key_pin, INPUT_PULLUP);
      pinMode(LED_BUILTIN, OUTPUT);
      digitalWrite(LED_BUILTIN, LOW);
    
      //Enter the PID and MCU software version
      my_device.init(pid, mcu_ver);
      //incoming all DPs and their types array, DP numbers
      my_device.set_dp_cmd_total(dp_array, 4);
      //register DP download processing callback function
      my_device.dp_process_func_register(dp_process);
      //register upload all DP callback function
      my_device.dp_update_all_func_register(dp_update_all);
      delay(300);
      last_time = millis();  
    }
    
    void loop()
    {
      my_device.uart_service();
      
      //Enter the connection network mode when Pin7 is pressed.
      if (digitalRead(key_pin) == LOW) {
        delay(80);
        if (digitalRead(key_pin) == LOW) {
          my_device.mcu_set_wifi_mode(SMART_CONFIG);
        }
      }
      /* LED blinks when network is being connected */
      if ((my_device.mcu_get_wifi_work_state() != WIFI_LOW_POWER) && 
      (my_device.mcu_get_wifi_work_state() != WIFI_CONN_CLOUD) && 
      (my_device.mcu_get_wifi_work_state() != WIFI_SATE_UNKNOW)) {
        if (millis()- last_time >= 500) {
          last_time = millis();
    
          if (led_state == LOW) {
            led_state = HIGH;
          } else {
            led_state = LOW;
          }
          digitalWrite(LED_BUILTIN, led_state);
        }
      }
    
      phVal = calcPhVal();
      tdsVal = calcTDSVal();
      wTemp = waterTemp();
    
      /* report the pH, TDS and temperature data */
      if ((my_device.mcu_get_wifi_work_state() == WIFI_CONNECTED) || (my_device.mcu_get_wifi_work_state() == WIFI_CONN_CLOUD)) 
      {
        my_device.mcu_dp_update(DPID_Switch, true, 1);
        my_device.mcu_dp_update(DPID_Ph_Sensor_Data, phVal, 1);
        my_device.mcu_dp_update(DPID_TDS_Sensor_Data, tdsVal, 1);
        my_device.mcu_dp_update(DPID_Water_Temperature, wTemp, 1);
      }
      delay(500);  
    }
    
    /**
     * @description: DP download callback function.
     * @param {unsigned char} dpid
     * @param {const unsigned char} value
     * @param {unsigned short} length
     * @return {unsigned char}
     */
    unsigned char dp_process(unsigned char dpid,const unsigned char value[], unsigned short length){
      /* all DP only report, if you want to take actions based upon user interactions with app modify dp_process*/
      return SUCCESS;
    }
    
    /**
     * @description: Upload all DP status of the current device.
     * @param {*}
     * @return {*}
     */
    void dp_update_all(void)
    {
      my_device.mcu_dp_update(DPID_Switch, true, 1);
      my_device.mcu_dp_update(DPID_Ph_Sensor_Data, phVal, 1);
      my_device.mcu_dp_update(DPID_TDS_Sensor_Data, tdsVal, 1);
      my_device.mcu_dp_update(DPID_Water_Temperature, wTemp, 1);
    }
    
    double avergearray(int* arr, int number) {
      int i;
      int max, min;
      double avg;
      long amount = 0;
      if (number <= 0) {
        //Serial.println("Error number for the array to avraging!/n");
        return 0;
      }
      if (number < 5) { //less than 5, calculated directly statistics
        for (i = 0; i < number; i++) {
          amount += arr[i];
        }
        avg = amount / number;
        return avg;
      } else {
        if (arr[0] < arr[1]) {
          min = arr[0]; max = arr[1];
        }
        else {
          min = arr[1]; max = arr[0];
        }
        for (i = 2; i < number; i++) {
          if (arr[i] < min) {
            amount += min;      //arr<min
            min = arr[i];
          } else {
            if (arr[i] > max) {
              amount += max;  //arr>max
              max = arr[i];
            } else {
              amount += arr[i]; //min<=arr<=max
            }
          }//if
        }//for
        avg = (double)amount / (number - 2);
      }//if
      return avg;
    }
    
    double calcPhVal()
    {
      static unsigned long samplingTime = millis();
      static unsigned long publishTime = millis();
      static float pHValue, voltage;
      if (millis() - samplingTime > samplingInterval)
      {
        pHArray[pHArrayIndex++] = analogRead(PHPin);
        if (pHArrayIndex == ArrayLenth)pHArrayIndex = 0;
        voltage = avergearray(pHArray, ArrayLenth) * 5.0 / 1024;
        pHValue = -19.18518519 * voltage + Offset;
        samplingTime = millis();
      }
      if (millis() - publishTime > publishInterval)  //Every 800 milliseconds, publish value
      {
         Serial.print("Voltage:");
         Serial.print(voltage, 2);
         Serial.print("    pH value: ");
         Serial.println(pHValue, 2);
        publishTime = millis();
        return pHValue;
      }
    }
    
    double calcTDSVal()
    {
        int sensorValue = analogRead(TDSPin);
        float Voltage = sensorValue*5/1024.0; //Convert analog reading to Voltage
        float tdsValue=(133.42/Voltage*Voltage*Voltage - 255.86*Voltage*Voltage + 857.39*Voltage)*0.5; //Convert voltage value to TDS value
            Serial.print("TDS Value = "); 
            Serial.print(tdsValue);
            Serial.println(" ppm");
        delay(100);
        return tdsValue;    
    }
    
    double waterTemp()
    {
      sensors.requestTemperatures(); 
      float wTemp = sensors.getTempCByIndex(0);
      Serial.print("temp: ");
      Serial.println(wTemp);
      delay(100);
      return wTemp;
    }

    Leave a Reply

    STEPTOSTEM
    %d bloggers like this: