Module sans fil pour capteur capacitif d'humidité du sol sur nRF52832

Bonjour à tous, aujourd'hui, je vais vous expliquer comment j'ai décidé de mettre à niveau le capteur d'humidité du sol avec Aliexpress. Il y a environ un mois, un capteur d'humidité du sol a été acheté. Pourquoi je l'ai acheté et je ne sais pas, probablement à cause du prix de 40 roubles :)

Après avoir reçu et testé avec succès le capteur (avec l'aide d'Arduino Nano), j'ai commencé à penser où le fixer dans un système basé sur Maysensors déjà fonctionnel (que j'expliquerai plus tard). Étant donné que le capteur est super bon marché, j'aimerais beaucoup trouver une solution tout aussi bon marché et sans prétention.



Le circuit du capteur est construit sur une puce de minuterie TLC555. Le régulateur de tension XC6206P332 ( fiche technique ) est ajouté au circuit à 3,3 V, respectivement, le circuit peut être alimenté à partir d'une source d'un maximum de 6 V. Lorsque la tension d'alimentation est inférieure à 3,3 V, le stabilisateur donne également la sortie, qu'il reçoit à l'entrée.

Dès deux mois, deux modules de nRF52832 de la société EBYTE étaient inactifs - E73-2G4M04S1B. Modules très bon marché, en termes de prix, tous les autres modules nRF52 sont loin derrière.



Mais ils ont 2 inconvénients importants pour moi. Le premier et le moins important est la taille du module. Ils sont assez gros. Le deuxième inconvénient, plus important est le manque de deux petits éléments dans le circuit à cause duquel le module perd la moitié de son attractivité. Les éléments manquants sont deux inductances connectées aux pieds DCC et DEC4. C'est mauvais car cela ne permet pas l'utilisation de modules en mode basse consommation, 7-8mA VS 15-16mA. Pourquoi ils n'ont pas commencé à les mettre, je ne comprends pas, l'option "à cause des économies" ne convient pas, car le système pourrait économiser sur d'autres éléments. En général, nous ajoutons à la liste de souhaits l'installation d'inductances et la présence du mode DC-DC.

La prochaine chose à résoudre est la gestion de l'alimentation du capteur. Puisque notre thème est un thème de batterie, une puissance constante est une mauvaise option. La chose la plus simple qui supplie immédiatement est l'utilisation d'un transistor en mode clé. Le choix s'est porté sur le transistor à canal p de champ IRLML6402TRPBF.

La prochaine chose à penser est le port de programmation; sous SWD et Serial, je viens de faire des pads. Bien sûr, j'ai également ajouté un micro connecteur, que j'utilise dans d'autres appareils 2x3P | 6pin | 1,27 mm | SMT | Pin Header Female , mais c'est désormais une option purement facultative.

Vous devez également ajouter un bouton d'horloge et au moins une LED, afin qu'il soit plus facile de comprendre si cela fonctionne ou non :).

La prochaine chose à résoudre était de savoir comment connecter le module radio et le capteur capacitif. Je ne voulais pas du tout utiliser la prise installée sur le capteur et les fils dans le kit. Le pas du trou dans le connecteur sur la carte où la prise est soudée est de 2,54 mm, une ligne de duplication supplémentaire est également affichée sur la carte. Il a été décidé d'utiliser le "peigne" habituel par incréments de 2,54, et l'utilisation des deux lignes à la fois donnera une rigidité supplémentaire à la connexion.

Il semble que ce soit tout, des petits pains il y a plusieurs éléments qui peuvent être laissés ou soudés pour un jour de pluie et une prise avec un fil (cela sera utile quelque part :)).

La planche, comme d'habitude, a été faite dans le cadre du programme Diptrace. La première option a été faite pour LUT, en fait à propos de ce qui s'est avéré être juste le discours de cet article. Plus tard, une variante de la planche a été faite pour une commande à l'usine.



Après le décapage, l'étamage, la découpe, le perçage et le brasage, il est temps de tester. En général, je n'attendais rien de spécial du capteur sur le module d'EBYTE, en particulier avec une sorte d'humidimètre externe avec Ali. Mais au final, j'ai même été surpris par certains résultats. La consommation en mode transfert de données n'était pas supérieure à 9 mA (pour une batterie à moitié déchargée), la consommation en mode mesure n'était pas supérieure à 5 mA. La consommation en mode veille était de 2,1-2,2 μA !!!



Total que le capteur peut maintenant. Fonctionne en mode basse consommation. Mesurez et transmettez au contrôleur UD via le réseau Maysensors les relevés d'humidité du sol, la température, la charge restante de la batterie et la force du signal radio.



Et qu'est-ce que Maysensors?

A est une communauté open source de développeurs de logiciels. Ce protocole est développé par la communauté pour créer des réseaux radio et filaires. Le projet a été initialement développé pour la plate-forme Arduino.

Plates-formes matérielles prises en charge: Linux / Raspberry Pi / Orange Pi | ATMega 328P | ESP8266 | ESP32 | nRF5x | Atmel SAMD utilisé dans Arduino Zero (Cortex M0) | Teensy3 (MK66FX1M0VMD18) | STM32F1.

Émetteurs radio pris en charge: NRF24L01 | RFM69 | RFM95 (LoRa) | nRF5x

Type de communication filaire pris en charge: RS485

Communication prise en charge entre la porte et le contrôleur: MQTT | USB série | Wifi | Ethernet | GSM

Code de programme
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 ******************************* 


Naturellement, le logiciel de test, que j'ajouterais certainement (et ajouterai), prend en compte le coefficient de décharge de la batterie, bien que j'utilise le réglage de la tension de référence dans le logiciel comme une batterie externe vdd / 4, mais il y a toujours un peu de bruit lors de la mesure avec différents niveaux de tension. On ne sait pas encore non plus s'il faut ou non introduire le coefficient de température dans les calculs. Ce n'est pas clair car il n'y a pas encore de statistiques. Mais, en général, la sortie est des résultats très sympathiques :). Le coût de tout ce qui devait être ajouté au capteur d'humidité chinois était de l'ordre de 400 roubles. Pas mal du tout.

Vidéo avec tests


Les photos




















Projet GitHub

C'est le genre de projection qui est sorti ... alors qu'Ala Arduino est un module, mais a fourni des emplacements pour le montage sur le boîtier à l'avance, donc le boîtier sera plus loin. Il consomme peu, dort toujours avec une consommation d'environ 2 μA, donc les piles CR2450 devraient durer longtemps.

Un endroit où vous êtes toujours heureux d'aider tous ceux qui veulent se familiariser avec MYSENSORS (installation de cartes, travail avec des microcontrôleurs nRF5 dans l'environnement Arduino IDE, conseils pour travailler avec le protocole mysensors, discussion de projets - télégramme chat @mysensors_rus .

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


All Articles