Durata batteria per MKR IoT Carrier + MKR wifi 1010

Buongiorno a tutti,

un po' di tempo fa ho comprato l'Opplà kit contenente la scheda Arduino MKR wifi 1010, l'MKR IoT carrier e vari sensori. Sto portando avanti il progetto "Smart Garden" per innaffiare le piante anche quando non sono a casa comandando la 'waterpump' grazie al Cloud di Arduino. In particolare sto scrivendo il codice con l'idea che la pompa rimanga aperta e innaffi per un determinato tempo (specifico per la pianta che ho deciso di bagnare) e poi si chiuda. Dato che il progetto l'avevo pensato principalmente per innaffiare piante esterne, dove non ho la possibilità di utilizzare una presa di corrente, avevo preso una batteria Li-Ion 3.7V 2600 mAh (come suggerito dalla guida: mkr iot carrier datasheet.

Dopo alcune prove mi sono accorto che la batteria dura si e no una giornata, ma avrei bisogno di qualcosa di più duraturo: almeno una settimana. Probabilmente l'Arduino tira abbastanza corrente, anche se la pompa non è azionata, da scaricare la pila velocemente. Mi stavo chiedendo c'è un modo per risolvere il mio problema? Penso proprio di sì, altrimenti mi chiedo quale sia l'utilità della batteria nel carrier .
Allego qui sotto il codice in modo che se ci fossero degli errori qualcuno possa segnalarmeli. Ad esempio una cosa che avevo pensato era di aumentare il 'delay' al fondo della funzione 'loop' da 1000 ms a tot ore, in modo che lui si aggiorni, legga la temperatura/umidità/livello dell'acqua non ogni secondo ma solo ogni tot ore. Credo però che questo non risolva il problema.

Grazie in anticipo a chiunque sappia aiutarmi,
Lorenzo

#include "thingProperties.h"
#include <Arduino_MKRIoTCarrier.h>
MKRIoTCarrier carrier;

int moistPin = A5;
int dry = 1023;
int wet = 0;
int timer = 10000;

String waterPumpState;

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  //enable only if you work with the pc
  //while (!Serial);
 
  // Defined in thingProperties.h
  initProperties();
 
  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  //Get Cloud Info/errors , 0 (only errors) up to 4
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
 
  //Wait to get cloud connection to init the carrier
  while (ArduinoCloud.connected() != 1) {
    ArduinoCloud.update();
    delay(500);
  }
 
  delay(500);
  CARRIER_CASE = true;
  carrier.begin();
  carrier.display.setRotation(0);
  delay(1500);
}

void loop() {
  ArduinoCloud.update();

  uint8_t r, g, b;
  control_RGB.getValue().getRGB(r, g, b);
  
  //read temperature and humidity
  temperature = carrier.Env.readTemperature();
  humidity = carrier.Env.readHumidity();
  
  //Update touch buttons
  carrier.Buttons.update();
  	
  //function to print out values
  if (carrier.Button0.onTouchDown()) {
    printInfo();
  }
  
  //read raw moisture value
  int raw_moisture = analogRead(moistPin);

  //map raw moisture to a scale of 0 - 100
  moisture = map(raw_moisture, wet, dry, 100, 0);
  
  delay(1000);
}

void onWaterpumpChange() {
  
  if (waterpump == true) {
    carrier.Relay2.open();
    waterPumpState = "PUMP: ON";
    updateScreen();
    //set timer [ms] to turn OFF the pump
    delay(timer);
    waterpump = false;
    carrier.Relay2.close();
    waterPumpState = "PUMP: OFF";
    updateScreen();
  }
}

//Update displayed Info
void printInfo(){
  carrier.display.fillScreen(ST77XX_BLACK);
  carrier.display.setTextColor(ST77XX_WHITE);
  carrier.display.setTextSize(2);
 
  carrier.display.setCursor(40, 60);
  carrier.display.print("Water: ");
  carrier.display.print(moisture);
  carrier.display.println("%");
  
  carrier.display.setCursor(40, 80);
  carrier.display.print("T: ");
  carrier.display.print(temperature);
  carrier.display.println("C");
  
  carrier.display.setCursor(40, 100);
  carrier.display.print("Hum: ");
  carrier.display.print(humidity);
  carrier.display.println("%");
}

void updateScreen(){
  carrier.display.fillScreen(ST77XX_RED);
  carrier.display.setTextColor(ST77XX_WHITE);
  carrier.display.setTextSize(2);
 
  carrier.display.setCursor(50, 60);
  carrier.display.print(waterPumpState);
}

Credo che per la MKR 1010 sia valido qunto è valido per la MKR 1000 (lato circuito batteria) ... :roll_eyes:

La carica avviene a corrente costante 350mA, quindi, minimo ci vuole una batteria da 700mA/h per evitare surriscaldamenti ed altri spiacevoli effetti, però ... il circuito di carica è fatto in modo da interrompere la carica dipo 4 ore e quindi ... non carichi più di un totale 1400 mA/h in una batteria, indipendentemente da quanto la metti grossa.

Li-Po battery minimum capacity is 700 mAh. Smaller cells will be damaged by this current and may overheat. It is strongly recommended that you select a Li-Po battery of at least 700mAh capacity. A bigger cell will take more time to charge, but won’t be harmed or overheated. The charging circuit is programmed with 4 hours of charging time with a max of 1400 mAh per charging round.

La batteria è pensata solo per il backup in caso di mancanza di rete, NON per un'alimentazione continua ... quindi, se misuri con un amperometro gli assorbimenti, ti rendi conto che più di tanto non vai avanti.

La soluzione è usare un qualche cosa con batterie molto più capienti (... dopo aver misurato quanto assorbe mediamente l tuo circuito), ricaricate però con un caricatore esterno ed usare il tutto per alimentare direttamente la MKR.

Guglielmo

Ti ringrazio molto per la risposta. Quindi troverò un modo per alimentarlo da presa elettrica! In quel caso, che tu sappia, il suo consumo elettrico è eccessivo?

Come ti ho già scritto ... metti un amperometro in serie all'alimentazione e verifica, con tutto quello che ti serve collegato, quant'è l'assorbimento totale; ti servirà sia per dimensionare la batteria che per calcolare i consumi.

Guglielmo