Bewässerungs controller

Hallo!

ich hab einen Uno, ein relais board, eine real time clock und 4 potentiometer.

mit der real time clock möchte ich den tag in 3 phasen unterteilen.

Phase 1 läuft von XX:XX bis YY:YY
P2 läuft von YY:YY bis ZZ:ZZ
P3 läuft von ZZ:ZZ bis XX:XX

ich möchte über das relais ein ventil schalten, um pflanzen zu bewässern.

In der P1 möchte ich, dass die Poti auf A0 und A1 jeweils die dauer des- als auch das intervall zwischen den bewässerungs events gesteuert werden (A0 von 0-60s, A1 von 0-60min)

In der P2 genau das gleiche mit anderen Werten.
In P3 wird (vorerst) nichts gemacht.

Ist min erstes arduino projekt. Ich hab mit von ChatGPT einen sketch schreiben lassen. funktioniert soweit ich das testen konnte solide was den wechsel der Phasen angeht. wenn ich die A0 und A2 werte unter 31s habe, geht alles super, auch bei sehr langen intervallen (P1 45min P2 ~2h). sobald ich die potis der genannten pins über 31s stelle, wird das relais geschalten aber nicht mehr LOW gemacht.

verlötet ist alles richtig, wenn ich die Analog values anders mappe (z.b. von 0-45 oder von 0-240) ist trotzdem 31s die grenze und das sind dann komplett unterschiedliche poti values...

Jarvis dreht sich seit 3 tagen im kreis und ich bin nicht kompetent genug ihn in die richtige richtung zu lenken....

anbei der Code mit der bitte um hilfestellung

danke. Liebe Grüße

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

const int pin1 = 2;
const int pin2 = 3;
const int pin3 = 4;
const int pin4 = 5;
const int pin5 = 6;
const int pin6 = 7;

const int potPinA0 = A0;
const int potPinA1 = A1;
const int potPinA2 = A2;
const int potPinA3 = A3;

bool phase3Active = false;

// Define start and end times for Phase P1 and P2
int p1StartHour = 19;
int p1StartMinute = 38;
int p1EndHour = 20;
int p1EndMinute = 0;

int p2StartHour = 20;
int p2StartMinute = 0;
int p2EndHour = 22;
int p2EndMinute = 10;

// Adjustable delay times for potentiometers
int p1IrrigationEventDelaySeconds;
int p1IntervalDelayMinutes;

int p2IntervalDelayMinutes;
int p2IrrigationEventDelaySeconds;

void setup() {
  Serial.begin(9600);
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);
  pinMode(pin3, OUTPUT);
  pinMode(pin4, OUTPUT);
  pinMode(pin5, OUTPUT);
  pinMode(pin6, OUTPUT);

  Wire.begin();
  rtc.begin();

  if (!rtc.begin()) {
    Serial.println("Konnte keine RTC finden. Überprüfe die Verbindung!");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC hat die Echtzeit verloren! Setze die Zeit erneut...");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  // Initialize adjustable delay times
  p1IrrigationEventDelaySeconds = 60;  // Default value, adjust as needed
  p1IntervalDelayMinutes = 60;         // Default value, adjust as needed

  p2IntervalDelayMinutes = 720;         // Default value, adjust as needed
  p2IrrigationEventDelaySeconds = 240;  // Default value, adjust as needed
}

void loop() {
  DateTime now = rtc.now();

  int currentHour = now.hour();
  int currentMinute = now.minute();

  Serial.print("Aktuelle Zeit: ");
  Serial.print(currentHour);
  Serial.print(":");
  Serial.println(currentMinute);

  // Phase P1
  if (isInPhase(currentHour, currentMinute, p1StartHour, p1StartMinute, p1EndHour, p1EndMinute)) {
    Serial.println("Phase P1 läuft...");
    digitalWrite(pin5, HIGH);
    runPhaseP1();
    phase3Active = false;
  }
  // Phase P2
  else if (isInPhase(currentHour, currentMinute, p2StartHour, p2StartMinute, p2EndHour, p2EndMinute)) {
    Serial.println("Phase P2 läuft...");
    digitalWrite(pin6, HIGH);
    runPhaseP2();
    phase3Active = false;
  }
  // Phase P3
  else {
    if (!phase3Active) {
      Serial.println("Phase P3 aktiv...");
      digitalWrite(pin4, HIGH);
      digitalWrite(pin5, LOW);
      digitalWrite(pin6, LOW);
      runPhaseP3();
      phase3Active = true;
    }
  }
}

