INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 1 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Bewaesserung_Timer
29.06.2019, 07:47
Beitrag #1
Bewaesserung_Timer
Hallo allerseits,

@Admin
erstmal eine bitte an den Admin. Hatte mit meinem alten Account
Name: evil76
versucht ein neues Passwort zu beantragen , da ich mich nicht mehr einloggen konnte. Trotz mehrmaligen Versuchen wurde mir leider kein neues Passwort zugesendet, obwohl meine e-mail-adresse noch stimmt.
Daher die bitte mir ein neues Passwort zukommen zu lassen mit dem ich mich wieder einloggen kann. Dann würde ich den neuen Counter_07 umgehend löschen.
Oder alternativ den Account Name: evil76 löschen.

Vielen Dank


@all
So, nun zur eigentlichen Frage...

Habe mir ein Bewässerungssystem erstellt. Das funktioniert auch teilweise, jedoch noch nicht vollumfänglich wie ich mir das vorgestellt habe.
Die Hardware:
1x taster
1x display
1x relay modul (2 relays)

Hardware ist OK!

Mit 2 Relais u. jeweils ein timer pro Relais funktioniert es!

Nun wollte ich jedoch für z.B. ein Relais 2 unterschiedlichen timer.
Bsp.:
counter = 1 (Relais_1_30min)
counter = 2 (Relais_2_60min)
counter = 3 (Relais_3_30min)
counter = 4 (Relais_4_60min)

1.Frage:
Nach vielen verschieden Versuchen komme ich aktuell nicht richtig weiter.
Wenn ich das richtig sehe werden die else if in den Bewässerungsprogrammen ständig duchlaufen weil wahr. Wie kann ich das ändern das diese nur einmal ausgeführt werden.
Das heisst wenn Zeit um z.B. 15min. Bewässerungszeit > dann Stopp
Warten auf neue Eingabe durch taster z.B. counter = 3

2.Frage:
Da ich nur ein taster verwende wollte ich eine Einschaltverzögerung des Relais.
Dies funktioniert auch, jedoch nur nach dem start des arduino (reset) bis laufzeit_1, laufzeit_2 o. laufzeit_3 erreicht ist. Wollte aber das generell eine Einschaltverzögerung vorhanden ist, aber erst nach drücken des tasters u. nicht nacht dem start des Arduino. Also unabhängig von den aktuellen millis.

Vielen Dank für Eure Hilfe


Code:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
const int buttonPin = 7;

int BUTTON_Status = LOW;

//Variablen f¸r den Button
int buttonState = 0;
int counter = 0;
int buttonStateHIGH = 0;

//Variable f¸r Relais Zust‰nde
int RELAYS_1_Status = HIGH;
int RELAYS_2_Status = HIGH;

//Variable in der die Startzeit gespeichert wird
unsigned long startzeit_1 = 0;
unsigned long startzeit_2 = 0;
unsigned long startzeit_3 = 0;
unsigned long startzeit_4 = 0;
unsigned long startzeit_5 = 0;
unsigned long startzeit_6 = 0;

//Led_intern auf Pin 13
const int led_intern = 13;

//Definition der Zeitverzˆgerung
#define laufzeit_1  4000UL  
#define laufzeit_2  4000UL
#define laufzeit_3  4000UL
#define laufzeit_4  20000UL
#define laufzeit_5  8000UL
#define laufzeit_6  4000UL  

#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define RELAYS 10 // PIN for relay signal
#define RELAYSS 11

LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

void setup() {
lcd.begin (16, 2, LCD_5x8DOTS);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);

Serial.begin(9600);

pinMode(led_intern, OUTPUT);
pinMode(buttonPin, INPUT);  
pinMode(RELAYS_1, OUTPUT);   // tells arduino RELAY is an output
pinMode(RELAYS_2, OUTPUT);
digitalWrite(RELAYS_1,HIGH);     //Relais_Status bevor es losgeht
digitalWrite(RELAYS_2,HIGH);
}

