рд╕рднреА рд╣рдмреНрдмрд░ рдкрд╛рдардХреЛрдВ рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдЖрдЬ рдХрд╛ рд▓реЗрдЦ рдПрдХ рд▓рдВрдмреА рдмреИрдЯрд░реА рдЬреАрд╡рди рдХреЗ рд╕рд╛рде рддрд╛рдкрдорд╛рди, рдЖрд░реНрджреНрд░рддрд╛ рдФрд░ рд╡рд╛рдпреБрдордВрдбрд▓реАрдп рджрдмрд╛рд╡ рд╕рдВрд╡реЗрджрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред рд╕реЗрдВрд╕рд░ nRF52832 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ (рдбреЗрдЯрд╢реАрдЯ) рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддрд╛рдкрдорд╛рди, рдЖрд░реНрджреНрд░рддрд╛ рдФрд░ рд╡рд╛рдпреБрдордВрдбрд▓реАрдп рджрдмрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, BME280 рд╕реЗрдВрд╕рд░ - рдбреЗрдЯрд╢реАрдЯ
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рд╕реЗрдВрд╕рд░ CR2430 / CR2450 / CR2477 рдмреИрдЯрд░реА рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реИред рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдореЛрдб рдореЗрдВ рдЙрдкрднреЛрдЧ 8mA, рд╕реНрд▓реАрдк рдореЛрдб 5mA рдореЗрдВ рд╣реИред рддреЛ, рдЖрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рдпрд╣ рдПрдХ Arduino рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо Arduino IDE рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред Adafruit Industries рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ
BME280 рд╕реЗрдВрд╕рд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ -
github рд╕реЗрдВрд╕рд░ |
рдЧрд┐рдердм рдмреАрдПрдордИ реи .реж ред NRF52832 рдмреЛрд░реНрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Ardeino IDE рдиреЗ рд╕рдВрджреАрдк рдорд┐рд╕реНрддреНрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ -
github рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ ред рд╕реНрдорд╛рд░реНрдЯ рд╣рд╛рдЙрд╕ рдХреЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдореИрд╕реЗрдВрд╕рд░реНрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЬреАрдердм
рдмреЛрд░реНрдбреНрд╕ |
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ | рдкреБрд╕реНрддрдХрд╛рд▓рдп ред
рд╕реЗрдВрд╕рд░ рдмреЛрд░реНрдб рдХреЛ Diptrace рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдмреЛрд░реНрдб рдХреЗ рдЖрдпрд╛рдо 36.8 рдорд┐рдореА рдПрдХреНрд╕ 25 рдорд┐рдореА рд╣реИрдВред

рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдШрдЯрдХреЛрдВ рдХреА рд╕реВрдЪреА- C1 - cap0603 100nF
- C2 - cap0603 100nF
- рдЖрд░ 1 - res0603 332
- рдЖрд░ 2 - res0603 85 рдмреА
- R3 - res0603 113
- R4 - res0603 912
- R5 - res0603 113
- R6 - res0603 512
- R7 - res0603 512
- RGBL1 - led0805 рдЖрд░рдЬреАрдмреА
- SWD - PPHF 2x3 6p 1.27 рдорд┐рдореА
- U1 - YJ-16048 nRF52832
- U2 - BME280
- рдХрдиреЗрдХреНрдЯ - рд╕реНрдкрд░реНрд╢ рд╕реНрд╡рд┐рдЪ KLS7-TS5401
- RESET - рдХреНрд▓реЙрдХ рдмрдЯрди KLS7-TS5401
- рдмреИрдЯрд░реА рд╣реЛрд▓реНрдбрд░ KW-BS-2450-2-SMT
- Dsc0012 рд╕реНрд╡рд┐рдЪ
рд╢реБрд▓реНрдХ
jlcpcb.com рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
рдСрд░реНрдбрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдХрд┐рд╕реА рднреА рд░рдВрдЧ рдореЗрдВ 5 рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП $ 2ред

рдЬреЗрд░рдмрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВрд╕реЗрдВрд╕рд░ рдореИрд╕реЗрдВрдЬрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдореИрд╕реЗрдВрд╕рд░реНрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЖрдЗрдП рдЗрд╕ рд╕реЗрдВрд╕рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ, рдореИрдВ BME280 рд╕реЗрдВрд╕рд░ рдХреЛрдб рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдЬрдм рдореИрд╕реЗрдВрд╕рд░реНрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
#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); //
рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдо рдХреЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рд╕реЗрдВрд╕рд░ рдФрд░ рд╕реЗрдВрд╕рд░ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐:
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]"); // , ,
рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдо рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░:
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
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); }
рд╕реЗрдВрд╕рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╛рд╕ 3 рдбреА рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

рдпрд╣ рдПрдХ AnyCUBIC рдлреЛрдЯреЙрди 3 рдбреА рдкреНрд░рд┐рдВрдЯрд░ рдкрд░ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдПрдХ рд╣реА рдирд┐рд░реНрдорд╛рддрд╛ рдХреА рд╕рдлреЗрдж рд░рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкрд░рдд рдХреА рдореЛрдЯрд╛рдИ рдХреЛ рдордзреНрдпрдо - 50 рдорд╛рдЗрдХреНрд░реЛрди рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдорд╛рдорд▓реЗ рдФрд░ рдХрд╡рд░ рдХреЗ рд▓рд┐рдП рдореБрджреНрд░рдг рдХрд╛ рд╕рдордп 3 рдШрдВрдЯреЗ рд╣реИред
STL рдХреЗрд╕ рдореЙрдбрд▓ 


MySensors рдиреЗрдЯрд╡рд░реНрдХ рдЬрд┐рд╕рдореЗрдВ рд╕реЗрдВрд╕рд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ Magordomo рдХреЗ рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрдо рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдореЗрд╕реЗрдВрд╕рд░ рдореЗрдЬрд░рдбреЛрдореЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╕реЗрдВрд╕рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рд╡реАрдбрд┐рдпреЛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
рдЬреЛ рд▓реЛрдЧ рдЦреБрдж рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдРрд╕реА рдЬрдЧрд╣ рдЬрд╣рд╛рдВ рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрди рд╕рднреА рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ
MYSENSORS рд╕реЗ рдкрд░рд┐рдЪрд┐рдд
рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдмреЛрд░реНрдб рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛, Arduino IDE рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ nRF5 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, mysensors рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрд╕ -
mmysensors_rus)