वायरलेस पानी रिसाव संवेदक nRF52832, DIY परियोजना पर

हेब पर DIY या डू-इट-खुद सेक्शन के सभी पाठकों को शुभकामनाएं! आज मैं अपनी अगली परियोजना के बारे में बात करना चाहता हूं, यह लेख बैटरी से चलने वाले पानी के रिसाव डिटेक्टर के बारे में होगा। पिछली परियोजनाओं की तरह, यह डिवाइस nRF52832 माइक्रोकंट्रोलर पर चलता है। इस सेंसर के तीन संस्करण हैं, nRF52832 वाले सभी तीन संस्करणों में तैयार किए गए मॉड्यूल का उपयोग किया जाता है, इस लेख में हम मध्य संस्करण के बारे में बात करेंगे जो HJYIOT से YJ-17103 मॉड्यूल का उपयोग करता है।



द्रव डिटेक्टर चिप SN74LVC1G00 पर कार्यान्वित किया जाता है | दाताशीट । मैं सर्किट डिजाइन और ऑपरेशन के सिद्धांत का संक्षेप में वर्णन करूंगा। सेंसर इलेक्ट्रोड नंबर 1 जमीन से जुड़ा है, सेंसर इलेक्ट्रोड नंबर 2 एक 100 ओम अवरोधक के माध्यम से SN74LVC1G00 microcircuit के पैरों ए और बी से जुड़ा हुआ है, 1M रोकनेवाला के माध्यम से 3.3V भी इस लाइन से जुड़ा हुआ है, एक कैपेसिटेंस भी सर्किट में जोड़ा जाता है। जब microcircuit ए और बी के पैरों पर तरल के साथ कोई संपर्क नहीं होता है, तो तार्किक इकाई, क्रमशः एम के पैर से जुड़े पैर वाई पर (प्रोग्रामर द्वारा निर्मित तुलनित्र के माध्यम से रुकावट का पता लगाने के लिए कॉन्फ़िगर किया गया) तर्क शून्य है। जैसे ही तरल के साथ संपर्क होता है और पैर A और B कम होते हैं, SN74LVC1G00 माइक्रोक्रेसीट के पैर Y पर संकेत भी उल्टा हो जाता है, जिससे एक रुकावट पैदा होगी, जो एमके को नींद से हटा देगी। भविष्य में, चिप SN74LVC1G00 चिप SN74LVC1G14 द्वारा प्रतिस्थापित किया जा सकता है | डेटाशीट , और शायद नहीं :)। अंतर्निहित तुलनित्र के माध्यम से एमके पैरों से द्रव का पता लगाने की योजना नहीं है।

मेरी अन्य सभी परियोजनाओं की तरह, यह भी एक Arduino प्रोजेक्ट है और, पिछले एक साल (लगभग) की सभी परियोजनाओं की तरह, यह भी मैसेंसर्स प्रोजेक्ट के लिए बनाया गया है। मेरे अन्य लेखों की तरह, मैं इस लेख में थोड़ा सा मैसेंजर के विषय पर बात करूंगा।

मायसेंसर डेवलपर्स का एक खुला स्रोत समुदाय है। यह प्रोटोकॉल समुदाय द्वारा रेडियो और वायर्ड नेटवर्क बनाने के लिए विकसित किया गया है। परियोजना मूल रूप से Arduino प्लेटफॉर्म के लिए विकसित की गई थी। एक मानक मैसेंसर्स नेटवर्क में एक गेट (गेटवे), रिट्रांसफॉर्मर और एंड डिवाइस (नोड्स) होते हैं। एक नेटवर्क में 254 डिवाइस तक हो सकते हैं, प्रत्येक डिवाइस को 254 सेंसर, सेंसर, एक्ट्यूएटिंग यूनिट्स से लैस किया जा सकता है। नेटवर्क ऑपरेशन, डेटा प्रोसेसिंग, स्क्रिप्ट निष्पादन और अन्य उपकरणों में इंटरैक्शन यूडी कंट्रोलर का उपयोग करके किया जाता है। कुछ नियंत्रक (माजर्डोमो) क्रमशः कई नेटवर्क और मैसेंसर्स (मल्टी-गेट) के साथ काम करते हैं, एक नियंत्रक द्वारा नियंत्रित एक से अधिक नेटवर्क हो सकते हैं।