void loop(){
    lcd.setCursor(0, 0);
    lcd.print(millis());
    lcd.setCursor(0, 1);
    lcd.print(startzeit_1);
    lcd.setCursor(12, 1);
    lcd.print(counter);
    {
buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH)
      buttonStateHIGH = 1;
  // Taster bet‰tigt (und bleibt gedr¸ckt), dann ist die erste Bedingung erf¸llt
  if (buttonState == LOW && buttonStateHIGH == 1)
  //Taster losgelassen, dann ist die 2weite Bdeingung erf¸llt u. es wird gezaehlt
{
    counter++;
    buttonStateHIGH = 0;
    BUTTON_Status = 1;
}
}
//Bew‰sserungsprogramm_1
  if ((RELAYS_1_Status == HIGH) && (BUTTON_Status == HIGH))
{
  if ((millis() - startzeit_1 >= laufzeit_1)&&(counter == 1))
{
  startzeit_1 = millis();
  lcd.setCursor(7, 0);
  lcd.print("Timer_1");
  digitalWrite(RELAYS_1,LOW);
  RELAYS_1_Status = LOW;
  BUTTON_Status = HIGH;
}
}
  else if (millis()- startzeit_1 > 5000)
{
  digitalWrite(RELAYS_1,HIGH);
  RELAYS_1_Status = HIGH;
  BUTTON_Status = LOW;
  lcd.setCursor(7, 0);
  lcd.print("Select:");
  counter = 0;
  Serial.println("2222");
}
  else if(millis()- startzeit_1 < 5000)
{
  


//Bew‰sserungsprogramm_3
  if ((RELAYS_2_Status == HIGH) && (BUTTON_Status == HIGH))
{
  if ((millis() - startzeit_3 >= laufzeit_3)&&(counter == 3))
{
  startzeit_3 = millis();
  lcd.setCursor(7, 0);
  lcd.print("Timer_3");
  digitalWrite(RELAYS_1,HIGH);
  digitalWrite(RELAYS_2,LOW);
  RELAYS_2_Status = LOW;
  BUTTON_Status = HIGH;
}
}
  else if(millis()- startzeit_3 > 30000)
{
  digitalWrite(RELAYS_2,HIGH);
  RELAYS_2_Status = HIGH;
  BUTTON_Status = LOW;
  counter = 0;
  lcd.setCursor(7, 0);
  lcd.print("Select:");
  Serial.println("6666");
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.06.2019, 08:02
Beitrag #2
RE: Bewaesserung_Timer
(29.06.2019 07:47)Counter_07 schrieb:  Hallo allerseits,

@Admin
erstmal eine bitte an den Admin. Hatte mit meinem alten Account
Name: evil76
versucht ein neues Passwort zu beantragen , da ich mich nicht mehr einloggen konnte. Trotz mehrmaligen Versuchen wurde mir leider kein neues Passwort zugesendet, obwohl meine e-mail-adresse noch stimmt.
Daher die bitte mir ein neues Passwort zukommen zu lassen mit dem ich mich wieder einloggen kann. Dann würde ich den neuen Counter_07 umgehend löschen.
Oder alternativ den Account Name: evil76 löschen.

Vielen Dank

....

Habe Chefe davon in Kenntnis gesetzt.
lgbk Moderator

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.06.2019, 20:04
Beitrag #3
Tongue RE: Bewaesserung_Timer
1.Frage:
Nach vielen verschieden Versuchen komme ich aktuell nicht richtig weiter.
Wenn ich das richtig sehe werden die else if in den Bewässerungsprogrammen ständig duchlaufen weil wahr. Wie kann ich das ändern das diese nur einmal ausgeführt werden.
Das heisst wenn Zeit um z.B. 15min. Bewässerungszeit > dann Stopp
Warten auf neue Eingabe durch taster z.B. counter = 3


Quick & Dirty:
In der If Anweisung eine Boolsche Variable setzen (aktiv = 1)
und die mit abfragen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.06.2019, 13:20
Beitrag #4
RE: Bewaesserung_Timer
@Bitklopfer
danke für die Weiterleitung!

@Wochenendprogrammierer
Danke für den Hinweis! Habe das gleich mal ausprobiert. Der else if teil wird nun nur einmal ausgeführt wie gewünscht.
Habe nun noch einen 3 Timer (Bewässerungsprogramm) hinzugefügt. Wenn 3 funktionieren dann geht es auch mit ...
Innerhalb der Einschaltverzögerung (laufzeit_1, laufzeit_2,laufzeit_3) aktuell 4 sek.
läuft alles prima. Danach funktionieren nur noch timer 1 u. timer 2. Der Grund ist wahrscheinlich das die Bedingungen für Bewässerungsprogramm 3 dann nicht erfüllt sind (if-Bedingung von Bewässerungsprogramm 3).
Eigentlich war die Idee grundsätzlich eine Einschaltverzögerung zu haben.
Momentan nur nach reset bzw. neustart. Dann würde sich das Problem sicher lösen, da dann auch die Bedingung für Bewässerungsprogramm 3 erfüllt wären.
Denke jedenfalls das es so ist!
Also viel. kann mir noch jemand auf die Sprünge helfen?!?

Danke.


Code:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
const int buttonPin = 7;

bool BEWAESSERUNG_Status_1 = false;
bool BEWAESSERUNG_Status_2 = false;
bool BEWAESSERUNG_Status_3 = false;

int BUTTON_Status = LOW;

//Variablen f¸r den Button
int buttonState = 0;
int counter = 0;
int buttonStateHIGH = 0;

//Variable f¸r Relais Zust‰nde
int RELAYS_Status = HIGH;
int RELAYSS_Status = HIGH;

//Variable in der die Startzeit gespeichert wird
unsigned long startzeit_1 = 0;
unsigned long startzeit_2 = 0;
unsigned long startzeit_3 = 0;
unsigned long startzeit_4 = 0;
unsigned long startzeit_5 = 0;
unsigned long startzeit_6 = 0;

//Led_intern auf Pin 13
const int led_intern = 13;

//Definition der Einschaltverzögerung
#define laufzeit_1  4000UL  
#define laufzeit_2  4000UL
#define laufzeit_3  4000UL
#define laufzeit_4  20000UL
#define laufzeit_5  8000UL
#define laufzeit_6  4000UL  

#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define RELAYS 10 // PIN for relay signal
#define RELAYSS 11

LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

void setup() {
lcd.begin (16, 2, LCD_5x8DOTS);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);

Serial.begin(9600);

pinMode(led_intern, OUTPUT);
pinMode(buttonPin, INPUT);  
pinMode(RELAYS, OUTPUT);   // tells arduino RELAY is an output
pinMode(RELAYSS, OUTPUT);
digitalWrite(RELAYS,HIGH);     //Relais_Status bevor es losgeht
digitalWrite(RELAYSS,HIGH);
}

void loop(){
    lcd.setCursor(0, 0);
    lcd.print(millis());
    lcd.setCursor(0, 1);
    lcd.print(startzeit_1);
    lcd.setCursor(12, 1);
    lcd.print(counter);
    {
buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH)
      buttonStateHIGH = 1;
  // Taster bet‰tigt (und bleibt gedr¸ckt), dann ist die erste Bedingung erf¸llt
  if (buttonState == LOW && buttonStateHIGH == 1)
  //Taster losgelassen, dann ist die 2weite Bdeingung erf¸llt u. es wird gezaehlt
{
    counter++;
    buttonStateHIGH = 0;
    BUTTON_Status = 1;
}
}
//Bew‰sserungsprogramm_1
  if ((RELAYS_Status == HIGH) && (BUTTON_Status == HIGH))
{
  if ((millis() - startzeit_1 >= laufzeit_1)&&(counter == 1))
{
  startzeit_1 = millis();
  lcd.setCursor(7, 0);
  lcd.print("Timer_1");
  digitalWrite(RELAYS,LOW);
  RELAYS_Status = LOW;
  BUTTON_Status = HIGH;
  BEWAESSERUNG_Status_1 = HIGH;
  Serial.println("1111");
}
}
  else if ((millis()- startzeit_1 > 5000) && (BEWAESSERUNG_Status_1 == HIGH))
{
  digitalWrite(RELAYS,HIGH);
  RELAYS_Status = HIGH;
  BUTTON_Status = LOW;
  lcd.setCursor(7, 0);
  lcd.print("Select:");
  counter = 0;
  Serial.println("2222");
  BEWAESSERUNG_Status_1 = LOW;
}

//Bew‰sserungsprogramm_2
  if ((RELAYSS_Status == HIGH) && (BUTTON_Status == HIGH))
{
  if ((millis() - startzeit_2 >= laufzeit_2)&&(counter == 2))
{
  startzeit_2 = millis();
  lcd.setCursor(7, 0);
  lcd.print("Timer_2");
  digitalWrite(RELAYS,HIGH);
  digitalWrite(RELAYSS,LOW);
  RELAYSS_Status = LOW;
  BUTTON_Status = HIGH;
  BEWAESSERUNG_Status_2 = HIGH;
  Serial.println("Timer_2_an");
}
}
  else if((millis()- startzeit_2 > 20000) && (BEWAESSERUNG_Status_2 == HIGH))
{
  digitalWrite(RELAYSS,HIGH);
  RELAYSS_Status = HIGH;
  BUTTON_Status = LOW;
  counter = 0;
  lcd.setCursor(7, 0);
  lcd.print("Select:");
  Serial.println("Timer_2_aus");
  BEWAESSERUNG_Status_2 = LOW;
}


//Bew‰sserungsprogramm_3
  if ((RELAYSS_Status == HIGH) && (BUTTON_Status == HIGH))
{
  if ((millis() - startzeit_3 >= laufzeit_3)&&(counter == 3))
{
  startzeit_3 = millis();
  lcd.setCursor(7, 0);
  lcd.print("Timer_3");
  digitalWrite(RELAYS,HIGH);
  digitalWrite(RELAYSS,LOW);
  RELAYSS_Status = LOW;
  BUTTON_Status = HIGH;
  BEWAESSERUNG_Status_3 = HIGH;
  Serial.println("5555");
}
}
  else if((millis()- startzeit_3 > 10000) && (BEWAESSERUNG_Status_3 == HIGH))
{
  digitalWrite(RELAYSS,HIGH);
  RELAYSS_Status = HIGH;
  BUTTON_Status = LOW;
  counter = 0;
  lcd.setCursor(7, 0);
  lcd.print("Select:");
  Serial.println("6666");
  BEWAESSERUNG_Status_3 = LOW;
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.06.2019, 17:14
Beitrag #5
RE: Bewaesserung_Timer
Du könntest einen Timer mitlaufen lassen, der den Wert der boolschen Variable ausliest und ihn ggf. Ändert damit wieder alles durchläuft
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.07.2019, 20:40
Beitrag #6
RE: Bewaesserung_Timer
@Wochenendprogrammierer
Danke für Deine Hilfe! Bin noch nicht ganz im bilde wie das ganze aussehen kann. Also der timer läuft ab start los. Könnte also an einem bestimmten Zeitpunkt die Zeit speichern o. einen Bereich (von - bis). Wie kann ich mit dem timer die boolsche variable auslesen? Meintest Du evtl. verknüpfen ?
bool Wert verändern ist soweit auch klar.
Wäre dankbar wenn Du mir helfen könntest...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.07.2019, 21:31 (Dieser Beitrag wurde zuletzt bearbeitet: 01.07.2019 21:34 von Wochenendprogrammierer.)
Beitrag #7
RE: Bewaesserung_Timer
(01.07.2019 20:40)Counter_07 schrieb:  @Wochenendprogrammierer
Danke für Deine Hilfe! Bin noch nicht ganz im bilde wie das ganze aussehen kann. Also der timer läuft ab start los. Könnte also an einem bestimmten Zeitpunkt die Zeit speichern o. einen Bereich (von - bis). Wie kann ich mit dem timer die boolsche variable auslesen? Meintest Du evtl. verknüpfen ?
bool Wert verändern ist soweit auch klar.
Wäre dankbar wenn Du mir helfen könntest...

Ich bin mir nicht ganz sicher was du meinst.
Du kannst in deiner eine Funktion erstellen z.B. setbool()
in dieser setzt du die Variablen auf den Wert damit deine Else Abfrage wieder aufgerufen wird.

Hier ein beispiel:
Deine Else-Abfrage wird nur 1x pro durchlauf erreicht, weil dein BEWAESSERUNG_Status_1 == HIGH sein soll.
Am Ende deiner Else Abfrage setzt du ihn auf low.
Dementsprechend musst du ihn dann nach XXXXX-Millisekunden wieder auif HIGH setzen.


Code:
else if ((millis()- startzeit_1 > 5000) && (BEWAESSERUNG_Status_1 == HIGH))
{
  digitalWrite(RELAYS,HIGH);
  RELAYS_Status = HIGH;
  BUTTON_Status = LOW;
  lcd.setCursor(7, 0);
  lcd.print("Select:");
  counter = 0;
  Serial.println("2222");
  BEWAESSERUNG_Status_1 = LOW;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.07.2019, 21:04
Beitrag #8
RE: Bewaesserung_Timer
Ok, danke für die ausführliche Beschreibung!
Habe das nun soweit verstanden u. werde versuchen das umzusetzen.

Durch Zufall bin ich jetzt noch auf onebutton gestoßen. Das wäre zur Not auch noch eine Möglichkeit das mit z.B. doppelklick zu lösen. Also erst Auswahl mit taster des entprechenden Bewässerungsprogramms mit anschließendem doppelklick, um dann das ausgewählte Programm zu starten. Werde aber Deine Variante zuerst ausprobieren, denn ich möchte es auf diese Art u. Weise lösen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste