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
Tankstation
24.10.2019, 18:22
Beitrag #1
Tankstation
Hallo zusammen,

mein Name ist Kai und bin seit über 30 Jahren Modellflieger.
Ich bin neu auf dem Gebiet Arduino unterwegs und möchte hier etwas dazulernen.
Über kleine Arduinoprojekte aus dem Netz welche ich Erfolgreich nachgebaut habe bin ich angefixt worden.
Daraufhin kam der erste Experimentierkasten...
Nun der erste Wunsch etwas fürs Hobby umzusetzen.

Ich baue eine automatische Tankstation mit einer Elektrischen Pumpe und einem Sensor. Es soll verschiedene Zustände geben wie z.B Leeren, Automatisches Füllen bis Druckschalter anspricht und manuelles Füllen.
Ich habe mich daraufhin mit der Statemachine auseinandergesetzt, eine Vorlage von einer Ampelschaltung dazu mehrfach nach meinen Wünschen umprogrammiert und es ging.
Daraufhin habe ich das ganze für meine Anwendung neu aufgesetzt nach dem gleichen Prinzip.
Nun habe ich aber das Problem, dass die Taster die zwischen den Zuständen hin und herschalten sollen laut Programmcode die Variable auf "false" gesetzt werden soll, aber diese immer wieder durch irgend einen Vorgang auf "true" gesetzt wird ohne das der Taster betätigt wird.
Der Sketch enthält nur mal die Zustände, ohne großartigen Code in den Zuständen um das ganze am Anfang einfach zu halten. Erst wenn die Zustände umschalten gehen, möchte ich erweitern....
Ich habe momentan auch nur zwei Zustände um auch hier den Code erstmal schmal zu halten....
Vielleicht hat ja jemand Lust sich das mal anzuschauen.
Ein Kumpel von mir hat auch mit Arduino angefangen, kann sich das Problem aber auch nicht erklären.

Hier mal mein Sketch:
(für Arduino UNO)

Code:
// include the library code:
#include <LiquidCrystal.h>

// Pin - Definitionen
const int PIN_LED_GRUEN = 5;
const int PIN_LED_GELB = 13;
const int PIN_LED_ROT = 6;

const int PIN_TASTEA = 1;
const int PIN_TASTEB = 2;
const int PIN_TASTEC = 4;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// Zustände
const int Z_AUS = 0;
const int Z_FUELL1 = 1;
const int Z_FUELL2 = 2;
const int Z_FUELLBAG = 3;
const int Z_FUELLBOT = 4;
const int Z_FUELLMAN = 5;
const int Z_LEEREN = 6;


// Variablen für Ereignisse
bool e_tastea=false;
bool e_tasteb=false;
bool e_tastec=false;

// Variablen für Zustände
int zustand;

void AUS() {
  
  digitalWrite(PIN_LED_GELB,LOW);
  digitalWrite(PIN_LED_GRUEN,LOW);
  digitalWrite(PIN_LED_ROT,HIGH);

  
  lcd.clear ();
  lcd.setCursor(0, 0);
  lcd.print("FUELLEN       ");
  lcd.setCursor(0, 1);
  lcd.print("LEEREN        ");
  
  e_tastea = false;
  e_tasteb = false;
  e_tastec = false;

  zustand = Z_AUS;
}

void FUELL1() {
  
  digitalWrite(PIN_LED_GRUEN,LOW);
  digitalWrite(PIN_LED_GELB,LOW);
  digitalWrite(PIN_LED_ROT,LOW);



  lcd.clear ();
  lcd.setCursor(0, 0);
  lcd.print("BEUTEL        ");
  lcd.setCursor(0, 1);
  lcd.print("FLASCHE       ");
  
  
  e_tastea = false;
  e_tasteb = false;
  e_tastec = false;

  zustand = Z_FUELL1;
}

