Suhu nirkabel, kelembaban dan sensor tekanan atmosfer pada nRF52832

Salam untuk semua pembaca Habr! Artikel hari ini akan membahas tentang sensor suhu, kelembaban, dan tekanan atmosfer dengan masa pakai baterai yang lama. Sensor bekerja pada mikrokontroler nRF52832 ( lembar data ). Untuk mendapatkan suhu, kelembaban dan tekanan atmosfer, sensor - datasheet BME280 digunakan . Sensor ini didukung oleh baterai CR2430 / CR2450 / CR2477. Konsumsi dalam mode transmisi adalah 8mA, dalam mode tidur 5mA. Jadi, soal pesanan.


Ini adalah proyek Arduino, program ini ditulis dalam Arduino IDE. Perpustakaan Adafruit Industries digunakan untuk mengoperasikan sensor BME280 - sensor github | github BME280 . Untuk bekerja dengan papan nRF52832, Ardeino IDE menggunakan proyek Sandeep Mistry - github . Transfer data ke pengontrol Smart House dilakukan sesuai dengan protokol Mysensors - github board | protokol | perpustakaan .

Papan sensor dikembangkan dalam program Diptrace. Dimensi papan adalah 36,8mm X 25mm.



Daftar komponen yang digunakan
  • C1 - cap0603 100nF
  • C2 - cap0603 100nF
  • R1 - res0603 332
  • R2 - res0603 85b
  • R3 - res0603 113
  • R4 - res0603 912
  • R5 - res0603 113
  • R6 - res0603 512
  • R7 - res0603 512
  • RGBL1 - led0805 rgb
  • SWD - PPHF 2x3 6p 1.27mm
  • U1 - YJ-16048 nRF52832
  • U2 - BME280
  • CONNECT - saklar kebijaksanaan KLS7-TS5401
  • RESET - tombol jam KLS7-TS5401
  • Tempat Baterai KW-BS-2450-2-SMT
  • Saklar Dsc0012


Biaya dipesan melalui jlcpcb.com - $ 2 untuk 5 buah warna apa pun.





Tautan ke arsip dengan file gerber

Sensor bekerja sesuai dengan protokol Mysensors. Menambahkan perangkat apa pun ke jaringan Mysensors mudah. Mari kita lihat contoh sensor ini, saya akan menghilangkan penjelasan kode sensor BME280, tidak ada yang berubah ketika bekerja dengan jaringan Mysensors.

#define MY_DEBUG //   #define MY_RADIO_NRF5_ESB //   (  rfm69, rfm95, nrf24l01, nrf51-52) #define MY_RF24_PA_LEVEL (NRF5_PA_MAX) //    #define MY_DISABLED_SERIAL //   #define MY_PASSIVE_NODE //   (   mysensors), PASSIVE        ,   , ,  #define MY_NODE_ID 1 //     #define MY_PARENT_NODE_ID 0 //       //#define MY_PARENT_NODE_IS_STATIC //  PARENT_NODE        //#define MY_TRANSPORT_UPLINK_CHECK_DISABLED //      #include <MySensors.h> // -  MySensors #define TEMP_CHILD_ID 0 //     #define HUM_CHILD_ID 1 //     #define BARO_CHILD_ID 2 //      #define CHILD_ID_VOLT 254 //      MyMessage voltMsg(CHILD_ID_VOLT, V_VOLTAGE); //       MyMessage temperatureMsg(TEMP_CHILD_ID, V_TEMP); //      MyMessage humidityMsg(HUM_CHILD_ID, V_HUM); //      MyMessage pressureMsg(BARO_CHILD_ID, V_PRESSURE); //      
Penyajian sensor dan sensor di pengontrol rumah pintar:

  sendSketchInfo("BME280 Sensor", "1.0"); //  ,   present(CHILD_ID_VOLT, S_MULTIMETER, "Battery"); //    ,  ,  present(TEMP_CHILD_ID, S_TEMP, "TEMPERATURE [C or F]"); //   ,  ,  present(HUM_CHILD_ID, S_HUM, "HUMIDITY [%]"); //   ,  ,  present(BARO_CHILD_ID, S_BARO, "PRESSURE [hPa or mmHg]"); //    ,  ,  

