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


An alle Neuankömmlinge hier, wenn ihr Code(Sketch) hier posten wollt dann liest euch bitte diese Anleitung durch.

Ich spreche fließend Schwäbisch, Deutsch das Notwendigste und für die Begriffsstutzigen erprobtes Tacheles mit direkten Hinweisen ohne Schnörkel...

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
  Code zum ansteuern einzelner WS2812B optimieren N1d45 20 1.318 13.05.2021 09:31
Letzter Beitrag: rev.antun
  Gamepad Programm verstehen Benni84 61 3.432 19.04.2021 19:10
Letzter Beitrag: N1d45
  Programm startet bei Neustart nicht Moritzzz 18 1.676 02.04.2021 14:06
Letzter Beitrag: Tommy56
  Programm bleibt hängen Tellen 10 1.888 04.03.2021 23:46
Letzter Beitrag: Tellen
  Programm zurück in den Loop bringen AnjinSan 8 1.095 08.01.2021 20:02
Letzter Beitrag: MicroBahner
  Servo im Programm über einen Taster betätigen CB2311 26 2.530 08.12.2020 19:21
Letzter Beitrag: Tommy56
  Arduino Programm funktioniert auf nano nicht Arduino DMX Master 10 2.858 15.06.2020 13:07
Letzter Beitrag: Arduino DMX Master
  Arduino Programm Geht nicht mehr auf Arduino DMX Master 2 2.252 09.06.2020 20:13
Letzter Beitrag: Arduino DMX Master
  Morse Programm Didi_0 14 2.913 04.04.2020 21:13
Letzter Beitrag: ardu_arne
  Programm läuft auf UNO aber nicht auf ATTINY85 Diwo13 55 9.216 17.12.2019 17:45
Letzter Beitrag: Diwo13

Gehe zu:


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