void FUELL2() {

  digitalWrite(PIN_LED_GRUEN,LOW);
  digitalWrite(PIN_LED_GELB,LOW);
  digitalWrite(PIN_LED_ROT,LOW);

  lcd.clear ();
  lcd.setCursor(0, 0);
  lcd.print("Manuell       ");
  lcd.setCursor(0, 1);
  lcd.print("Zurueck       ");
  
  e_tastea = false;
  e_tasteb = false;
  e_tastec = false;

  zustand = Z_FUELL2;
}

void FUELLBAG() {
  

  digitalWrite(PIN_LED_GRUEN,LOW);
  digitalWrite(PIN_LED_GELB,LOW);
  digitalWrite(PIN_LED_ROT,LOW);

  lcd.clear ();
  lcd.setCursor(0, 0);
  lcd.print("AUTO BEUTEL   ");
  lcd.setCursor(0, 1);
  lcd.print("STOP/ZURUECK  ");

  
  e_tastea = false;
  e_tasteb = false;
  e_tastec = false;

  zustand = Z_FUELLBAG;
}

void FUELLBOT() {

  digitalWrite(PIN_LED_GRUEN,LOW);
  digitalWrite(PIN_LED_GELB,LOW);
  digitalWrite(PIN_LED_ROT,LOW);
  
  lcd.clear ();
  lcd.setCursor(0, 0);
  lcd.print("AUTO FLASCHE  ");
  lcd.setCursor(0, 1);
  lcd.print("STOP/ZURUECK  ");
  
  e_tastea = false;
  e_tasteb = false;
  e_tastec = false;

  zustand = Z_FUELLBOT;
}

void FUELLMAN() {
  
  digitalWrite(PIN_LED_GRUEN,LOW);
  digitalWrite(PIN_LED_GELB,LOW);
  digitalWrite(PIN_LED_ROT,LOW);


  lcd.clear ();
  lcd.setCursor(0, 0);
  lcd.print("MANUELL FUELL ");
  lcd.setCursor(0, 1);
  lcd.print("STOP/ZURUECK  ");
  
  e_tastea = false;
  e_tasteb = false;
  e_tastec = false;

  zustand = Z_FUELLMAN;
}

void LEEREN() {
  
  digitalWrite(PIN_LED_GRUEN,LOW);
  digitalWrite(PIN_LED_GELB,LOW);
  digitalWrite(PIN_LED_ROT,LOW);
  
  lcd.clear ();
  lcd.setCursor(0, 0);
  lcd.print("MANUELL LEEREN");
  lcd.setCursor(0, 1);
  lcd.print("STOP/Zurueck  ");
  
  e_tastea = false;
  e_tasteb = false;
  e_tastec = false;

  zustand = Z_LEEREN;
}

void ereignisse() {
  if (digitalRead(PIN_TASTEA) == LOW) {
    e_tastea = true;
    delay(300);
  }
  if (digitalRead(PIN_TASTEB) == LOW) {
    e_tasteb = true;
    delay(300);
  }
  if (digitalRead(PIN_TASTEC) == LOW) {
    e_tastec = true;
    delay(300);
  }
}

void verarbeitung() {
if (e_tastea) {
    switch(zustand) {
      case Z_AUS: FUELL1(); break;
      case Z_FUELL1: FUELLBAG(); break;
      }

  }


}


void setup() {

  Serial.begin(9600);
  
  // Pin's vorbereiten
  pinMode(PIN_LED_GRUEN,OUTPUT);
  pinMode(PIN_LED_GELB,OUTPUT);
  pinMode(PIN_LED_ROT,OUTPUT);

  pinMode(PIN_TASTEA,INPUT_PULLUP);
  pinMode(PIN_TASTEB,INPUT_PULLUP);
  pinMode(PIN_TASTEC,INPUT_PULLUP);

  // Ausgangszustand herstellen
  digitalWrite(PIN_LED_GRUEN,LOW);
  digitalWrite(PIN_LED_GELB,LOW);
  digitalWrite(PIN_LED_ROT,LOW);

  lcd.begin(16, 2);
  lcd.setCursor(2, 0);
  lcd.print("Tankstation");
  lcd.setCursor(2, 1);
  lcd.print("Version 1.0");
  lcd.clear ();
  
  
  
  e_tastea = false;
  e_tasteb = false;
  e_tastec = false;

  zustand = Z_AUS;
}

