Strom sparen - funktioniert das so?

Hallo zusammen!

const int dry = 450;
const int pumpPins[] = {10, 11, 12};
const int soilSensors[] = {A4, A6, A7};
const int numPumps = sizeof(pumpPins) / sizeof(pumpPins[0]);

void initializeSensors() {
  for (int i = 0; i < numPumps; i++) {
    pinMode(pumpPins[i], OUTPUT);
    pinMode(soilSensors[i], INPUT);
    digitalWrite(pumpPins[i], HIGH);
    delay(5000);
  }
}

void controlPump(int pumpPin, int moisture) {
  if (moisture >= dry) {
    Serial.println("Wasser Start - Feuchtigkeit: " + String(moisture));
    digitalWrite(pumpPin, LOW);
    delay(5000);
    digitalWrite(pumpPin, HIGH);
    Serial.println("Fertig");
  }
  else {
    digitalWrite(pumpPin, HIGH);
    Serial.println("Alles ok. Wert: " + String(moisture));
  }
}

void setup() {
  initializeSensors();
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < numPumps; i++) {
    int moisture = analogRead(soilSensors[i]);
    Serial.println(moisture);
    controlPump(pumpPins[i], moisture);
  }

  // Eigenes Energiesparverhalten einfügen, z.B. durch Reduzierung der Taktfrequenz
  // Hier können Sie Code für benutzerdefiniertes Stromsparen einfügen

  delay(600000); // 10 Minuten Verzögerung 600000
}

Ich habe letztes Jahr eine einfache Bewässerungsanlage für meine Pflanzen erstellt.
Dieses Jahr wollte ich sie etwas verbessern und so haben ChatGPT und ich zusammen daran herum gearbeitet. Mein Ziel war es, dass ich weniger Strom brauche, da das Ding ja nicht dauernd laufen muss.
Der erste Versuch ging mal in die Hose, weil mein MEGA2560 offensichtlich nicht für die Bibliothek LowBattery gemacht ist. Nun ist das meine neue Lösung. (Wie ihr sicher feststellen könnt, bin ich bis auf dieses und ein zwei kleine Einstiegssachen völlig ahnungslos.
Nun meine Frage: ist das eine gute Lösung oder gibt es noch was Sinnvolleres? Kann ich den Stromverbrauch auch irgendwie messen/ anzeigen lassen?

Vielen Dank für eure Tipps

Der Atmega2560 ist (wie die meisten kompletten Boards) eigentlich nicht zum Strom sparen geeignet, da einige Baugruppen, wie z.B. die USB-Verbindungen ständig Energie benötigen, aber (außer der Nutzung des seriellen Monitors - die Auch Energie braucht) nicht benötugt wird.
Außerdem ist auch der 2560 für den Anwendungsfall stark überdimensioniert.

Gruß Tommy

ach so! Den hatte ich einfach noch von so einem Starter-Kit und hab mir gedacht, dass ich den gleich benutze, wenn ich ihn schon habe. Würdest du mir in dem Fall empfehlen, auf was Kleineres umzusteigen?

Die Komponenten auf dem MEGA verbrauchen am Tag mehr, als der Controller in einem Monat. (geschätzt, rein bildliche Darstellung)

Du wirst - egal was Du mit dem AVR aństellst - keinen signifikanten Spareffekt erzielen.

vielen Dank euch beiden.
Das mit dem Board hatte ich überhaupt nicht auf dem Schirm :see_no_evil:
Gerade nachgeschaut und gesehen, dass Unterschied zum Nano doch recht gross ist.

Vor allem ist zu beachten, dass Du noch Perepherie da dran hast. (Relaisboard etc.) jede LED jeder Spannungswandler etc. zählt bei der Bilanzierung des Gesamtverbrauchs mit. Da fällt der AVR hinten runter :wink:

Auch der NANO hat Komponenten die fleißig Strom verbrauchen.

Wenn Du aufs Stromsparen arbeiten willst dann nimm einen Arduino MINI (bzw dessen Nachbau. Der hat keinene USB-Serial adapter bzw zum Programmieren mußt Du einen anstecken. (Also brauchst Du einen FT232 Modul).
Dann würde ich zu einer UHRModul (RTC) raten, am besten ein DS3231. Dann den Controller in seleep schicken und entweder einmal die Sekunde durch den RTC aufwecken lasssen Die sachen kontrollieren die zu kontrollieren sind ( zB Bodenfeuchtigkeit Temperatur ecc) oder noch Stromsparender mittels eines eingestellten Alarms.

Grüße Uwe

Wenn es richtig energiesparend werden soll, dann müsste man die ganze Peripherie abschalten.
Ob das beim wieder Einschalten der Peripherie problemlos klappt hängt davon ab
was du da alles Am Arduino an Sensoren, Relais usw. angeschlossen hast.
vgs

Moin @geronimoo,

der Wechsel auf ein anderes Controllerboard ist sicher eine gute Lösung!

Mit dem MEGA2560 kannst Du allerdings bis dahin auch schon einiges einsparen, wenn Du die Library "LowPower.h" von LowPowerLab einbindest.

https://github.com/LowPowerLab/LowPower/tree/master

Das könnte dann so aussehen:

#include "LowPower.h"

const int dry = 450;
const int pumpPins[] = {10, 11, 12};
const int soilSensors[] = {A4, A6, A7};
const int numPumps = sizeof(pumpPins) / sizeof(pumpPins[0]);

void initializeSensors() {
  for (int i = 0; i < numPumps; i++) {
    pinMode(pumpPins[i], OUTPUT);
    pinMode(soilSensors[i], INPUT);
    digitalWrite(pumpPins[i], HIGH);
    delay(5000);     
  }
}

void controlPump(int pumpPin, int moisture) {
  if (moisture >= dry) {
    Serial.println("Wasser Start - Feuchtigkeit: " + String(moisture));
    digitalWrite(pumpPin, LOW);
    delay(5000);
    digitalWrite(pumpPin, HIGH);
    Serial.println("Fertig");
  }
  else {
    digitalWrite(pumpPin, HIGH);
    Serial.println("Alles ok. Wert: " + String(moisture));
  }
}

void pwrDown(int seconds){
  while (seconds > 0){
    LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); // 1 Sekunde powerDown Modus
    seconds--;
  }
}

void setup() {
  initializeSensors();
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < numPumps; i++) {
    int moisture = analogRead(soilSensors[i]);
    Serial.println(moisture);
    controlPump(pumpPins[i], moisture);
  }

  // Eigenes Energiesparverhalten einfügen, z.B. durch Reduzierung der Taktfrequenz
  // Hier können Sie Code für benutzerdefiniertes Stromsparen einfügen
  pwrDown(10*60);  // 10 min * 60 s = 600 s
  //delay(600000); // 10 Minuten Verzögerung 600000
}

