После общения со всевозможными Arduino решил поработать с голой Atmega328P. По даташиту у нее напряжение питания 1,8 - 5,5 В. Т.е. контроллер будет стабильно работать при любом напряжении из этого диапозона?
При низких напряжениях будет работать только на маленьких частотах, в даташите таблица есть на эту тему.
Ну вот, все получилось. Сделал Light - сенсор с питанием от CR2450, дополнительно установил DS18B20, запитав его от ноги контроллера. В режиме сна потребление 14 мкА, в режиме снятия показаний с датчиков 3 - 4 мА, период раз в 3 мин., в режиме передачи - 16-18 мА, период раз в 10 мин. Код (Text): #include <LowPower.h> #include <SPI.h> #include <RF24Network.h> #include <RF24.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <BH1750.h> #include "ClassAVG.h" #define pinPowerSensor 4 //Питание сенсоров подключаем к Pin 4 #define ONE_WIRE_BUS 3 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); BH1750 Light; RF24 radio(/*ce*/ 9, /*cs*/ 10); RF24Network network(radio); // Адрес узла uint16_t this_node = 02; // Адрес основного сенсора, куда сливаем показания uint16_t main_node = 0; // Номер канала const int Chanel = 11; int ReadCount; int iSend = 3; // Интервал отправки показаний int WaitCount = 24; // Количество циклов сна по 8 сек. bool allowSend = false; //признак разрешения на отправку AVG vAVG(3); AVG tAVG(3); AVG lAVG(3); struct StreetMeteoSensor { char ID[5]; //ИД устойства unsigned long UpTime; int T; //Температура long L; //Освещенность (Lx) int V; //уровень заряда батарейки (mV) }; struct StreetMeteoSensor sensor; RF24NetworkHeader header(main_node, 'I'); //////////////////////////////////////////// #define DEBUG_MODE 0 //////////////////////////////////////////// void setup(void) { if (DEBUG_MODE) { Serial.begin(115200); Serial.println("-- START --"); WaitCount = 5; } for (int i = 1; i < 15; i++) { pinMode(i, OUTPUT); digitalWrite(i,LOW); } digitalWrite(pinPowerSensor,HIGH); char ID[5] = "LTS1"; memcpy(sensor.ID, ID, 5); ReadCount = iSend; SPI.begin(); delay(500); radio.begin(); network.begin( Chanel, this_node ); sensors.begin(); Light.begin(BH1750_ONE_TIME_HIGH_RES_MODE); delay(500); radio.powerDown(); digitalWrite(pinPowerSensor,LOW); Light.configure(BH1750_POWER_DOWN); if (DEBUG_MODE) Serial.println("-- End SETUP --"); } void loop(void) { if (DEBUG_MODE) Serial.println("data read..."); ///////////////////////////////////////////////////////////// Light.configure(BH1750_POWER_ON); // Включаем сенсор Light.configure(BH1750_ONE_TIME_HIGH_RES_MODE); // Устанавливаем режим измерений digitalWrite(pinPowerSensor,HIGH); // Подаем питание на DS18B20 sensors.setResolution(TEMP_9_BIT); ///////////////////////////////////////////////////////////// delay(250); // при меньшей задержке - глючит ///////////////////////////////////////////////////////////// sensors.requestTemperatures(); int T = sensors.getTempCByIndex(0); digitalWrite(pinPowerSensor,LOW); // Отключаем питанеи DS18B20 long L = Light.readLightLevel(); //Режим ONE_TIME автоматически отключает питание int V = readVcc(); ///////////////////////////////////////////////////////////// int tt = tAVG.Get(); int vv = vAVG.Get(); if (0 != L || 0 != lAVG.Get() || T < tt || T > tt || V < vv-90/*90mV*/) { tAVG.Set(T); lAVG.Set(L); vAVG.Set(V); allowSend = true; //Есть что отправить - Взведем флаг } ReadCount++; ///////////////////////////////////////////////////////////// if ( ReadCount >= iSend && allowSend ) { // Отправка данных на базовый узел ReadCount = 0; allowSend = false; radio.powerUp(); delay(50); sensor.T = tAVG.Get(); sensor.L = lAVG.Get(); sensor.V = vAVG.Get(); sensor.UpTime = millis()/1000; network.write(header,&sensor,sizeof(sensor)); radio.powerDown(); } sleep(); } // Переводим в режим низкого энергопотребления void sleep() { if (DEBUG_MODE) {Serial.println("----- SLEEP -----");Serial.flush();} for (int i = 0; i < WaitCount; i++) { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Измерение напряжения питания int readVcc() { int result; ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(75); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA,ADSC)); // measuring result = ADCL; result |= ADCH<<8; result = 1125300L / result; // (Kvcc * 1023.0 * 1000) (in mV); return result; }
А сколько он потреблял в режиме сна на ардуине. А то у меня ардуино про мини с отпаянными светодиодами и не как не могу добиться потребления во сне меньше 3.41ма. Регулятор тоже отключен. И вроде на про мини больше и кушать нечему.
Тогда не понимаю почему он у меня так жрет. в активном режиме до 11ма. (но мне это все равно не важный параметр ) это при одном DHT22 и DS18B20 и передатчик L01+ а когда засыпает 3.41ма в режиме сна снимается питание с этих устройств (Питание от пина. ) Влияет ли напряжение питания 3.3в или 5в. на ток. Или там разницы нет. У меня все запитано от 3.3в.Заранее извиняюсь если вопрос глупый?
При 5в я не пробовал. Попробуйте отключить все, оставьте только При Мини, замерьте ток в режиме пустого цикла, затем дайте команду LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF), естественно в цикле или с параметром SLEEP_FOREVER и сново замерьте потребляемый ток. Дальше по ситуации.