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
Tasterabfrage funktioniert nicht
04.02.2021, 17:07 (Dieser Beitrag wurde zuletzt bearbeitet: 04.02.2021 18:27 von Moehn.)
Beitrag #1
Tasterabfrage funktioniert nicht
Hallo

Nun melde ich mich auch einmal mit einem Problem. Einige meiner Probleme konnte ich ja schon mit dem Forum selber lösen, aber bei unten stehendem Problem erkenne ich den Fehler nicht.

Ich bin 52, und habe schon vor einigen Jahren mit den Atmels rumgespielt, bin aber bei ca. dem Atmeg32 leider ausgestiegen(Job, Familie, etc). Also seit gut 10 Jahren bin ich dbzgl. nicht mehr aktiv gewesen.

Nun habe ich aber wieder ein paar kleine Anwendungen für die MC´s. Deshalb arbeite ich mich wieder in die Arduinos ein.
Ich habe auch schon einige Beispiele (Taster ohne Delay, LED etc) nachprogrammiert. Hat alles bis dahin funktioniert.

Und hier mal mein aktuelles Problem.
Ich möchte ein Programm schreiben was eine kleine Heizung steuert. Hierzu sind (bzw. werden kommen) an verschiedenen Stellen im Ablauf immer wierder kleine Menues zum Taster abfragen. Deshalb habe ich mir überlegt die Tasterabfrage (4 Taster) in eine eigene Procedur zu schreiben, die ich entsprechend immer wieder aufrufe. So habe ich das damals (vor 10 Jahren) auch immer gemacht und hat so gut funktioniert.

Aber in dem Code unten funktioniert es nicht.

In der Funktion Initialisierung rufe ich die Funktion Taste (Taster abfragen) auf.
Solange keiner der 4 Taster gedrückt ist läuft die while Schleife. DIes ist auch zeitunkritisch weil hier definitiv gewartet wird und nichts anderes gemacht werden soll. Wird dann ein Taster gedrückt soll der Variablen Tasterstatus (Startwert=0) der Wert 1-4, je nach gedrücktem Taster zugewiesen werden.
Anschliessend wird der Wert in Tastenstatus ausgelesen und je nach Wert in eine andere Funktion gesprungen (Warmduschen, Kaltduschen).
DIe ganzen Delay und Serial.Print habe ich nur eingefügt, um im Monitor zu schauen, wo das Program aktuell ist.
Hier stelle ich nun fest, das in der Tasterabfrage der Varaiblen Tastenstatus nie ein wert (z.B. 1 oder 2) zugewiesen wird.
Und genau dieses versteh ich nicht und finde auch den Fehler nicht.
Die Hardware ist o.k.- hab ich mit einem anderen Programm geprüft.
Ansonsten ist das ein Arduino nano every mit einem Grafikdisplay, 4 Tastern und 4 LED.

Wenn ich sonst noch etwas verbessern kann - auch bitte her damit. Ich steige gerade erst wieder ein und würde mich a[/code]uch selber eher noch in die Anfängerabteilung stecken.

Grüße
Dirk
Code:
#include <Arduino.h>
#include <U8g2lib.h>
//#include <OneWire.h>
//#include <DallasTemperature.h>
#include <math.h>


int Dieselpumpe = 6;//PWM PIN
int Gluehkerze = 4;
int Ventilator = 5;//PWM PIN
int Wasserpumpe = 3;//PWM PIN
int Wassertemp1 = A7;
int Wassertemp2 = A6;
int Abgastemp = A5;
int Reset = 17;
int Heizungsstart_warm = 14;
int Heizungsstop_kalt = 15;
int Funktionstaster = 16;
int Funktionstastenstatus = 0;
int Starttastenstatus = 0;
int Stoptastenstatus = 0;
int Heizungsfehler = 0;
float Ventilatorspeed; // percent
float Wasserpumpenspeed; // percent
float Diesel; // percent
int Gluehzeit; // seconds
float Wassertemperatur; // degres C
float Abgastemperatur; // degres C
//int Sensortemperatur;
float Abgastemperaturintervall[10]; // array of last 10 sec water temp, degres C
int Duschetimeout;
int Initfertig = 0;
int Tastenstatus = 0;
int Taster1 = 0;
int Taster2 = 0;
int Taster3 = 0;
int Taster4 = 0;
bool Dusche;
bool Flamme;
bool Heizung_Fehler;
bool Kaltedusche;
bool LEDHeizung_ein;

float Temp_max = 40; // degres C
float Temp_min = 32; // minimal temperature for shower, degres C
int Flamme_status = 0;


#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 9);

