fragen zur lcd mit tasten

Ich möchte gerne an meinem LCD display die tasten benutzen was auch soweit funktioniert. Jedoch habe ich eine taste zu wenig und mochte deshalb die tasten so belegen, das wenn ich z.b. die select taste und die up taste zusammen betätigte ich eine Funktion auslöse . Da die einzelnen tasten alle belegt sind. Ist das möglich und wenn ja, wie

Hallo, es müßte über die Pin´s gehen T1 T2 T3 T4

Grundeinstellung

wenn T1 high and T2,T3,T4 low wenn T2 high and T3,T4,T1 low wenn T3 high and T4,T1,T2low wenn T4 high and T1,T2,T3low dann

damit hättest Du 4 Funktionen

Grundeinstellung erweitert

wenn T1 high und T2 high

dann

müßte die 5 Funktion sein. Oder habe ich da einen Denkfehler? Gruß und Spaß Andreas

Ich schätze, wir sprechen hier über eine Widerstandsreihe, die je nach gedrücktem Taster über einen Analog-In ausgewertet wird. Richtig?
Wenn dem so ist und die Beschaltung einfach die Reihe abgreift gibt’s auch Zwischenwerte bei mehreren gedrückten Tastern. Wichtig wäre aber erst mal, den Aufbau zu kennen.

Also es ist ein UNO mit einem LCD 16x2 Schild mit 6 tasten select, rechts, links, auf, ab unter rst

Und hängen die alle am Analog-In? Sieht man ja am Sketch.

Es wäre sicher hilfreich zu wissen welches Shield malerlein da sein eigen nennt. Die Antworten sind von UNMÖGLICH (Tasten mit Spannungsteiler bei dem nur 1 Taste ausgelesen werden kann) bis "ist ganz einfach" wenn alle Tasten einzeln zu einem Eingang gehen. Grüße Uwe

Hallo Klaus

Die Tasten sind wie folgt programmiert

 mylcd.setCursor(0,1);            // move to the begining of the second line
 mylcd_key = read_mylcd_buttons();  // read the buttons

 switch (mylcd_key)               // depending on which button was pushed, we perform an action
 {
   case btnRIGHT: // Alarmzeit Morgens stellen
     {
     mzeit=mzeit+1;
     if (mzeit == 13) {mzeit=6;}
     if (stunden < 10) {mylcd.print("0");}
     mylcd.print(mzeit);
     mylcd.print(" Alarm Morgens");
     delay(50);
     break;
     }
   case btnLEFT: // Alarmzeit Abens stellen
     {
     azeit=azeit+1;
     if (azeit == 23) {azeit=13;}
     if (stunden < 10) {mylcd.print("0");}
     mylcd.print(azeit);
     mylcd.print(" Alarm Abends ");
     delay(50);
     break;
     }
   case btnUP: //Minuten vorstellen
     {
     minuten=minuten+1;
     delay(50);
     Serial.print(minuten);
     Serial.println("");
     break;
     }
   case btnDOWN: //Minuten zurückstellen
     {
     minuten=minuten-1;
     delay(50);
     Serial.print(minuten);
     Serial.println("");
     break;
     }
   case btnSELECT: // Pillen Anahl bei Auffüllung
     {
      merk=16;
      noTone(alarmpin);
      Serial.print(merk);
      delay(50);
      break;
     }
     case btnNONE:// Controller Resetten
     {
      //Serial.print("     Resett    ");
      delay(50);
      break;
     }
 }

Da sieht man prima, wie die Buttons abgefragt werden …

Hm, Jürgen... Da kann man gar nix erkennen. Wahrscheinlich hast du eine extra Lib für die Anzeige-Buttons-Kombi oder? Der Schaltplan wäre da gut, oder jemand muss mal die Lib auseinander nehmen-dem Programmstückchen da kann mans wirklich nicht entnehmen.

Ja Klaus, das ist ja auch soweit so Gut, das habe ich a so programiert geht auch super, nur mir fehlt jetzt noch ein oder 2 Tasten wo ich das Datum mit umstellen kann. Und ich weis nicht wie das geht das man sagen wir einmal die select taste gedrückt haällt und eine andere Taste noch drückt um damit dann das Datum um zu stellen, wie man das abfragt.

die Lib ist LiquidCrystal.h und die Tastatur ist laut Angaben der LCD nur über A0 beschaltet

Lass mich raten: du hast ein solches Shiled http://www.dfrobot.com/wiki/index.php?title=Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)
So in etwa steht es dann in der Lib

// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor 
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 450)  return btnDOWN; 
 if (adc_key_in < 650)  return btnLEFT; 
 if (adc_key_in < 850)  return btnSELECT;  

 // For V1.0 comment the other threshold and use the one below:
/*
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;   
*/


 return btnNONE;  // when all others fail, return this...
}