void runPhaseP1() {
  Serial.println("Phase P1 aktiv...");

  int potValueA0 = analogRead(potPinA0);
  int potValueA1 = analogRead(potPinA1);

  Serial.print("Potentiometer A0 value: ");
  Serial.println(potValueA0);
  Serial.print("Potentiometer A1 value: ");
  Serial.println(potValueA1);

  int delayHighA0 = map(potValueA0, 0, 1023, 0, p1IrrigationEventDelaySeconds); // Mapping to seconds
  int delayLowA1 = map(potValueA1, 0, 1023, 0, p1IntervalDelayMinutes);        // Mapping to minutes

  digitalWrite(pin4, LOW);
  digitalWrite(pin6, LOW);
  digitalWrite(pin1, HIGH);
  Serial.println("Pin 1 eingeschaltet um " + getCurrentTime());

  Serial.print("P1 Irrigation Event (seconds): ");
  Serial.println(delayHighA0);
  Serial.print("P1 Interval (minutes): ");
  Serial.println(delayLowA1);

  delay(delayHighA0 * 1000);

  digitalWrite(pin1, LOW);
  Serial.println("Pin 1 ausgeschaltet um " + getCurrentTime());

  if (potValueA1 > 0) {
    delay(delayLowA1 * 60000);
  }
}

void runPhaseP2() {
  Serial.println("Phase P2 aktiv...");

  int potValueA2 = analogRead(potPinA2);
  int potValueA3 = analogRead(potPinA3);

  Serial.print("Potentiometer A2 value: ");
  Serial.println(potValueA2);
  Serial.print("Potentiometer A3 value: ");
  Serial.println(potValueA3);

  digitalWrite(pin4, LOW);
  digitalWrite(pin5, LOW);

  if (potValueA3 > 0) {
    int lower50PercentThreshold = 512; // 50% of 1023

    int lower50PercentMappedValue = map(potValueA3, 0, lower50PercentThreshold, 0, p2IntervalDelayMinutes / 5);
    int upper50PercentMappedValue = map(potValueA3, lower50PercentThreshold, 1023, p2IntervalDelayMinutes / 5, p2IntervalDelayMinutes);

    int finalDelayA3 = (potValueA3 <= lower50PercentThreshold) ? lower50PercentMappedValue : upper50PercentMappedValue;

    Serial.print("P2 Interval (minutes): ");
    Serial.println(finalDelayA3);

    delay(finalDelayA3 * 60000);
  }

  digitalWrite(pin1, HIGH);
  Serial.println("Pin 1 eingeschaltet um " + getCurrentTime());

  if (potValueA2 > 0) {
    int delayHighA2 = map(potValueA2, 0, 1023, 0, p2IrrigationEventDelaySeconds); // Mapping to seconds

    Serial.print("P2 Irrigation Event (seconds): ");
    Serial.println(delayHighA2);

    delay(delayHighA2 * 60000);
  }

  digitalWrite(pin1, LOW);
  Serial.println("Pin 1 ausgeschaltet um " + getCurrentTime());
}

void runPhaseP3() {
  digitalWrite(pin4, HIGH);
  digitalWrite(pin5, LOW);
  digitalWrite(pin6, LOW);
}

String getCurrentTime() {
  DateTime now = rtc.now();
  return String(now.hour()) + ":" + String(now.minute());
}

bool isInPhase(int currentHour, int currentMinute, int startHour, int startMinute, int endHour, int endMinute) {
  return (currentHour > startHour || (currentHour == startHour && currentMinute >= startMinute)) &&
         (currentHour < endHour || (currentHour == endHour && currentMinute <= endMinute));
}

