Funkmodul für kapazitiven Bodenfeuchtesensor am nRF52832

Hallo allerseits, heute werde ich darüber sprechen, wie ich beschlossen habe, den Bodenfeuchtesensor mit Aliexpress aufzurüsten. Vor etwa einem Monat wurde ein Bodenfeuchtesensor gekauft. Warum ich es gekauft habe und ich weiß es nicht, wahrscheinlich alles wegen des Preises von 40 Rubel :)

Nachdem ich den Sensor erhalten und erfolgreich getestet hatte (mithilfe von Arduino Nano), begann ich darüber nachzudenken, wo ich ihn in einem bereits funktionierenden Maysensors-basierten System anbringen sollte (was ich später erläutern werde). Da der Sensor super billig ist, würde ich sehr gerne eine ähnlich billige und unprätentiöse Lösung finden.



Die Sensorschaltung ist auf einem TLC555-Timer-Chip aufgebaut. Der Spannungsregler XC6206P332 ( Datenblatt ) wird der Schaltung mit 3,3 V hinzugefügt. Die Schaltung kann von einer Quelle mit maximal 6 V gespeist werden. Wenn die Versorgungsspannung unter 3,3 V liegt, gibt der Stabilisator auch den Ausgang aus, den er am Eingang empfängt.

Bereits zwei Monate lagen zwei Module des nRF52832 der Firma EBYTE im Leerlauf - E73-2G4M04S1B. Sehr günstige Module, preislich liegen alle anderen nRF52-Module weit zurück.



Aber sie haben zwei wesentliche Nachteile für mich. Das erste und weniger wichtige ist die Größe des Moduls. Sie sind ziemlich groß. Das zweite Minus, wichtiger, ist das Fehlen von zwei kleinen Elementen in der Schaltung, wodurch das Modul die Hälfte seiner Attraktivität verliert. Die fehlenden Elemente sind zwei Induktoren, die mit den DCC- und DEC4-Beinen verbunden sind. Dies ist schlecht, da die Verwendung von Modulen im Energiesparmodus 7-8 mA gegenüber 15-16 mA nicht zulässig ist. Warum sie nicht damit begonnen haben, kann ich nicht verstehen, dass die Option "wegen Einsparungen" nicht passt, da das System andere Elemente einsparen könnte. Im Allgemeinen fügen wir der Wunschliste die Installation von Induktivitäten und das Vorhandensein des DC-DC-Modus hinzu.

Das nächste zu lösende Problem ist die Energieverwaltung des Sensors. Da es sich bei unserem Thema um ein Batteriethema handelt, ist eine konstante Stromversorgung eine schlechte Option. Das Einfachste, was sofort bittet, ist die Verwendung eines Transistors im Schlüsselmodus. Die Wahl fiel auf den Feld-p-Kanal-Transistor IRLML6402TRPBF.

Das nächste, woran ich denken muss, ist der Programmierport. Unter SWD und Serial habe ich gerade Pads erstellt. Natürlich habe ich auch einen Mikroanschluss hinzugefügt, den ich in anderen 2x3P- Geräten | verwende 6pin | 1,27 mm | SMT | Pin Header Female , aber dies ist jetzt eine rein optionale Sache.

Sie müssen auch eine Uhrentaste und mindestens eine LED hinzufügen, damit Sie leichter verstehen, ob es funktioniert oder nicht :).

Als nächstes musste gelöst werden, wie das Funkmodul und der kapazitive Sensor verbunden werden. Ich wollte die am Sensor installierte Buchse und die Kabel im Kit überhaupt nicht verwenden. Der Lochabstand im Anschluss auf der Platine, auf der der Sockel gelötet ist, beträgt 2,54 mm. Eine zusätzliche Duplizierreihe wird ebenfalls auf der Platine angezeigt. Es wurde beschlossen, den üblichen "Kamm" in Schritten von 2,54 zu verwenden, und die gleichzeitige Verwendung beider Reihen verleiht der Verbindung zusätzliche Steifigkeit.