Es sollte hier möglich sein, Zwischenwerte zu definieren, wenn 2 Tasten gedrückt sind. Einfach mal A0 auslesen.
Edit: die Taste mit dem niedrigeren Widerstand bestimmt den Wert des Spannungsteilers. Funktioniert also nicht, was du vorhast.

Jedoch habe ich eine taste zu wenig

Diese Anforderung sollte man ändern in "Ich möchte unterscheiden, ob die SELECT Taste kurz oder lang gedrückt wird" Das ist auch von der Bedienung her weniger fummelig.

(Problem: "kurz" erkennt man erst wenn sie wieder losgelassen wurde, und zu kurz heisst normalerweise "prellen")


Ausserdem hast du noch den RST Taster ;) ;)

Ich würde dir empfehlen das in 2 Ebenen zu programmieren. z.B. btnRIGHT Taste gedrückt -> Alarmstellmodus (1. Ebene) btnRIGHT Taste -> Alarm morgens (2. Ebene) oder btnLEFT Taste -> Alarm abends

erni-berni

Das habe ich jetzt gelöst, nicht das ich jetzt 2 Tasten benutzen kann sondern ich wollte die uhrzeit stellen und das Datum stellen. dafür habe ich jetzt 2 tasten belegt. Meine Frage wäre nun kann ich irgend eine taste auch 2x im Sketch ansprechen wo sie unterschiedliche Funktionen ausführt. sagen wir einmal im anfang wenn der Sketch gestartet wird möchte ich gerne mit einer taste eine Eingabe also Hoch zählen und dadurch ein Array produzieren. dann wenn der Sketch weiter durch gelaufen ist und im Loop ausgeführt wird möchte ich die Gleiche Taste für eben die schon Programmierten Funktionen benutzen. Man müsste doch die Tasten Abfrage auf null setzen können um die Taste für was anderes zu verwenden. oder geht so etwas nicht.

ich hoffe ich habe mich so ausgedrückt das man es versteht was ich eine.

Hallo, setze doch einen Zähler: wenn Zähler=0 Taste mache Code 1 Zähler=1

wenn Zähler=1 Taste mache Code 2 Zähler=0 sollte funktionieren. Gruß und Spaß Andreas

Danke Andreas, das probiere ich nachher einmal aus. Denn ich habe es schon mit:

 case btnUP:
     
        if (millis() - lastMillis >= 100) {
	lastMillis = millis();
     	count++;
	if (count == 1) 
        {
          tg=tg+1;
                    mylcd.setCursor(0,0);
                     mylcd.print("Datum Stellen ");
                     mylcd.setCursor(0,1);
                     mylcd.print(tg);
                     mylcd.print(":");
                     mylcd.print(mo);
                     delay(50);
                             
        }
                     
	else if (count == 2) 
        {
         st=st+1;
                    mylcd.setCursor(0,0);
                     mylcd.print("UHR Stellen   ");
                     mylcd.setCursor(0,1);
                     mylcd.print(st);
                     mylcd.print(":");
                     mylcd.print(mi);
                    delay(50);
        }
	break;

probiert aber das bekomme ich nicht richtig hin, da der sketch dann bei jedem tastendruck durch läuft.

SkobyMobil: setze doch einen Zähler: wenn Zähler=0 Taste mache Code 1 Zähler=1

wenn Zähler=1 Taste mache Code 2 Zähler=0

Schau dir mal enums an. Damit wird sowas viel lesbarer, da man richtige Namen für etwas hat, das im Hintergrund lediglich eine Zahl ist. Vor allem wenn man mehr als zwei Zustände hat.

Ein sketch läuft andauernd und nur durch die Abfrage

if (millis() - lastMillis >= 100) 
{
   lastMillis = millis();
   // dies hier kommt nur alle 100 ms einmal dran
}

wird der innere Teil meist übersrpungen so dass er effektiv alle 100 ms einmal dran kommt. Wenn du zuerst tg um 1 erhöhst, wird 100 ms später st hochgezählt. Das willst du sicher nicht ;) Danach passiert nichts mehr, was man in deinem Teilstück sehen könnte. (ist count überhaupt irgendwo definiert ?).

möchte ich gerne mit einer taste eine Eingabe also Hoch zählen und dadurch ein Array produzieren

Das ist mir allerdings unverständlich. Was meinst du mit Array ?

Hallo, hiermit kannst Du hochzählen:

valZS1 = digitalRead(S1);             
if (valZS1 != buttonStateS1) 
{                                     
if (valZS1 == LOW) 
{                                      
buttonPressesS1++;                         
}
} 
buttonStateS1 = valZS1;

 if (buttonPressesS1 > 9)
{
buttonPressesS1 = 0;
}

mit hochzählen kannst Du kein Array erzeugen. Das mußt Du vorher machen. Dann- schreibst Du dort Deine gezählte Zahl rein. Denke an die 0 (null) im Array. Gruß und Spaß Andreas