Hallo,

wer oder was ist Jarvis ?

Ach und....dabei kann dir ChatGPT nicht helfen. Wie ärmlich ist das von ChatGPT.
Mein Tipp:
Frage doch ChatGPT so lange bis dein Sketch das macht, was du möchtest.
Dies Forum ist nicht das Repair Cafè von ChatGPT.

1 Like

danke für die produktive antwort!

Wer ChatGPT nutzt, darf mit solchen Antworten rechnen.

1 Like

schau; ich bin mit meinen 'kenntnissen' so weit gekommen wie ich halt gekommen bin - gar nicht.

ich respektier diese bubble aber bin halt überhaupt nicht da drinnen. und werd auch nicht rein kommen. ich hab aber jetzt ein projekt, und da leigt es halt nahe, ein tool zu nutzen das mir zur verfügung steht.

wenn ich das nicht disclosed hätte wärs doch auch kein problem gewesen und man hätte mir wsl weiter geholfen.

is halt auch nicht so leiwand oder?...
was soll ich als bauer der in seim leben 0 zeilen code geschrieben habe da mich jetzt groß hinsetzen? geht sich nicht aus

Da ist für mich ein Widerspruch.
Kein Mensch braucht einen Arduino, der das nicht will.

Hallo doomscroller

Diese Funktionalität beschreibt eine handelsübliche Zeitschaltuhr.

@michael_x was soll da ein widerspruch sein? ich hab ein projekt, das von der stange nur für sehr viel geld zu haben ist, jetzt möchte ichs selbst probieren.

@paulpaulsen leider nein, weil die ZS den tag nicht in verschiedene phasen untereilen kann. du kannst der zs nicht sagen von 8:00 bis 10:00 will ich, dass alle 30 min für 15s bewässert wird, von 10:00 bis 16:30 möchte ich, das alle 2,5h für 45s bewässert wird...

also ich hab keine ZS gefunden, die das so macht

Arduino ist für Leute, die Spaß dran haben, etwas selber zu machen. (Und dabei was neues zu lernen)
Weniger, damit es billiger wird.

Wenn es dadurch billiger wird, dass einem andere die Arbeit machen, ist das nicht Sinn der Sache.

Wenn du es jetzt also "selbst probieren willst", wirst du dich wohl "jetzt groß hinsetzen" müssen.
Viel Spaß dabei, ehrlich.

gib dir doch mal auf der Seriellen Schnittstelle aus, was der Poti auf A2 und A3 tatsächlich für einen ADC Wert rauskommt.

Weiters überprüfe deine Variablen ob die auch groß genug sind.
"geht bis 31" könnte auch an einem Variablentyp int liegen, der nur Werte bis +32767 halten kann.

Danke für die erste interessante, und zweite nicht komplett gschissane antwort!!!!

Ich hab die poti values an serial, sind von 0 bis 1023 und funktionieren auch so.

Ich glaub auch dass es was mit einem value overflow zu tun hat aber wie umgehen?

Unsigned long wäre eine option?

Aber was ich nicht verstehhe it, warum der gleiche code, der mit minuten funktioniert,mit sekunden nicht funktioniert, müssten nicht die sekundrn werte kleiner sein als die minuten?
Bie min wird schließlich mit 60.000 multipliziert?

Wurde Minimum 5 mall im Forum diskutiert, reichte Suche beschäftigen.
Und Ja mit ChatGPT ist das Forum auf Kriegsfuß, es hat noch niemals fertiges ausgebrütet, es ist eben ein Chat was noch viel zu lernen hat.

ist mir nicht entgangen, dass das ein tabuthema ist...

versteh ich nur nicht weil die acessibility halt mehr leute ins topic zieht und von 20 dies versuchen bleiben dann 2 oder 3 hängen und das, hätte ich zumindest vermutet, ist gut für die plattform.

aber wenn man dann Kontakt mit den gatekeepern des arduino von ganz oben hat vergeht es einem ganz schnell wieder...

1 Like

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