Пронуться после отключения питания чтобы проверить датчик а затем снова заснуть

Я использую Arduino Pro Mini с различными датчиками. Я питаю его от 2 3.7 V 3400mA батарей, которые я заряжаю с помощью солнечной панели. Я снимаю показания с батарей и, если они превышают определенное число, отсоединяю солнечную панель от батарей с помощью реле. Затем, когда показания батареи становятся ниже определенного числа, я снова включаю солнечную панель, используя то же самое реле. Все это прекрасно работает. Чтобы сэкономить энергию, я хочу задержать цикл работы Arduino, скажем, на два часа. Прямо сейчас я вызываю lowPower(); в конце цикла{. void lowPower(){ is

LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);

Который я постоянно повторяю в течение двух часов, которые мне нужны. Проблема в том, что в течение этих двух часов может быть достигнут высокий или низкий предел заряда батареи, но я этого не знаю.

То что я хотел бы сделать это повторить

LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);

в течение 15 минут, а затем проверьте батареи и включите или выключите солнечное зарядное устройство по мере необходимости. Затем повторяйте все это до тех пор, пока не достигнете двух часов. В этот момент я бы снова запустил цикл{ чтобы проверить все датчики и т. Д. Я попробовал сделать следующее

   void loop(){
    //код для запуска других датчиков и т. Д.
    if (Delay ==4) {
  delay(180000);
//check the battery to begin with
sensorBatValue = analogRead(batteryInPin);
  delay(500);
if(chargeSwitch ==1){
 if(sensorBatValue < batteryNoCharge) {
  }
 else if(sensorBatValue > batteryNoCharge) {
     digitalWrite(10,HIGH);
   delay(1000);
   digitalWrite(10,LOW);
   chargeSwitch = 2;
  }
   }
else if(chargeSwitch ==2){
    if(sensorBatValue > batteryCharge) {
    }
    else if(sensorBatValue < batteryCharge) {
      digitalWrite(13,HIGH);
    delay(1000);
   digitalWrite(13,LOW);
   chargeSwitch = 1;
    }
  }
//put to sleep
lowPower();
//check battery again
delay(180000);//real
sensorBatValue = analogRead(batteryInPin);
  delay(500);
if(chargeSwitch ==1){
 if(sensorBatValue < batteryNoCharge) {
  }
 else if(sensorBatValue > batteryNoCharge) {
     digitalWrite(10,HIGH);
   delay(1000);
   digitalWrite(10,LOW);
   chargeSwitch = 2;
  }
   }
else if(chargeSwitch ==2){
    if(sensorBatValue > batteryCharge) {
    }
    else if(sensorBatValue < batteryCharge) {
      digitalWrite(13,HIGH);
    delay(1000);
   digitalWrite(13,LOW);
   chargeSwitch = 1;
    }
  }
// put to sleep
lowPower();
//repeat for total of 2 hours.
}

 void lowPower(){
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
    //repeat until 15 minutes is reached
}

Это, кажется, не работает. Arduino ждет правильного времени, но из того, что я могу сказать, батарея никогда не проверяется.

Или я должен попробовать

    void loop(){
    everything
    if (Delay ==4) {
  delay(180000);//real
  sensorBatValue = analogRead(batteryInPin);
  delay(500);
if(chargeSwitch ==1){
 if(sensorBatValue < batteryNoCharge) {
  }
 else if(sensorBatValue > batteryNoCharge) {
     digitalWrite(10,HIGH);
   delay(1000);
   digitalWrite(10,LOW);
   chargeSwitch = 2;
  }
   }
else if(chargeSwitch ==2){
    if(sensorBatValue > batteryCharge) {
    }
    else if(sensorBatValue < batteryCharge) {
      digitalWrite(13,HIGH);
    delay(1000);
   digitalWrite(13,LOW);
   chargeSwitch = 1;
    }
  }
    //include the checking of the battery inside the lowPower
    void lowPower(){
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
    etc.
    LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
    //check battery after 15 min.
    delay(500);
       sensorBatValue = analogRead(batteryInPin);
    delay(500);
    if(chargeSwitch ==1){
     if(sensorBatValue < batteryNoCharge) {
     }
     else if(sensorBatValue > batteryNoCharge) {
         digitalWrite(10,HIGH);
       delay(1000);
       digitalWrite(10,LOW);
       chargeSwitch = 2;
      }
       }
    else if(chargeSwitch ==2){
        if(sensorBatValue > batteryCharge) {
       }
        else if(sensorBatValue < batteryCharge) {
          digitalWrite(13,HIGH);
        delay(1000);
       digitalWrite(13,LOW);
       chargeSwitch = 1;
        }
      }
    //then repeat to two hours
    }

Нужно ли что-то делать, чтобы разбудить Arduino и включить датчик заряда батареи и снова включить АЦП?

Не знаю как это сделать Пожалуйста ПОМОГИТЕ.

, 👍0

Обсуждение

Пожалуйста, не публикуйте псевдо-код (как мы должны знать, что такое "условие"?) И не отступайте правильно. Я не собираюсь разгадывать эту загадку..., @Sim Son


4 ответа


0

Попробуйте использовать внешний таймер. У меня примерно та же проблема.

,

Я не хочу использовать внешний таймер, так как это увеличивает затраты энергии. Должен быть способ сделать это., @user1114881


0

Вот скетч, в котором используется библиотека LowPower. Вам придется "настроить" переменные batteryCounter и sensorCounter, чтобы приблизить время к вашим спецификациям.

#include "LowPower.h"
unsigned int sleepCounter = 0;
unsigned int sleepCounter2 = 0;
unsigned int batteryCounter = 110; // 8 сек Х 110 = 15 мин. прибл.
unsigned int sensorCounter = 900;  // 8 сек Х 900 = 2 часа ок.
unsigned int voltageReading = 0;

void setup(){

  // Тест с использованием вывода 13 и последовательного монитора.
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  Serial.begin(9600);

}

void loop(){

  // Войдите в состояние отключения питания на 8 секунд.
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);  

  // Счетчики приращений. 
  sleepCounter++;
  sleepCounter2++;

  // Проверьте напряжение батареи.
  if(sleepCounter == batteryCounter){

    // Сбросьте счетчик.
    sleepCounter = 0;

    delay(10);
    voltageReading = analogRead(A0);

    // Включите встроенный светодиод на 1 секунду, затем выключите.
    // Отправьте показания напряжения на последовательный монитор.
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    Serial.print("Voltage=");
    Serial.println(voltageReading);
    Serial.flush();
  }

  // Проверьте датчики.
  if(sleepCounter2 == sensorCounter){

    // Сбросьте счетчик.
    sleepCounter2 = 0;

    // Включите встроенный светодиод на 2 секунды, затем выключите.
    // Отправьте сообщение на последовательный монитор.
    digitalWrite(LED_BUILTIN, HIGH);
    delay(2000);
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("Checking Sensors.");
    Serial.flush();
  }

}
,

0

В вашей функции lowPower ()вместо того, чтобы повторять LowPower.PowerDown(), повторите этот вызов достаточно долго, чтобы компенсировать общее время сна, которое вам нужно. Это общий случай. Для вашего конкретного случая, когда вам нужны 15-минутные интервалы и 2-часовые интервалы, функция lowPower() должна выполнить цикл 113 раз (15:04, так как 15 *60 не делится равномерно на 8). В вашей функции loop() выполните цикл с низкой мощностью() 8 раз (в течение 2 часов) и каждый раз, когда он возвращается, проверяйте свою батарею. Когда цикл по lowPower() завершится, пришло время выполнять задания "каждые 2 часа".

Поскольку 8 секунд неравномерно делят 15 минут, это время не является точным (но и сторожевой таймер тоже!), Поэтому вы можете немного подправить ситуацию, например, использовать 4-секундный сон, который делится равномерно.

Кроме того, когда я сделал отступ в вашем коде, я обнаружил, что функция void lowPower() вложена в функцию loop (). Си этого не поддерживает. Если это было непреднамеренно, проверьте сопряжение ваших брекетов.

,

1

Вы должны отметить, что если вы перейдете в режим "выключение питания", вы не сможете получить время, так как функция millis() вернет неправильное время.

Если вам нужно всего 15 минут, вы можете просто поместить его в цикл for:

for(int j=0;j<112;j++) LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);

Таким образом, следующая инструкция будет выполнена примерно через 15 минут (15 * 60 / 8 = 112).

Я сделал аналогичный проект с подростком. С его помощью у вас будет больше функций на данный момент. Просто помните, что при выключенном питании вы не сможете выполнять какие-либо функции времени без внешнего модуля времени на Arduino.

Схема измерения заряда батареи также важна. Если вы вставите 2 резистора, например 1 М и 4 М, вы не сможете измерить его, так как измерение выполняется внутри по нескольким измерениям, а тока недостаточно для измерения более 1 раза каждые 10-20 мс. Вы должны добавить конденсатор, чтобы получить хорошее значение.

,