وحدة لاسلكية لمستشعر رطوبة التربة بالسعة على nRF52832

مرحباً بالجميع ، سأتحدث اليوم عن كيف قررت ترقية مستشعر رطوبة التربة باستخدام Aliexpress. منذ حوالي شهر ، تم شراء جهاز استشعار رطوبة التربة. لماذا اشتريتها ولا أعرف ، ربما كل ذلك بسبب سعر 40 روبل :)

بعد تلقي واختبار المستشعر بنجاح (بمساعدة Arduino Nano) ، بدأت أفكر في مكان إرفاقه في نظام عمل قائم بالفعل على Maysensors (والذي سأوضحه لاحقًا). نظرًا لأن المستشعر رخيص للغاية ، أود أن أجد حلاً رخيصًا وغير متشابه.



بنيت دائرة الاستشعار على رقاقة توقيت TLC555. يضاف منظم الجهد ( ورقة البيانات ) XC6206P332 إلى الدائرة عند 3.3 فولت ، على التوالي ، يمكن تشغيل الدائرة من مصدر بحد أقصى 6 فولت. عندما يكون الجهد الكهربائي أقل من 3.3 فولت ، فإن المثبت يعطي الناتج أيضًا ، والذي يستقبله عند الإدخال.

في وقت مبكر من شهرين ، واثنين من وحدات من nRF52832 من شركة EBYTE يكذب الخمول - E73-2G4M04S1B. وحدات رخيصة للغاية ، من حيث السعر ، جميع وحدات nRF52 الأخرى متخلفة كثيرا.



ولكن لديهم 2 عيوب كبيرة بالنسبة لي. الأول والأقل أهمية هو حجم الوحدة. إنها كبيرة جدا. الثاني ناقص ، والأهم من ذلك هو عدم وجود عنصرين صغيرين في الدائرة بسبب فقدان الوحدة لنصف جاذبيتها. العناصر المفقودة عبارة عن محاثين متصلين بساقين DCC و DEC4. هذا أمر سيء لأنه لا يسمح باستخدام وحدات في وضع الطاقة المنخفضة ، 7-8mA VS 15-16mA. لماذا لم يبدأوا في وضعها ، لا أستطيع أن أفهم أن خيار "بسبب التوفير" لا يناسب ، حيث أن المخطط يمكن أن يوفر على عناصر أخرى. بشكل عام ، نضيف إلى قائمة الأمنيات تثبيت المحاثات ووجود وضع DC-DC.

الشيء التالي الذي يجب حله هو إدارة طاقة المستشعر. نظرًا لأن موضوعنا هو سمة البطارية ، فإن الطاقة الثابتة تعد خيارًا سيئًا. أبسط شيء يطرح على الفور هو استخدام الترانزستور في وضع المفتاح. انخفض الاختيار على مجال الترانزستور p- قناة IRLML6402TRPBF.

الشيء التالي الذي يجب التفكير فيه هو منفذ البرمجة ؛ تحت SWD و Serial ، قمت للتو بإنشاء منصات. بالطبع ، أضفت أيضًا موصلًا صغيرًا ، أستخدمه في أجهزة 2x3P الأخرى | 6pin | 1.27 ملم | SMT | دبوس رأس أنثى ، ولكن هذا هو الآن شيء اختياري بحت.

تحتاج أيضًا إلى إضافة زر ساعة ومصباح واحد على الأقل ، بحيث يكون من السهل فهم ما إذا كان يعمل أم لا :).

الشيء التالي الذي يجب حله هو كيفية توصيل وحدة الراديو والمستشعر بالسعة. لم أرغب في استخدام المقبس المثبت على المستشعر والأسلاك الموجودة في المجموعة على الإطلاق. يبلغ مستوى فتحة الثقب في الموصل الموجود على اللوحة حيث يتم لحام المقبس 2.54 مم ، كما يتم عرض صف مكرر إضافي على اللوحة. تقرر استخدام "المشط" المعتاد بزيادات قدرها 2.54 ، ومن شأن استخدام كلا الصفين في آن واحد أن يعطي صلابة إضافية للاتصال.