Transfer data ke pengontrol rumah pintar:
 send(voltMsg.set(batteryVoltage)); //       mW sendBatteryLevel(currentBatteryPercent); //       % send(temperatureMsg.set(temperature, 1)); //    ,  1    send(humidityMsg.set(humidity, 0)); //    ,  0    send(pressureMsg.set(pressure, 0)); //    ,  0    


Kode program Arduino
 #include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> //#define MY_DEBUG #define MY_RADIO_NRF5_ESB #define MY_RF24_PA_LEVEL (NRF5_PA_MAX) #define MY_DISABLED_SERIAL #define MY_PASSIVE_NODE #define MY_NODE_ID 1 #define MY_PARENT_NODE_ID 0 //#define MY_PARENT_NODE_IS_STATIC //#define MY_TRANSPORT_UPLINK_CHECK_DISABLED #include <MySensors.h> bool sleep_flag; bool metric = true; bool last_sent_value; uint16_t currentBatteryPercent; uint16_t lastBatteryPercent = 1000; uint16_t battery_vcc_min = 2150; uint16_t battery_vcc_max = 2950; uint16_t batteryVoltage; uint16_t battery_alert_level = 25; uint32_t default_sleep_time = 60000; uint32_t SLEEP_TIME; uint32_t newmillisforbatt; uint32_t battsendinterval = 3600000; float tempThreshold = 0.5; float humThreshold = 5; float presThreshold = 1; float pres_mmThreshold = 1; float temperature; float pressure; float pressure_mm; float humidity; float lastTemperature = -1; float lastHumidity = -1; float lastPressure = -1; float lastPressure_mm = -1; #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; #define TEMP_CHILD_ID 0 #define HUM_CHILD_ID 1 #define BARO_CHILD_ID 2 #define CHILD_ID_VOLT 254 MyMessage voltMsg(CHILD_ID_VOLT, V_VOLTAGE); MyMessage temperatureMsg(TEMP_CHILD_ID, V_TEMP); MyMessage humidityMsg(HUM_CHILD_ID, V_HUM); MyMessage pressureMsg(BARO_CHILD_ID, V_PRESSURE); void preHwInit() { pinMode(21, INPUT); pinMode(25, OUTPUT); digitalWrite(25, HIGH); pinMode(26, OUTPUT); digitalWrite(26, HIGH); pinMode(27, OUTPUT); digitalWrite(27, HIGH); } void before() { NRF_POWER->DCDCEN = 1; NRF_NFCT->TASKS_DISABLE = 1; NRF_NVMC->CONFIG = 1; NRF_UICR->NFCPINS = 0; NRF_NVMC->CONFIG = 0; if (NRF_SAADC->ENABLE) { NRF_SAADC->TASKS_STOP = 1; while (NRF_SAADC->EVENTS_STOPPED) {} NRF_SAADC->ENABLE = 0; while (NRF_SAADC->ENABLE) {} } pinMode(BLUE_LED, OUTPUT); pinMode(RED_LED, OUTPUT); digitalWrite(BLUE_LED, HIGH); digitalWrite(RED_LED, HIGH); digitalWrite(27, LOW); } void setup() { digitalWrite(27, HIGH); bme_initAsleep(); wait(100); sendBatteryStatus(); wait(100); } void presentation() { sendSketchInfo("EFEKTA BME280 Sensor", "1.2"); present(CHILD_ID_VOLT, S_MULTIMETER, "Battery"); present(TEMP_CHILD_ID, S_TEMP, "TEMPERATURE [C or F]"); present(HUM_CHILD_ID, S_HUM, "HUMIDITY [%]"); present(BARO_CHILD_ID, S_BARO, "PRESSURE [hPa or mmHg]"); } void loop() { wait(10); bme.takeForcedMeasurement(); wait(100); sendData(); if (millis() - newmillisforbatt >= battsendinterval) { sleep_flag = 1; sendBatteryStatus(); } if (sleep_flag == 0) { sleep(SLEEP_TIME); sleep_flag = 1; } } void blinky(uint8_t pulses, uint8_t repit, uint8_t ledColor) { for (int x = 0; x < repit; x++) { if (x > 0) { sleep(500); } for (int i = 0; i < pulses; i++) { if (i > 0) { sleep(100); } digitalWrite(ledColor, LOW); wait(20); digitalWrite(ledColor, HIGH); } } } void sendBatteryStatus() { wait(20); batteryVoltage = hwCPUVoltage(); wait(2); if (batteryVoltage > battery_vcc_max) { currentBatteryPercent = 100; } else if (batteryVoltage < battery_vcc_min) { currentBatteryPercent = 0; } else { if (lastBatteryPercent == 1000) { currentBatteryPercent = (100 * (batteryVoltage - battery_vcc_min)) / (battery_vcc_max - battery_vcc_min) + 5; } else { currentBatteryPercent = (100 * (batteryVoltage - battery_vcc_min)) / (battery_vcc_max - battery_vcc_min) - 5; } } sendBatteryLevel(currentBatteryPercent); wait(100); if (lastBatteryPercent < battery_alert_level) { blinky(3, 1, RED_LED); } else { blinky((last_sent_value == true ? 2 : 1), 1, BLUE_LED); } sleep_flag = 0; newmillisforbatt = millis(); } void sendData() { temperature = bme.readTemperature(); wait(20); humidity = bme.readHumidity(); wait(20); pressure = bme.readPressure() / 100.0F; if (!metric) { temperature = temperature * 9.0 / 5.0 + 32.0; } else { pressure = pressure * 0.75006375541921; } CORE_DEBUG(PSTR("MY_TEMPERATURE: %d\n"), (int)temperature); CORE_DEBUG(PSTR("MY_HUMIDITY: %d\n"), (int)humidity); CORE_DEBUG(PSTR("MY_PRESSURE: %d\n"), (int)pressure); if (abs(temperature - lastTemperature) >= tempThreshold) { send(temperatureMsg.set(temperature, 1)); lastTemperature = temperature; sleep(1000); } if (abs(humidity - lastHumidity) >= humThreshold) { send(humidityMsg.set(humidity, 0)); lastHumidity = humidity; sleep(1000); } if (abs(pressure - lastPressure) >= presThreshold) { send(pressureMsg.set(pressure, 0)); lastPressure = pressure; sleep(1000); } sleep_flag = 0; } void bme_initAsleep() { if (! bme.begin(&Wire)) { while (1); } bme.setSampling(Adafruit_BME280::MODE_FORCED, Adafruit_BME280::SAMPLING_X1, // temperature Adafruit_BME280::SAMPLING_X1, // pressure Adafruit_BME280::SAMPLING_X1, // humidity Adafruit_BME280::FILTER_OFF ); wait(1000); } 


Housing untuk sensor dikembangkan di editor 3D:



Itu dicetak pada printer 3D ANYCUBIC FOTON, resin putih dari produsen yang sama digunakan, ketebalan lapisan dipilih sedang - 50 mikron. Waktu pencetakan untuk kasing dan sampul adalah 3 jam.








Jaringan MySensors di mana sensor bekerja berkomunikasi dengan sistem rumah pintar Magordomo. Sensor terdaftar dalam modul Maysensors Majordomo terlihat seperti ini:




Uji video



Bagi mereka yang ingin melakukan hal yang sama untuk diri mereka sendiri, artikel ini menyediakan tautan ke semua yang Anda butuhkan.

Tempat di mana Anda selalu senang membantu semua orang yang ingin berkenalan dengan MYSENSORS (memasang papan, bekerja dengan mikrokontroler nRF5 di lingkungan IDE Arduino, kiat bekerja dengan protokol mysensors - @mysensors_rus

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


All Articles