void setup()
{
  pinMode(Gluehkerze, OUTPUT);
  pinMode(Dieselpumpe, OUTPUT);
  pinMode(Ventilator, OUTPUT);
  pinMode(Wasserpumpe, OUTPUT);
  pinMode(Wassertemp1, INPUT);
  pinMode(Wassertemp2, INPUT);
  pinMode(Abgastemperatur, INPUT);
  pinMode(Heizungsstart_warm, INPUT);
  pinMode(Heizungsstop_kalt, INPUT);
  pinMode(Funktionstaster, INPUT);
  pinMode(Reset, INPUT); // important, this pulls de button pin to high, so when pressed it goes to low

  Serial.begin(9600);
  u8g2.begin();  
}



void Initialisierung()
{
      if (Initfertig == 0)
      {
      while (Tastenstatus == 0)
      
        {
          Serial.print(" Init_in_while_Schleife");
        u8g2.firstPage();
        do {
            u8g2.setFont(u8g2_font_10x20_tr);
            u8g2.drawStr(15,21,"Duschomat");
            u8g2.drawStr(0,50,"kalt     warm");
            }while ( u8g2.nextPage() );
            
          Taste();
          
        Serial.print(" nach Taste ");
      if (Tastenstatus == 1)
          {
            Warmduschen();
            Initfertig = 1;        
          }
      if (Tastenstatus == 2)
          {
            Kaltduschen();
            Initfertig = 1;          
          }
        }
     }
  }

void Taste()
{
  while (digitalRead(Heizungsstart_warm) == LOW && digitalRead(Heizungsstop_kalt) == LOW && digitalRead(Funktionstaster) == LOW && digitalRead(Reset) == LOW)
  {
      
  if ( digitalRead(Heizungsstart_warm) ==HIGH)
      { Tastenstatus = 1;
      Serial.print(" Taste = 1: ");
      Serial.print(Tastenstatus);
      }
    
  if ( digitalRead(Heizungsstop_kalt) == HIGH)
      { Tastenstatus = 2;
      Serial.print(" Taste = 2: ");
      Serial.print(Tastenstatus);
      }
      
  if (digitalRead(Funktionstaster) == HIGH)
      { Tastenstatus = 3;
      Serial.print("Taste = 3:");
      Serial.print(Tastenstatus);
      }
      
  if (digitalRead(Reset) == HIGH)
      { Tastenstatus = 4;
      Serial.print(" Taste = 4: ");
      Serial.print(Tastenstatus);
      }
  delay(1000);
  Serial.print(" Tasterabfrage: ");
  Serial.print(Tastenstatus);
  }
  delay(1000);
  Serial.print(" nach Delay1000 ");
}


  
void Temperaturdaten()
{ // keeps the temp variables updated
  static unsigned long timer;
  if (millis() < timer)
    {
    timer = millis();
    }
  // call the get_temp function and smoothen the result
  Wassertemperatur = (9 * Wassertemperatur + Sensortemperatur(Wassertemp2)) / 10;
  Abgastemperatur = (9 * Abgastemperatur + Sensortemperatur(Abgastemperatur)) / 10;

  if (millis() > timer + 1000)
    { // every sec
    timer = millis();    
    for ( int i = 9; i >= 1 ; i-- ) { // updating the exhaust temperature history
      Abgastemperaturintervall[i] = Abgastemperaturintervall[i - 1]; // shift array values, deleting the older one
    }
    Abgastemperaturintervall[0] = Abgastemperatur; // add new temp value
    }
}

float Sensortemperatur(int Sensor)
{ // read a sensor (NTC) value, smoothen it a bit and convert it to C degrees
  float temp = 0;
  for (int i = 0; i < 10; i++)
    {
    temp += analogRead(Sensor);
    }
    temp /= 10;

    if (temp < 25 || temp > 1000)
    { // check if sensor is good
    Heizungsfehler = 1;
    return 100;
    } else
    {
    temp = log(((10240000 / temp) - 10000));
    temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * temp * temp )) * temp );
    temp = temp - 273.15;
    return temp;
    }
}

void Warmduschen()
{
u8g2.firstPage();
        do {
            u8g2.setFont(u8g2_font_10x20_tr);
            u8g2.drawStr(15,21," Duschomat");
            u8g2.drawStr(0,40," Warmduschen");
            u8g2.drawStr(0,60,"Start    Stop");
            }while ( u8g2.nextPage() );
}

void Kaltduschen()
{          
            u8g2.firstPage();
            do {
            u8g2.setFont(u8g2_font_10x20_tr);
            u8g2.drawStr(15,21," Duschomat");
            u8g2.drawStr(0,40," Kaltduschen");
            u8g2.drawStr(0,60,"Stop    Start");
            }while ( u8g2.nextPage() );
            Serial.println("Display ende");
            
        while (digitalRead(Heizungsstart_warm) == LOW && digitalRead(Heizungsstop_kalt) == LOW)
      
        {
            Serial.println("While");  
              Starttastenstatus = digitalRead(Heizungsstart_warm);
              Stoptastenstatus = digitalRead(Heizungsstop_kalt);
              Serial.println(Starttastenstatus);
              Serial.println(Stoptastenstatus);

              
                if (Starttastenstatus == HIGH)
                    {
                      while (Stoptastenstatus == LOW)
                      {
                       Stoptastenstatus = digitalRead(Heizungsstop_kalt);
                      digitalWrite(Wasserpumpe, HIGH);
                      Serial.print(Wasserpumpe);
                       u8g2.firstPage();
                       do {
                          u8g2.setFont(u8g2_font_10x20_tr);
                          u8g2.drawStr(0,40,"Wasser an");
                          }while ( u8g2.nextPage() );
                      }
                    }
            
                if (Stoptastenstatus == HIGH)
                      {
                      digitalWrite(Wasserpumpe, LOW);
                      u8g2.firstPage();
                       do {
                          u8g2.setFont(u8g2_font_10x20_tr);
                          u8g2.drawStr(0,40,"Wasser aus");
                          }while ( u8g2.nextPage() );
                      }
      
            }  
              
}

void loop()
{
  Initialisierung();
  Temperaturdaten();
  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.02.2021, 17:35
Beitrag #2
RE: Tasterabfrage funktioniert nicht
(04.02.2021 17:07)Moehn schrieb:  ...
Wenn ich sonst noch etwas verbessern kann - auch bitte her damit.
...
Ja gerne,
du kannst Programmcode nach dieser Anleitung oben korrigieren oder neu einstellen.
Damit wird er besser lesbar weil Formatierungen nicht verloren gehen.

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.02.2021, 17:50
Beitrag #3
RE: Tasterabfrage funktioniert nicht
Danke, schon was dazugelernt.

Dirk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.02.2021, 01:14 (Dieser Beitrag wurde zuletzt bearbeitet: 05.02.2021 02:34 von Corvus.)
Beitrag #4
RE: Tasterabfrage funktioniert nicht
Die While-Schleife wird nur durchlaufen, wenn keine Taste Gedrückt wird. In der Schleife, direkt danach wird geprüft ob eine Taste gedrückt wird. Dies geschieht aber nur, wenn sie nur wenige µs vorher nicht gedrückt war.
Eine Lösung wäre zb
Code:
Tastenstus = 0;
while (Tastenstus == 0){
//(...)
}


Wobei ich es wohl eher so lösen würde:

Code:
void Taste() {
  while (true) {
    if (digitalRead(Heizungsstart_warm)) {
      Tastenstatus = 1;
      break;
    }

    if ( digitalRead(Heizungsstop_kalt)) {
      Tastenstatus = 2;
      break;
    }

    if (digitalRead(Funktionstaster)) {
      Tastenstatus = 3;
      break;
    }

    if (digitalRead(Reset)) {
      Tastenstatus = 4;
      break;
    }
  }
}
gruß lorenz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.02.2021, 15:23
Beitrag #5
RE: Tasterabfrage funktioniert nicht
Hallo Lorenz

Vielen Dank, das war es. Logisches Denken ist scheinbar nicht gleich logisch programmieren.
Ich bin davon ausgegangen, dass nachdem ein Taster gedrückt wird die If-Abfragen nochmal durchlaufen werden. Stimmt ja nicht - die While Schleife wird ja dann vorher schon beendet und die If Abfragen werden übersprungen und somit der Variablen Tastenstatus auch kein wert zugewiesen.

Hab´s geändert und läuft nun.
Jetzt kann ich erstmal weitermachen.

Danke
Dirk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Nano. Sketch kann nicht hochgeladen werden 4heiner 4 249 02.04.2021 17:21
Letzter Beitrag: 4heiner
  Programm startet bei Neustart nicht Moritzzz 18 561 02.04.2021 14:06
Letzter Beitrag: Tommy56
  Arduino Ampelschaltung Taster funktioniert nicht fatihakan36 9 657 13.03.2021 22:06
Letzter Beitrag: N1d45
  Library Ethernet: Nicht zu compilieren GuaAck 5 426 22.02.2021 17:31
Letzter Beitrag: Tommy56
  von delay auf millis umgestellt, klappt nur nicht. Servo Geschwindigkeit einstellen. gutschy 8 667 21.02.2021 15:22
Letzter Beitrag: gutschy
  MMega2560-Clone läßt sich nicht programmieren kpc 8 586 08.02.2021 09:50
Letzter Beitrag: hotsystems
  If-Schleife wird nicht mehr durchlaufen LK2567 2 376 05.02.2021 21:20
Letzter Beitrag: LK2567
  Judge Dredd 2012 Lawgiver funktioniert Thor Wallhall 8 681 28.01.2021 20:57
Letzter Beitrag: Sam Stag
  Kompiler beschwert sich nicht, LC-Display macht aber nicht, was es soll. generic_user492 3 402 26.01.2021 14:11
Letzter Beitrag: MicroBahner
  Arduino Uno+ Ethernetshield W5100 wird in Fritz Box nicht erkannt Justus S. 14 825 23.01.2021 13:39
Letzter Beitrag: Justus S.

Gehe zu:


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