يبدو أن كل شيء ، من الكعك هناك العديد من العناصر التي يمكن أن تترك أو ملحوم ليوم ممطر ومقبس بسلك (سيكون في متناول اليد في مكان ما :)).

تم صنع اللوحة ، كالعادة ، في برنامج Diptrace. تم تقديم الخيار الأول لـ LUT ، في الواقع حول ما تبين أنه مجرد خطاب في هذه المقالة. في وقت لاحق ، تم إجراء متغير من اللوحة لطلب في المصنع.



بعد التخليل ، التعليب ، القطع ، الحفر واللحام ، حان الوقت للاختبار. بشكل عام ، لم أكن أتوقع أي شيء خاص من المستشعر الموجود على الوحدة من EBYTE ، خاصةً مع نوع من مقياس الرطوبة الخارجي مع علي. لكن في النهاية فوجئت ببعض النتائج. كان الاستهلاك في وضع نقل البيانات لا يزيد عن 9 مللي أمبير (بالنسبة للبطارية نصف التفريغ) ، وكان الاستهلاك في وضع القياس لا يزيد عن 5 مللي أمبير. كان الاستهلاك في وضع السكون 2.1-2.2 μA !!!



مجموع أن الاستشعار يمكن الآن. العمل في وضع الطاقة المنخفضة. قم بقياس ونقل إلى وحدة تحكم UD من خلال شبكة Maysensors قراءات رطوبة التربة ، ودرجة الحرارة ، وشحن البطارية المتبقية ، وقوة إشارة الراديو.



وما هو ميسانسور؟

مجتمع مفتوح المصدر لمطوري البرامج. تم تطوير هذا البروتوكول من قبل المجتمع لإنشاء شبكات سلكية ولاسلكية. تم تطوير المشروع أصلاً لمنصة Arduino.

منصات الأجهزة المدعومة: Linux / Raspberry Pi / Orange Pi | ATMega 328P | ESP8266 | ESP32 | nRF5x | اتميل SAMD المستخدمة في اردوينو صفر (اللحاء M0) | سن المراهقة 3 (MK66FX1M0VMD18) | STM32F1.

مرسلات الراديو المدعومة: NRF24L01 | RFM69 | RFM95 (لورا) | nRF5x

نوع الاتصالات السلكية المدعومة: RS485

الاتصالات المدعومة بين البوابة ووحدة التحكم: MQTT | المسلسل USB | واي فاي | إيثرنت | GSM

