用于nRF52832上的电容性土壤湿度传感器的无线模块

大家好,今天我将讨论如何决定使用Aliexpress升级土壤湿度传感器。 大约一个月前,购买了土壤湿度传感器。 为什么我买了它,我不知道,可能全部是因为40卢布的价格:)

接收并成功测试了传感器(在Arduino Nano的帮助下),我开始考虑将其安装在已经运行的基于Maysensors的系统中的位置(我将在后面解释)。 由于传感器非常便宜,因此我非常想找到一个类似的便宜且朴实的解决方案。



传感器电路建立在TLC555计时器芯片上。 XC6206P332稳压器( 数据表 )分别以3.3v的电压添加至电路,该电路可以通过最大6v的电源供电。 当电源电压低于3.3V时,稳定器也提供输出,该输出在输入端接收。

早在两个月前,来自EBYTE公司的nRF52832的两个模块即E73-2G​​4M04S1B处于闲置状态。 就价格而言,非常便宜的模块,所有其他nRF52模块都远远落后。



但是对我来说,它们有两个明显的缺点。 第一个也是次要的是模块的大小。 他们很大。 第二个负号,更重要的是电路中缺少两个小元件,因此模块失去了一半的吸引力。 缺少的元件是连接到DCC和DEC4引脚的两个电感器。 这很糟糕,因为它不允许在低功耗模式(7-8mA VS 15-16mA)中使用模块。 为什么他们不开始放他们呢,我不明白,“因为节省”选项不合适,因为该方案可以节省其他因素。 通常,我们在心愿单中添加电感的安装以及DC-DC模式的存在。

接下来要解决的是传感器电源管理。 由于我们的主题是电池主题,因此恒定功率是一个不好的选择。 立即求助的最简单的事情是在键控模式下使用晶体管。 选择权在于现场p沟道晶体管IRLML6402TRPBF。

接下来要考虑的是编程端口;在SWD和串行下,我只是做焊盘了。 当然,我还添加了一个微型连接器,该微型连接器可在其他2x3P设备中使用 6pin | 1.27毫米| SMT | Pin Header Female ,但是现在这纯粹是可选的。

您还需要添加一个时钟按钮和至少一个LED,以便更容易理解其是否有效:)。

接下来要解决的是如何连接无线电模块和电容传感器。 我根本不想使用传感器上安装的插座和套件中的电线。 焊接插座的板上连接器的孔距为2.54 mm,板上还会显示一个附加的重复行。 决定以2.54的增量使用通常的“梳子”,并且同时使用两行将为连接提供额外的刚性。

似乎全部,在雨天里,包子中可以保留或焊接一些元素,还有带电线的插座(在某些地方会派上用场)。

像往常一样,该板是在Diptrace程序中制作的。 第一个选择是为LUT选择的,实际上,实际上只是本文的演讲。 后来,该板的变体在工厂定购。



经过酸洗,镀锡,切割,钻孔和焊接后,就该进行测试了。 总的来说,我没想到EBYTE模块上的传感器会有什么特别的地方,特别是对于带有Ali的某种外部水分计。 但是最后我甚至对一些结果感到惊讶。 数据传输模式下的功耗不超过9 mA(对于半放电电池),测量模式下的功耗不超过5 mA。 睡眠模式下的功耗为2.1-2.2μA!!!



传感器现在可以总计。 在低功耗模式下工作。 通过Maysensors网络测量并传输到UD控制器,以读取土壤湿度,温度,剩余电池电量和无线电信号强度的读数。



什么是Maysensors?

A是软件开发人员的开源社区。 该协议由社区开发,以创建无线电和有线网络。 该项目最初是为Arduino平台开发的。

支持的硬件平台:Linux / Raspberry Pi / Orange Pi | ATMega 328P | ESP8266 | ESP32 | nRF5x | Arduino Zero(Cortex M0)中使用的Atmel SAMD |德州仪器TI.com.cn Teensy3(MK66FX1M0VMD18)| STM32F1。

支持的无线电发射器:NRF24L01 | RFM69 | RFM95(LoRa)| 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卢布左右。 一点都不差。

带有测试的视频


照片




















GitHub项目

就是这样的预测……虽然Arduino Ala是一个模块,但是已经提供了预先安装到机箱的位置,因此机箱会更进一步。 它消耗很少,基本上总是以约2μA的消耗进入睡眠状态,因此CR2450电池应可长时间使用。

在这里,您总是乐于帮助想要了解MYSENSORS的所有人(在Arduino IDE环境中安装板,使用nRF5微控制器,使用mysensors协议的技巧,讨论项目的建议-电报chat @mysensors_rus

Source: https://habr.com/ru/post/zh-CN460587/


All Articles