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:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Programm Schwimmer optimieren
05.11.2020, 10:43 (Dieser Beitrag wurde zuletzt bearbeitet: 05.11.2020 17:57 von Bitklopfer.)
Beitrag #1
Programm Schwimmer optimieren
Programm Schwimmer optimieren

Servus miteinander,
mit Arduino- Programmen beschäftige ich mich seit ca. 3 Monaten.
Vorher hatte ich mich mit C-Control beschäftigt und einige Projekte erstellt.
Nun möchte ich eine Gießanlage für mein kleines Treibhaus bauen.
Das Gießwasser soll zunächst in einen 10L Behälter getankt werden.
Der Tankvorgang sollte zeitlich begrenzt sein aber durch einen Schwimmerschalter unterbrochen werden, damit bei einem Schwimmerausfall keine Überschwemmung produziert wird.
Hier mein Tank Sketch der später in das Gesamtprogramm integriert werden soll.
Das Programm macht zwar was es soll, funktioniert aber nicht im Gesamtprogramm.
Wahrscheinlich kann man den Code viel intelligenter erstellen. Das wäre meine Bitte, mich dabei zu unterstützen.
Grüße
Max
Code:
// Testprogramm für Schwimmerschaltung
// der zeitlich begrenzte Tankprozess wird durch den Schwimmerschalter unterbrochen

#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

int tanken = 6;
int schwimmer = 5;
int tasterstatus=0;
int i=0; //Tankzähler auf "0"

void setup()
{
lcd.init(); //Im Setup wird der LCD gestartet
lcd.backlight();  
pinMode(tanken, OUTPUT);
pinMode(schwimmer, INPUT);  //pinMode(schwimmer, INPUT);
}
void loop()
{
   if (i< 20) {  //Anzahl der Tankschritte
goto ein;
}
while(digitalRead(schwimmer)==LOW){  // Schwimmer ein, Magnetventil zu
digitalWrite(tanken, LOW);
if (i> 20){  
goto aus;
//digitalWrite(tanken, LOW);
ein:
digitalWrite(tanken, HIGH);
   lcd.print(" tanken      ");
delay (500); // Zeit der Tankschritte (500ms * Anzahl "i")
}
(i++);      

aus:
digitalWrite(tanken, LOW);
}  
}
...das ist bei uns [ code ] und nicht PHP.
lgbk Moderator
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 10:52
Beitrag #2
RE: Programm Schwimmer optimieren
Wichtigste Änderung: ohne goto und Sprungmarken arbeiten.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 10:55 (Dieser Beitrag wurde zuletzt bearbeitet: 05.11.2020 10:56 von MicroBahner.)
Beitrag #3
RE: Programm Schwimmer optimieren
Sorry, aber dein Sketch ist das absolute Chaos. Du springst wie wild hin und her, in Schleifen rein, aus ifs raus. Das kann man nicht vernünftig nachvollziehen.
Verabschiede dich erstmal vom goto. Das braucht man (normalerweise) nicht, und es führt nur zu unübersichtlichen Programmen.
Und die while-Schleife aufgrund des Schwimmerzustandes blockiert dir bei entsprechendem Schwimmerzustand den ganzen Sketchablauf. Das kann mit etwas anderem zusammen nicht funktionieren.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.11.2020, 13:55
Beitrag #4
RE: Programm Schwimmer optimieren
Danke für die Antworten,
wirklich weiter komme ich dadurch aber nicht.
Das mit den "gotos's" stammt aus der C-Control-Zeit.
Meine vorhandene Gießanlage hat bis dato elektrisch gut funktioniert.
Nun ist die Hardware in die Jahre gekommen und deshalb wollte ich alles neu machen
und mit einen Feuchtsensor betreiben.
Das Arduino- System schien mir dafür am besten geeignet.
Einen Lösungsansatz für das Programm hätte ich aber schon erwartet, welcher Schleifentyp, wie unterbrechen usw.
Wenn ich das "void giessen" in mein Gesamtprogramm einbaue, dann wird es doch bei jedem Aufruf nur einmal durchlaufen oder?
Danke im Voraus
Gruß
Max
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.11.2020, 14:12
Beitrag #5
RE: Programm Schwimmer optimieren
(06.11.2020 13:55)maxo schrieb:  ....
Einen Lösungsansatz für das Programm hätte ich aber schon erwartet, welcher Schleifentyp, wie unterbrechen usw.
....

Def. ist der Arduino richtig, allerdings solltest du dich vom Basic lösen.
Warum fängst du dann nicht damit an, die Grundlagen von C++ zu lesen und verstehen ? Das kannst du am besten mit den Beispilen der IDE.
Da steht auch, wenn man den Zustand eine Eingangspins nutzen will, muss man diesen erst einlesen und danach weiter verarbeiten. Und einen Eingang solltest du immer mit einem Pullup/Pulldown-Widerstand abschließen, damit dieser einen definierten Zustand erhält, andernfallst flowted dieser, was wiederum Fehler verursacht.