समर्थित हार्डवेयर प्लेटफ़ॉर्म : लिनक्स / रास्पबेरी पाई / ऑरेंज पाई | ATMega 328P | ESP8266 | ESP32 | nRF5x (Cortex M0, M4) | Armelino Zero (Cortex M0) में प्रयुक्त Atmel SAMD | Teensy3 (MK66FX1M0VMD18) | STM32F1।

समर्थित रेडियो ट्रांसमीटर : NRF24L01 | RFM69 | RFM95 (लोरा) | nRF5x

समर्थित वायर्ड संचार प्रकार : RS485

गेट और कंट्रोलर के बीच समर्थित संचार : MQTT | सीरियल USB | Wifi | ईथरनेट | जीएसएम

लीक सेंसर पर वापस। डिवाइस CR2430, CR2450 या CR2477 बैटरी द्वारा संचालित है। नींद की खपत 3μA से कम है। ट्रांसमिशन गति - 250Kbps, 10-15ms। ट्रांसमिशन के समय बिजली की खपत 8mA से अधिक नहीं है। सैद्धांतिक रूप से, एकल बैटरी पर बैटरी का जीवन बैटरी के स्व-निर्वहन के समय के बराबर होता है। व्यवहार में, ज़ाहिर है, सब कुछ कम रसीला है, क्योंकि एक पंजीकरण, प्रस्तुति, आवधिक स्तर का आवधिक भेजना है, ताकि बैटरी जीवन मूल्य के करीब हो - स्व-मुक्ति समय / 2 :)। बिजली की आपूर्ति सीधे बैटरी से की जाती है, बैटरी स्तर VDD पिन से सीधे नियंत्रित किया जाता है। नेटवर्क मोड में सेंसर के पंजीकरण को इंगित करने, सेवा मोड को इंगित करने और रिसाव का पता लगाने के लिए सेंसर में एक आरजीबी एलईडी स्थापित किया गया है। स्वाभाविक रूप से, एलईडी का उपयोग बिल्कुल नहीं किया जा सकता है या आंशिक रूप से उपयोग किया जा सकता है।

डिवाइस बोर्ड को LUT विधि के अनुसार इसके आगे के निर्माण के लिए बनाया गया था। इसलिए, इस विकल्प की बारीकियों से, यह पटरियों की एक बढ़ी हुई चौड़ाई है, पटरियों के बीच बढ़ी हुई दूरी, इंटरलेयर संक्रमणों के लिए बढ़े हुए क्षेत्रों (छिद्रों के अधिक सुविधाजनक ड्रिलिंग के लिए), और बोर्ड के छोटे क्षेत्र के कारण खाली क्षेत्रों में भरने की अनुपस्थिति। बाद में, उत्पादन में एक आदेश के लिए एक विकल्प बनाया गया था।



डिवाइस केस को दो भागों में डिजाइन किया गया था। स्टील संपर्क शिकंजा के लिए 2 छेद के साथ बोर्ड और निचले हिस्से (स्नान) को माउंट करने के लिए स्थानों के साथ शीर्ष कवर (पेंच सिर के लिए सिलिकॉन सीलेंट के साथ सील करना संभव है या नहीं) और बटन (रीसेट और मोड) के लिए दो ट्यूब। मुद्रण एक ANICUBIC फोटॉन SLA 3D प्रिंटर पर किया गया था। मुद्रण के बाद, सैंडपेपर 320 और 1000 को ढक्कन के जोड़ों और शरीर के निचले हिस्से में फिट करने के लिए संसाधित किया गया था।





सेंसर तस्वीरें