رمز البرنامج
uint16_t m_s_m; uint16_t m_s_m2; uint16_t m_s_m_calc; boolean flagSendmsm = 0; float celsius = 0.0; uint32_t rawTemperature = 0; uint32_t rawTemperature2 = 0; uint16_t currentBatteryPercent; uint16_t batteryVoltage = 0; uint16_t battery_vcc_min = 2300; uint16_t battery_vcc_max = 3000; int16_t linkQuality; //#define MY_DEBUG #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 83 #define MY_PARENT_NODE_ID 0 #define MY_PARENT_NODE_IS_STATIC #define MY_TRANSPORT_UPLINK_CHECK_DISABLED #define MSM_SENS_ID 1 #define MSM_SENS_C_ID 2 #define TEMP_INT_ID 3 #define SIGNAL_Q_ID 10 #include <MySensors.h> MyMessage msg_msm(MSM_SENS_ID, V_LEVEL); MyMessage msg_msm2(MSM_SENS_C_ID, V_LEVEL); MyMessage msg_temp(TEMP_INT_ID, V_TEMP); void preHwInit() { pinMode(6, OUTPUT); digitalWrite(6, HIGH); pinMode(15, OUTPUT); pinMode(5, INPUT); } void before() { delay(3000); NRF_POWER->DCDCEN = 1; NRF_UART0->ENABLE = 0; analogReadResolution(12); analogReference(AR_VDD4); NRF_CLOCK->TASKS_HFCLKSTART = 1; NRF_TEMP->TASKS_STOP; NRF_TEMP->EVENTS_DATARDY = 0; NRF_TEMP->INTENSET = 1; } void presentation() { sendSketchInfo("PWS GREEN nRF52", "1.01"); wait(300); present(MSM_SENS_ID, S_CUSTOM, "DATA - SOIL MOISTURE"); wait(300); present(MSM_SENS_C_ID, S_CUSTOM, "% - SOIL MOISTURE"); wait(300); present(TEMP_INT_ID, S_TEMP, "TEMPERATURE"); wait(300); present(SIGNAL_Q_ID, S_CUSTOM, "SIGNAL QUALITY"); wait(300); } void setup() { } void loop() { int_temp(); digitalWrite(15, HIGH); sleep(100); digitalWrite(15, LOW); msm (); digitalWrite(15, HIGH); sleep(100); digitalWrite(15, LOW); wait(50); if (flagSendmsm == 1) { send(msg_msm2.set(m_s_m_calc), 1); wait(3000, 1, 37); wait(200); send(msg_msm.set(m_s_m), 1); wait(3000, 1, 37); flagSendmsm = 0; } wait(200); send(msg_temp.set(celsius, 1), 1); wait(3000, 1, 0); sleep(15000); //sleep(2000); sendBatteryStatus(); sleep(21600000); //6h //sleep(43200000); //12h //sleep(86400000); //24h //sleep(20000); //20s } void int_temp() { for (byte i = 0; i < 10; i++) { NRF_TEMP->TASKS_START = 1; while (!(NRF_TEMP->EVENTS_DATARDY)) {} rawTemperature = NRF_TEMP->TEMP; rawTemperature2 = rawTemperature2 + rawTemperature; wait(10); } celsius = ((((float)rawTemperature2) / 10) / 4.0); rawTemperature2 = 0; } void msm () { digitalWrite(6, LOW); wait(500); for (byte i = 0; i < 10; i++) { m_s_m = analogRead(5); m_s_m2 = m_s_m2 + m_s_m; wait(50); } m_s_m = m_s_m2 / 10; m_s_m2 = 0; digitalWrite(6, HIGH); wait(50); if(m_s_m >3000){ m_s_m = 3000; } if(m_s_m <1100){ m_s_m = 1100; } m_s_m_calc = map(m_s_m, 3000, 1100, 0, 100); flagSendmsm = 1; } 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); linkQuality = calculationRxQuality(); wait(50); sendSignalStrength(linkQuality, 1); wait(2000, 1, V_VAR1); } //****************************** very experimental ******************************* bool sendSignalStrength(const int16_t level, const bool ack) { return _sendRoute(build(_msgTmp, GATEWAY_ADDRESS, SIGNAL_Q_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 ******************************* 


بطبيعة الحال ، فإن برنامج الاختبار ، الذي سأضيفه بالتأكيد (وسأضيفه) ، يأخذ في الاعتبار معامل تفريغ البطارية ، على الرغم من أنني أستخدم إعداد الجهد المرجعي في البرنامج باعتباره بطارية خارجية vdd / 4 ، ولكن لا يزال هناك القليل من الضوضاء عند القياس بمستويات جهد مختلفة. كما أنه ليس من الواضح بعد ما إذا كان سيتم إدخال معامل درجة الحرارة في الحسابات أم لا. هذا غير واضح لأنه لا توجد إحصائيات بعد. ولكن ، بشكل عام ، الإخراج هو نتائج متعاطفة للغاية :). كانت تكلفة كل ما كان يجب إضافته إلى مستشعر الرطوبة الصيني شيئًا ما في منطقة 400 روبل. ليس سيئا على الاطلاق.

فيديو مع الاختبارات


الصور




















مشروع جيثب

هذا هو نوع الإسقاط الذي صدر ... في حين أن Ala Arduino عبارة عن وحدة نمطية ، ولكنها وفرت أماكن للتقدم في القضية مسبقًا ، فستكون الحالة أكثر. يستهلك القليل ، وينام دائمًا مع استهلاك حوالي 2 μA ، لذلك يجب أن تدوم بطاريات CR2450 لفترة طويلة.

مكان تسعد دائمًا بمساعدة كل من يريد التعرف عليه مع MYSENSORS (تثبيت الألواح ، والعمل مع المتحكمين الدقيقين nRF5 في بيئة Arduino IDE ، ونصائح حول العمل مع بروتوكول mysensors ، ومناقشة المشروعات - telegram chatmysensors_rus .

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


All Articles