Es scheint alles zu sein, von den Brötchen gibt es mehrere Elemente, die für einen regnerischen Tag übrig bleiben oder gelötet werden können, und eine Buchse mit einem Draht (irgendwo nützlich :)).

Das Board wurde wie üblich im Diptrace-Programm hergestellt. Die erste Option wurde für die LUT getroffen, und zwar in Bezug auf die Rede in diesem Artikel. Später wurde eine Variante des Boards für eine Bestellung im Werk angefertigt.



Nach dem Beizen, Verzinnen, Schneiden, Bohren und Löten ist es Zeit zum Testen. Im Allgemeinen hatte ich von EBYTE nichts Besonderes von dem Sensor am Modul erwartet, insbesondere von einer Art externem Feuchtigkeitsmesser mit Ali. Aber am Ende war ich sogar von einigen Ergebnissen überrascht. Der Verbrauch im Datenübertragungsmodus betrug nicht mehr als 9 mA (für eine halbentladene Batterie), der Verbrauch im Messmodus betrug nicht mehr als 5 mA. Der Verbrauch im Schlafmodus betrug 2,1-2,2 μA !!!



Insgesamt kann der Sensor jetzt. Arbeiten Sie im Energiesparmodus. Messen Sie die Messwerte der Bodenfeuchtigkeit, der Temperatur, der verbleibenden Batterieladung und der Funksignalstärke und übertragen Sie sie über das Maysensors-Netzwerk an den UD-Controller.



Und was sind Maysensoren?

A ist eine Open Source Community von Softwareentwicklern. Dieses Protokoll wurde von der Community entwickelt, um Funk- und Kabelnetzwerke zu erstellen. Das Projekt wurde ursprünglich für die Arduino-Plattform entwickelt.

Unterstützte Hardwareplattformen: Linux / Raspberry Pi / Orange Pi | ATMega 328P | ESP8266 | ESP32 | nRF5x | Atmel SAMD verwendet in Arduino Zero (Cortex M0) | Teensy3 (MK66FX1M0VMD18) | STM32F1.

Unterstützte Funksender: NRF24L01 | RFM69 | RFM95 (LoRa) | nRF5x

Unterstützte drahtgebundene Kommunikationsart: RS485

Unterstützte Kommunikation zwischen Gate und Controller: MQTT | Serielle USB | Wifi | Ethernet | GSM

Programmcode
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 ******************************* 


Die Software ist natürlich ein Test, den ich sicherlich hinzufügen würde (und hinzufügen werde), wobei der Batterieentladungskoeffizient berücksichtigt wird, obwohl ich die Referenzspannungseinstellung in der Software als externe Batterie vdd / 4 verwende, aber beim Messen mit verschiedenen Spannungspegeln immer noch wenig Rauschen auftritt. Es ist auch noch nicht klar, ob der Temperaturkoeffizient in die Berechnungen einbezogen werden soll oder nicht. Es ist unklar, da noch keine Statistiken vorliegen. Aber im Allgemeinen ist die Ausgabe sehr sympathische Ergebnisse :). Die Kosten für alles, was dem chinesischen Feuchtigkeitssensor hinzugefügt werden musste, lagen im Bereich von 400 Rubel. Gar nicht schlecht.

Video mit Tests


Fotos




















GitHub-Projekt

Das ist die Art von Projektion, die herauskam ... während Ala Arduino ein Modul ist, aber im Voraus Stellen für die Befestigung am Gehäuse vorgesehen hat, wird der Fall weiter gehen. Es verbraucht wenig, schläft im Grunde immer mit einem Verbrauch von ca. 2 μA, daher sollten CR2450-Batterien eine lange Lebensdauer haben.

Ein Ort, an dem Sie immer gerne allen helfen, die sich mit MYSENSORS vertraut machen möchten (Installation von Boards, Arbeit mit nRF5-Mikrocontrollern in der Arduino IDE-Umgebung, Tipps zur Arbeit mit dem mysensors-Protokoll, Diskussion von Projekten - Telegramm-Chat @mysensors_rus .

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


All Articles