टेस्ट कोड
wl_standart_test.ino

bool button_flag; bool send_flag; bool detection; bool nosleep; byte timer; bool AckG; bool AckB; bool AckL; bool PRESENT_ACK; bool flag_lq; unsigned long SLEEP_TIME = 172800000; //48 hours //unsigned long SLEEP_TIME = 3600000; //1 hour unsigned long oldmillis; unsigned long newmillis; unsigned long interrupt_time; unsigned long SLEEP_TIME_W; uint16_t currentBatteryPercent; uint16_t batteryVoltage = 0; uint16_t battery_vcc_min = 2300; uint16_t battery_vcc_max = 3000; int16_t linkQuality; #define MY_DISABLED_SERIAL #define MY_RADIO_NRF5_ESB #define MY_RF24_PA_LEVEL (NRF5_PA_MAX) //#define MY_PASSIVE_NODE #define MY_NODE_ID 86 #define MY_PARENT_NODE_ID 0 #define MY_PARENT_NODE_IS_STATIC #define MY_TRANSPORT_UPLINK_CHECK_DISABLED #define INTR_PIN 3 //(PORT0, gpio 5) #include <MySensors.h> // see https://www.mysensors.org/download/serial_api_20 #define W_L_SENS_CHILD_ID 0 #define LINK_QUALITY_CHILD_ID 253 MyMessage sensMsg(W_L_SENS_CHILD_ID, V_VAR1); //MyMessage voltMsg(CHILD_ID_VOLT, V_VOLTAGE); void preHwInit() { pinMode(POWER_PIN, OUTPUT); digitalWrite(POWER_PIN, HIGH); wait(3000); pinMode(RED_LED, OUTPUT); digitalWrite(RED_LED, HIGH); pinMode(GREEN_LED, OUTPUT); digitalWrite(GREEN_LED, HIGH); pinMode(BLUE_LED, OUTPUT); digitalWrite(BLUE_LED, HIGH); pinMode(PIN_BUTTON, INPUT); pinMode(W_L_SENS, INPUT); //pinMode(24, OUTPUT); //pinMode(20, OUTPUT); } void before() { NRF_POWER->DCDCEN = 1; NRF_UART0->ENABLE = 0; digitalWrite(BLUE_LED, LOW); sleep(50); digitalWrite(BLUE_LED, HIGH); } void presentation() { sendSketchInfo("EFEKTA ST WL Sensor", "1.1"); present(W_L_SENS_CHILD_ID, S_CUSTOM, "SWITCH STATUS"); present(LINK_QUALITY_CHILD_ID, S_CUSTOM, "LINK_QUALITY"); } void setup() { digitalWrite(BLUE_LED, LOW); wait(100); digitalWrite(BLUE_LED, HIGH); wait(200); digitalWrite(BLUE_LED, LOW); wait(100); digitalWrite(BLUE_LED, HIGH); lpComp(); detection = false; SLEEP_TIME_W = SLEEP_TIME; wait(100); sendBatteryStatus(); wait(100); send(sensMsg.set(detection), 1); wait(2000, 1, V_VAR1); } void loop() { if (nosleep == 0) { oldmillis = millis(); sleep(SLEEP_TIME_W); } if (detection) { if (digitalRead(PIN_BUTTON) == 1 && button_flag == 0 && digitalRead(W_L_SENS) == 0) { //back side button detection button_flag = 1; nosleep = 1; } if (digitalRead(PIN_BUTTON) == 1 && button_flag == 1 && digitalRead(W_L_SENS) == 0) { digitalWrite(GREEN_LED, LOW); wait(10); digitalWrite(GREEN_LED, HIGH); wait(50); } if (digitalRead(PIN_BUTTON) == 0 && button_flag == 1 && digitalRead(W_L_SENS) == 0) { nosleep = 0; button_flag = 0; digitalWrite(GREEN_LED, HIGH); lpComp_reset(); } if (digitalRead(W_L_SENS) == 1 && digitalRead(PIN_BUTTON) == 0) { //sens detection newmillis = millis(); interrupt_time = newmillis - oldmillis; SLEEP_TIME_W = SLEEP_TIME_W - interrupt_time; send(sensMsg.set(detection), 1); wait(3000, 1, V_VAR1); if (AckG == 1) { while (timer < 10) { timer++; digitalWrite(BLUE_LED, LOW); wait(20); digitalWrite(BLUE_LED, HIGH); wait(30); } timer = 0; AckG = 0; wait(200); } else { while (timer < 10) { timer++; digitalWrite(RED_LED, LOW); wait(20); digitalWrite(RED_LED, HIGH); wait(30); } timer = 0; send(sensMsg.set(detection), 1); wait(3000, 1, V_VAR1); if (AckG == 1) { while (timer < 10) { timer++; digitalWrite(BLUE_LED, LOW); wait(20); digitalWrite(BLUE_LED, HIGH); wait(30); } timer = 0; AckG = 0; } else { while (timer < 10) { timer++; digitalWrite(RED_LED, LOW); wait(20); digitalWrite(RED_LED, HIGH); wait(30); } timer = 0; } lpComp_reset(); } } if (SLEEP_TIME_W < 60000) { SLEEP_TIME_W = SLEEP_TIME; sendBatteryStatus(); } } else { //if (detection == -1) { SLEEP_TIME_W = SLEEP_TIME; sendBatteryStatus(); } } void receive(const MyMessage & message) { if (message.type == V_VAR1) { if (message.sensor == W_L_SENS_CHILD_ID) { if (mGetCommand(message) == 1) { if (message.isAck()) { AckG = 1; } else { } } } } if (message.type == I_BATTERY_LEVEL) { if (message.sensor == 255) { if (mGetCommand(message) == 3) { if (message.isAck()) { AckB = 1; } else { } } } } if (message.type == V_VAR1) { if (message.sensor == 255) { if (mGetCommand(message) == 1) { if (message.isAck()) { AckL = 1; } else { } } } } } void sendBatteryStatus() { wait(100); batteryVoltage = hwCPUVoltage(); wait(20); if (batteryVoltage > battery_vcc_max) { currentBatteryPercent = 100; } else if (batteryVoltage < battery_vcc_min) { currentBatteryPercent = 0; } else { currentBatteryPercent = (100 * (batteryVoltage - battery_vcc_min)) / (battery_vcc_max - battery_vcc_min); } sendBatteryLevel(currentBatteryPercent, 1); wait(3000, C_INTERNAL, I_BATTERY_LEVEL); if (AckB == 1) { AckB = 0; flag_lq = 1; } else { sendBatteryLevel(currentBatteryPercent, 1); wait(3000, C_INTERNAL, I_BATTERY_LEVEL); if (AckB == 1) { AckB = 0; flag_lq = 1; } } //send(powerMsg.set(batteryVoltage), 1); //wait(2000, 1, V_VAR1); //sleep(10000); // if (flag_lq == 1) { linkQuality = calculationRxQuality(); wait(50); sendSignalStrength(linkQuality, 1); wait(2000, 1, V_VAR1); if (AckL == 1) { AckL = 0; } else { sendSignalStrength(linkQuality, 1); wait(2000, 1, V_VAR1); if (AckL == 1) { AckG = 0; } } flag_lq = 0; } } void lpComp() { NRF_LPCOMP->PSEL = INTR_PIN; NRF_LPCOMP->ANADETECT = 1; NRF_LPCOMP->INTENSET = B0100; NRF_LPCOMP->ENABLE = 1; NRF_LPCOMP->TASKS_START = 1; NVIC_SetPriority(LPCOMP_IRQn, 15); NVIC_ClearPendingIRQ(LPCOMP_IRQn); NVIC_EnableIRQ(LPCOMP_IRQn); } void s_lpComp() { if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) { NRF_LPCOMP->INTENCLR = B0100; } } void r_lpComp() { NRF_LPCOMP->INTENSET = B0100; } #if __CORTEX_M == 0x04 #define NRF5_RESET_EVENT(event) \ event = 0; \ (void)event #else #define NRF5_RESET_EVENT(event) event = 0 #endif void lpComp_reset () { s_lpComp(); detection = false; NRF_LPCOMP->EVENTS_UP = 0; r_lpComp(); } //****************************** very experimental ******************************* bool sendSignalStrength(const int16_t level, const bool ack) { return _sendRoute(build(_msgTmp, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_SET, V_VAR1, ack).set(level)); } int16_t calculationRxQuality() { int16_t nRFRSSI_temp = transportGetReceivingRSSI(); int16_t nRFRSSI = map(nRFRSSI_temp, -85, -40, 0, 100); if (nRFRSSI < 0) { nRFRSSI = 0; } if (nRFRSSI > 100) { nRFRSSI = 100; } return nRFRSSI; } //****************************** very experimental ******************************* extern "C" { void LPCOMP_IRQHandler(void) { detection = true; NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP); NRF_LPCOMP->EVENTS_UP = 0; MY_HW_RTC->CC[0] = (MY_HW_RTC->COUNTER + 2); } } 