Die maximale PowerDown-Zeit (ohne externes WakeUp per Interrupt) liegt bei 8 Sekunden (SLEEP_8S). Ich habe mal eine Sekunde genommen, dass lassen sich größere Intervalle leicht ableiten.

Bei einem Test mit einem MEGA2560 von Funduino und einer Beschaltung mit einer LED an Pin 7 (Anzeige der "aktiven" Zeit durch Blinken) und einer LED an Pin 3 (Dauerleuchten) ergaben sich
externer Versorgung über Vin-Pin mit 9VDC immerhin folgende Werte:

  • Aktive Phase: ca. 90 mA
  • Power Down: ca. 20 mA

Gibt es einen besonderen Grund dafür, die Pumpen nacheinander abzufragen und einzuschalten (Strombegrenzung bei den Pumpen?). Wenn nicht, könntest Du die aktive Phase noch von 5 Sekunden/Pumpe auf insgesamt 5 Sekunden reduzieren. Zum Beispiel so:

#include "LowPower.h"

const int dry = 450;
const int pumpPins[] = {10, 11, 12};
const int soilSensors[] = {A4, A6, A7};
const int numPumps = sizeof(pumpPins) / sizeof(pumpPins[0]);

boolean pumpActive[numPumps];
int     moisture[numPumps];

void initializeSensors() {
  for (int i = 0; i < numPumps; i++) {
    pinMode(pumpPins[i], OUTPUT);
    pinMode(soilSensors[i], INPUT);
    digitalWrite(pumpPins[i], HIGH);
    delay(50);
  }
}

void controlPumps() {
  boolean pumpActive = false;
  for (int i = 0; i < numPumps; i++) {
    if (moisture[i] >= dry) {
      Serial.println("Wasser Start - Feuchtigkeit: " + String(moisture[i]));
      digitalWrite(pumpPins[i], LOW);
      pumpActive = true;
    } else {
      digitalWrite(pumpPins[i], HIGH);
      Serial.println("Alles ok. Wert: " + String(moisture[i]));
    }
  }

  if (pumpActive) {
    delay(5000);
  }
  for (int i = 0; i < numPumps; i++) {
    digitalWrite(pumpPins[i], HIGH);
  }
  Serial.println("Fertig");
}


void setup() {
  initializeSensors();
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < numPumps; i++) {
    moisture[i] = analogRead(soilSensors[i]);
  }
  controlPumps();

  // Eigenes Energiesparverhalten einfügen, z.B. durch Reduzierung der Taktfrequenz
  // Hier können Sie Code für benutzerdefiniertes Stromsparen einfügen
   pwrDown(10*60);  // 10 min * 60 s = 600 s Wartezeit
}

void pwrDown(int seconds){
  while (seconds > 0){
    LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); // 1 Sekunde powerDown Modus
    seconds--;
  }
}

Hey vielen lieben Dank euch allen für all die Antworten!
Das sind super viele Infos, die ich zuerst einmal mitnehme und weiter an meinen Sachen tüftle.
@ec2021: Vielen Dank für die Überarbeitung des Codes und das Messen! Dass ich die Sensoren nacheinander schalte hatte den Grund, dass ich dachte, dass ich sie nur seriell und nicht parallel schalten kann. Also kurz: Weil ich es nicht besser wusste... Also könnte ich die auch gleichzeitig auslesen lassen? Würde die aktive Zeit auch wieder verkürzen. Tolle Idee!

Das ist in meinem Code schon drin:

Man kann natürlich die Sensoren nicht "gleichzeitig" auslesen, aber zunächst alle Sensoren schnell nacheinander auslesen (das fühlt sich an wie gleichzeitig) und dann die Pumpen schnell hintereinander schalten, soweit erforderlich. Anstatt dann bei jeder Pumpe 5 Sekunden zu warten und dann abzuschalten, braucht es so nur einmal 5 Sekunden für alle geschalteten Pumpen zusammen.

"Gleichzeitig" ist bei vielen Funktionen von Mikrocontrollern technisch unzutreffend, aber aus Sicht eines langsamen Menschen gefühlt richtig ...

Schau Dir den Code einfach mal Schritt für Schritt an.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.