void loop() {
  ereignisse();
  verarbeitung();
  Serial.print("STATUS = " );
Serial.println(zustand);
Serial.println(e_tastea);
Serial.println(e_tasteb);
Serial.println(e_tastec);
}

Wenn Ihr den Arduino bespielt ohne Taster usw und die SerialProtokol anschaut seht ihr das schon im zweiten Zyklus die Tastea auf 1 springt.

Grüße

Kai
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.10.2019, 19:51
Beitrag #2
RE: Tankstation
Du verwendest Pin D1 für den Taster.
Der ist am Uno am USB-Port zur seriellen Nutzung reserviert.
Dadurch bekommst du deinen Fehler
Lass am Uno immer D0 und D1 frei, dann gibt es keine Fehler.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.10.2019, 20:00 (Dieser Beitrag wurde zuletzt bearbeitet: 24.10.2019 20:04 von Tommy56.)
Beitrag #3
RE: Tankstation
Die delay(300) würde ich raus nehmen. Evtl. ein delay(10) (bis 50 bei sehr schlechten Tastern) am Ende des Loop.

Ansonsten suche mal nach Zustandsmaschine, Endlicher Automat, Finit State Machine.
Evtl ist es auch notwendig, sich den alten Status der Taster jeweils zu merken, damit Du einen weiteren Tastendruch erst annimmst, wenn der Taster zwischendurch losgelassen wurde.
So nach dem Prinzip:
Code:
bool tasteAlt = false;

void loop() {
  if (digitalRead(tastePin) != tasteAlt) {
    tasteAlt = tastePin;
    if (!tasteAlt) {  // Taste ist LOW
      // taste neu gedrückt
    }
  }
}

Dann die Zustände entsprechend belegen und in einem Switch/Case erst mal nur auf dem seriellen Monitor ausgeben.
Das bleibt übersichtlicher, bis der Ablauf läuft.

Auch sinvoll ist es, sich die möglichen (und evtl. verbotenen) Zustandsübergänge mal auf Papier aufschreiben. Da vergisst man weniger.

Gruß Tommy

Edit: Ich wußte doch das es das Thema hier schon mal gab.

"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
24.10.2019, 20:26
Beitrag #4
RE: Tankstation
Und wenn du für dein Display einen I2C-Adapter nimmst, sparst du auch digitale Pins, die du anderweitig einsetzen kannst.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.10.2019, 22:33 (Dieser Beitrag wurde zuletzt bearbeitet: 24.10.2019 22:34 von Lipoholiker.)
Beitrag #5
RE: Tankstation
(24.10.2019 19:51)hotsystems schrieb:  Du verwendest Pin D1 für den Taster.
Der ist am Uno am USB-Port zur seriellen Nutzung reserviert.
Dadurch bekommst du deinen Fehler
Lass am Uno immer D0 und D1 frei, dann gibt es keine Fehler.

Hallo,

das ging ja mal fix mit der Antwort.
Ich habe das natürlich getestet und den Taster von Eingang1 auf 3 gelegt. Nun geht´s!!!
DANKE!

Wegen den vielen belegten Ausgängen:
Ich habe momentan nur ein LCD ohne I2C.
Anderes LCD wird bestellt wenn der Rest funzt.

Tommy, das habe ich auch gelesen das da mal jemand probiert hat, aber soviel "Biss" wie in dem Beitrag zu lesen war dann doch nicht drin Big Grin
Übrigens einen Ablaufplan wann welcher Status geschalten wird habe ich mir als Flowdiagramm gemacht.... Cool

Gute Nacht

Kai
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.10.2019, 07:26
Beitrag #6
RE: Tankstation
Prima, dass es jetzt funktioniert und danke für die Rückmeldung.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
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