MyBoardNRF5.h

 #ifndef _MYBOARDNRF5_H_ #define _MYBOARDNRF5_H_ #ifdef __cplusplus extern "C" { #endif // __cplusplus #define PINS_COUNT (32u) #define NUM_DIGITAL_PINS (32u) #define NUM_ANALOG_INPUTS (8u) #define NUM_ANALOG_OUTPUTS (8u) #define PIN_LED1 (27) #define PIN_LED2 (25) #define PIN_LED3 (26) #define RED_LED (PIN_LED1) #define GREEN_LED (PIN_LED2) #define BLUE_LED (PIN_LED3) #define PIN_BUTTON (14) #define W_L_SENS (8) #define POWER_PIN (7) #define PIN_SERIAL_RX (12) #define PIN_SERIAL_TX (11) #ifdef __cplusplus } #endif #endif 


nRF52832 प्रोग्राम को कम-पावर मोड (DC-DC मोड) में संचालित करने के लिए कॉन्फ़िगर किया गया है। MC, आंतरिक LPCOMOM तुलनित्र के माध्यम से SN74LVC1G00 माइक्रोक्रेकिट के सिग्नल से नींद से जाग गया है। डिवाइस में सेवा मोड लागू करने के लिए एक घड़ी बटन भी होता है, जैसे डिवाइस युग्मन, डिवाइस को रीसेट करना, आदि। रिसाव डिटेक्टर के समान एमके पैर पर बटन घाव है। दोनों पंक्तियों को शोट्स्की डायोड्स द्वारा अलग किया गया है। मॉनिटर मोड में चिप SN74LVC1G00 कुछ भी नहीं खाता है। Microcircuit का पावर प्रबंधन MK के पैरों से किया जाता है।

फिलहाल, पानी के रिसाव के लिए एक नियंत्रक का विकास जिसके साथ इन सेंसर को काम करना चाहिए, लगभग समाप्त हो गया है।

लीकेज सेंसर दिखाने वाला वीडियो


गिथब परियोजना
(गेरबर फाइलें, सॉफ्टवेयर, केस मॉडल, घटकों की सूची)

एक ऐसी जगह जहां आप हमेशा उन सभी की मदद करने के लिए खुश होते हैं जो MYSENSORS से परिचित होना चाहते हैं (बोर्ड स्थापित करना, Arduino IDE वातावरण में nRF5 माइक्रोकंट्रोलर के साथ काम करना, mysensors प्रोटोकॉल के साथ काम करने के लिए टिप्स, नए कॉपीराइट प्रोजेक्ट्स पर चर्चा करना - telegram chat @mysensors_rus)

Source: https://habr.com/ru/post/hi460177/


All Articles