Следующие советы помогут снизить энергопотребление вашего сенсорного узла на Arduino, что позволит ему работать на батареях в течение длительного периода времени.
Примечание: при программировании с использованием адаптера FTDI на модифицированном 3v3 Pro Mini с удаленным регулятором. Обязательно убедитесь, что ваш стабильный источник питания 3v3 подключён на контакт VCC.
- Используйте версию 3.3V Arduino Pro Mini с более низкой тактовой частотой процессора (8 МГц)
- Спать, когда это возможно, выключив Arduino и радио. Узел датчика может периодически просыпаться от прерывания по таймеру, либо с помощью присоединенного датчика, регистрирующего события на одном из выводов с поддержкой прерывания Arduino. Большинство примеров MySensors реализуют спящий режим. В этом режиме, при отключении питания процессора, датчик температуры DS18B20 и радиопередатчик потребляют (примерно) 120 мкА — что аналогично саморазряду батареи.
Отсоедините светодиодный индикатор питания Arduino, перерезав дорожку между светодиодом и резистором или просто удалите один из них. Это сохранит около 1,5 мА
- От паяйте или отсоедините регулятор 3.3в, поскольку он не нужен. Отрежьте вывод Vout острым мелким скальпелем. Смотрите изображения справа, где находится регулятор. Сэкономит около 220 мкА.
- Подключите устройство к двум последовательно подключенным батареям типа АА. Вы можете использовать датчики с напряжением 5в, используя повышающий преобразователь напряжения малой мощности (см. Руководство по покупке ниже). Регуляторы напряжения уменьшают срок службы батареи из-за постоянного потребления энергии.
Короткое видео, показывающее, как удалить LED и регулятор:
Теоретический срок службы батареи
Срок службы батареи (для гипотетического датчика температуры) может быть рассчитан путем определения среднего тока для схемы с использованием следующей формулы:
Iavg = (t0I0 + t1I1 … + tx*Ix) / (t0 + t1 … + tx)
Обратите внимание, что эти цифры приведены в показательных целях — Они будут отличаться он ваших. Ток измеряется на батарее с напряжением 3,0 В.
Холостой ход: I0 = 28 мА, t0 = 0,65 с (с использованием задержек, заданных в эскизе) Передача: I1 = 31 мА, t1 = скажем 50 мсек (время только примерное) Сон: I2 = 120 uA (Очень грубо), t2 = 15 минут (частота выборки температуры)
Используя приведенные выше цифры, эффективный ток = 0,142 мА. Ток спящего режима трудно измерить точно, поэтому этот показатель может меняться и повлияет на расчет срока службы.
Предположим, что батарея хорошая около 2000 мАч, что дает срок службы 14 101 час, что равно 19,6 месяцам. Время жизни определяется преобладанием тока сна и частоты дискретизации. Если цифры и расчеты верны (сообщите нам, если это не так), скорее всего, батарея сядет от старости, а не от фактического использования.
Ускорьте свои батареи
Arduino 3.3V 8mhz может работать приблизительно до 2.8V, а Nrf24l01+ вплоть до 1.9V
Чтобы иметь возможность высасывать как можно больше сока из батарей, вы можете использовать DC-DC повышающий преобразователь напряжения. Этот усилитель будет преобразовывать все от 0.8V в 3.3V. Обратите внимание, что усилитель может быть немного шумным (и мешать радио).
Для исправления этого можно подключить керамический конденсатор 0,1 мкФ к GND и VOut. Чтобы избежать шума на радио (NRF24l01 +), вы можете подключить его непосредственно к батареям, так как он может работать до 1,9 В и подавать питание на Arduino через усилитель.
Измерение Уровня заряда аккумулятора
Используйте последовательно резистор 1MΩ (R1) и 470KΩ (R2), подключенный к плюсу аккумулятора и минусу, а затем среднюю точку к входу A0 на CPU.
Средняя точка может быть сглажена с помощью конденсатора емкостью 0,1 мкФ, чтобы поддержать низкий уровень шума.
АЦП настроен на использование внутреннего эталонного значения 1,1 В, поэтому Vмакс при ADC max = 1,1 * (16 + 4703) / 4703 = 3,44 В
Значение мощности батареи должно быть преобразовано в процентное значение, совместимый с вашим контроллером.
См. Следующий пример о том, как измерить уровень заряда аккумулятора на A0 и сообщить об этом контроллеру.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
/* * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2019 Sensnology AB * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * * This is an example that demonstrates how to report the battery level for a sensor * Instructions for measuring battery capacity on A0 are available here: * http://www.mysensors.org/build/battery * */ // Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_RF24 //#define MY_RADIO_NRF5_ESB //#define MY_RADIO_RFM69 //#define MY_RADIO_RFM95 #include <MySensors.h> int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point uint32_t SLEEP_TIME = 900000; // sleep time between reads (seconds * 1000 milliseconds) int oldBatteryPcnt = 0; void setup() { // use the 1.1 V internal reference #if defined(__AVR_ATmega2560__) analogReference(INTERNAL1V1); #else analogReference(INTERNAL); #endif } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Battery Meter", "1.0"); } void loop() { // get the battery Voltage int sensorValue = analogRead(BATTERY_SENSE_PIN); #ifdef MY_DEBUG Serial.println(sensorValue); #endif // 1M, 470K divider across battery and using internal ADC ref of 1.1V // Sense point is bypassed with 0.1 uF cap to reduce noise at that point // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts // 3.44/1023 = Volts per bit = 0.003363075 int batteryPcnt = sensorValue / 10; #ifdef MY_DEBUG float batteryV = sensorValue * 0.003363075; Serial.print("Battery Voltage: "); Serial.print(batteryV); Serial.println(" V"); Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); #endif if (oldBatteryPcnt != batteryPcnt) { // Power up radio after sleep sendBatteryLevel(batteryPcnt); oldBatteryPcnt = batteryPcnt; } sleep(SLEEP_TIME); } |