Weiterhin ist die "while-Schleife" hier überflüssig, da du mit der loop schon eine Schleife hast, die immer läuft und niocht blockiert werden darf und das macht die while-Schleife. Statt dieser verwendest du eine if-Abfrage.

Ich hoffe erst mal genug Infos geliefert zu haben.
Wenn noch Fragen sind....leg los.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.11.2020, 15:06
Beitrag #6
RE: Programm Schwimmer optimieren
Hallo Max,
(06.11.2020 13:55)maxo schrieb:  Das mit den "gotos's" stammt aus der C-Control-Zeit.
Also ich habe auch viel mit der C-Control gemacht. Richtig große Programme mit mehreren tausend Zeilen Code. Da kam nie ein goto vor.
D.h. goto hat nichts mit C-Control zu tun, sondern mit dem eigenen Programmierstil. Da solltest Du also dran arbeiten um dich von der 'goto' Denke zu lösen. Das führt einfach nur zu schwer nachzuvollziehenden und fehlerträchtigen Programmen. Und es geht immer auch ohne.

Dass die while-Schleife ein großes Problem ist hat dir ja auch Dieter schon geschrieben. Die führt auch dazu, dass das nicht im 'Gesamtprogramm' funktioniert.

Du musst lernen 'blockadefrei' zu programmieren. Das erfordert ein wenig Umdenken. Deine Schleife ist der 'loop'. Der sollte ohne große Verzögerungen immer durchlaufen. In dieser Schleife kannst Du nun abfragen, ob ein Ereignis aufgetreten ist, dass eine Aktion erfordert. Also z.B. dass dein Schwimmerschalter anspricht, und Du den Zufluß abstellen muss. Oder dass eine Zeit abgelaufen ist, und Du deshalb den Zufluß stoppen musst.
Mal als Pseudo-Code in der Art:
Code:
void loop () {
    if ( schwimmerschalter aktiv ) {
        Zuflußventil abschalten
    } else if ( zuflußventil geschlossen ) {
        Zuflußventil einschalten
        Zeitüberwachung starten
    }
    
    if ( Zeit abgelaufen ) {
        Zuflußventil abschalten
    }
    ...
    ...
}
( Das ist sicher noch nicht vollständig ).

Für die Zeitfunktionen kannst Du dich entweder mit millis beschäftigen und das Beispiel 'Blink without delay' der IDE anschauen und verstehen lernen. Oder Du verwendest die Zeitfunktionen der Library 'MobaTools'. Das ist etwas einfacher, und da sind auch Beispiele dabei. Die MobaTools kannst Du über den Bibliotheksmanager installieren.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.11.2020, 21:43 (Dieser Beitrag wurde zuletzt bearbeitet: 06.11.2020 21:44 von MicroBahner.)
Beitrag #7
RE: Programm Schwimmer optimieren
(05.11.2020 10:43)maxo schrieb:  Das Gießwasser soll zunächst in einen 10L Behälter getankt werden.
Der Tankvorgang sollte zeitlich begrenzt sein aber durch einen Schwimmerschalter unterbrochen werden, damit bei einem Schwimmerausfall keine Überschwemmung produziert wird.
Wodurch soll der ganze Tankvorgang eigentlich gestartet werden?

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.11.2020, 22:32
Beitrag #8
RE: Programm Schwimmer optimieren
Basic...
das erinnert mich an was... da wurde mal programmiert:
Code:
ON ERROR GOSUB 9000
...und dann lief mal der Stack über ausgelöst durch den Ausstieg durch GOTO aus einem Unterprogramm über.... und dann kuckten sich einige Leute dumm an und man mußte hinterher viel von Hand zusammenrechnen...weil die erfassten Ereignise konnte man nicht wiederholen...
lgbk

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino Programm funktioniert auf nano nicht Arduino DMX Master 10 1.698 15.06.2020 13:07
Letzter Beitrag: Arduino DMX Master
  Arduino Programm Geht nicht mehr auf Arduino DMX Master 2 1.515 09.06.2020 20:13
Letzter Beitrag: Arduino DMX Master
  Morse Programm Didi_0 14 1.776 04.04.2020 21:13
Letzter Beitrag: ardu_arne
  Programm läuft auf UNO aber nicht auf ATTINY85 Diwo13 55 5.751 17.12.2019 17:45
Letzter Beitrag: Diwo13
  Programm hängt sich auf Jonas Meier 3 839 13.11.2019 11:12
Letzter Beitrag: MicroBahner
Question Programm läuft nicht richtig CMeeep 22 3.376 04.07.2019 21:58
Letzter Beitrag: Franz54
  PWM Rampe + Impulszähler in einem Programm heini320 10 2.842 29.11.2018 18:31
Letzter Beitrag: heini320
Music MIDI Software optimieren solarmusic 6 1.554 22.11.2018 18:20
Letzter Beitrag: Tommy56
  Code für Speicher optimieren Sasch600xt 35 7.928 31.08.2018 12:41
Letzter Beitrag: Sasch600xt
Exclamation Programm pulsierende Lava Eranos 6 2.199 26.06.2018 22:39
Letzter Beitrag: Eranos

Gehe zu:


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