Variablen über LCD Keypad ändern

Hi

Ich bastele schon einige Zeit mit diversen Arduinos rum.

Doch jetzt zum ersten mal mit Display.

zur Zeit läuft auf einem ein etwas verändertet Wechselblinker.
Ich würde jedoch gerne ein SainSmart LCD Keypad Shield daran betreiben und über die Tasten die Laufzeit und die Pause verändern können.

Leider kann ich dazu nirgendwo etwas finden.

Mein Bisheriger Sketch:

// Laufzeit hier einstellen (ms)


int laufzeit = 3200;
int pause = 8000;






int links = 9;  
int rechts = 10;




void setup() {                
  pinMode(links, OUTPUT);
  pinMode(rechts, OUTPUT);  
//    Serial.begin(9600);
}

void loop() {
  digitalWrite(links , HIGH);// schaltet links ein
  delay(laufzeit);               // Strom für x Sekunden (Millisekunden)
  digitalWrite(links, LOW);    // schaltet links aus 
  delay(pause);               // pause für x sekunden 
  digitalWrite(rechts, HIGH);  // schaltet rechts rechts ein 
  delay(laufzeit);               // Strom für s Sekunden 
  digitalWrite(rechts, LOW);  // schaltet die rechts aus 
  delay(pause);               // pause für x Sekunde 

}

Es wäre toll wenn mir da jemand helfen könnte .....

Hallo,
nimm erst einmal das delay() da raus. Mache das mit millis()

Was suchst Du denn? Das Shield, die Tasten oder eine Sketch zum hochzählen, wenn eine Taste gedrück wird?
So einen Sketch findest Du im Forum.
Gruß und Spaß
Andreas

Das ist mit etwas eigeninitiative lösbar. Mach es erst einmal so wie Skoby sagte. Danach lieste 2 Potis ein zum Einstellen der Zeiten. Wenn das klappt, kannst du dich an das Programm fürs Display machen. Im Endeffekt ist es recht trivial. Aber ohne die Grundkenntnisse von millis() wird dein Display dann flackern :wink:

Auf den Display gibst du deinen Zähler i aus. Mit je 2 Tasten erhöhst du den Wert um x. Fertig.

Hi

Danke für die Antworten.

Ich suche die einfachste möglichkeit über die tasten unabhängig von einander die Werte von "Laufzeit" und "pause" hoch und runter zu ändern

Hallo,
kannst das ja mal Probieren:

/* * Tastendrücke zählen */   
int switchPin = 25;                     // Schalter ist mit Pin 25 verbunden 
int val;                                // Variable für den Pin Zustand 
int buttonState;                        // Variable für den letzten Schalterzustand 
int buttonPresses = 0;                  // Wie oft ist der Schalter gedrückt   


const int LED = 13;
//int zstS1=1;

 


void setup() 

{
pinMode(LED, OUTPUT);

digitalWrite(LED, LOW);

 pinMode(switchPin, INPUT);            // Schalter-Pin ist Input   
Serial.begin(19200);                     // Start der seriellen Kommunikation mit 9600bps 
buttonState = digitalRead(switchPin);   // Anfangszustand lesen
}    
void loop()
{ 
 val = digitalRead(switchPin);           // Eingabewert lesen und in val speichern   
if (val != buttonState) 
{                                       // Der Zustand des Schalters hat sich verändert 
if (val == LOW) 
{                                       // Ist der Schalter gedrückt? 
buttonPresses++;                         // Inkrementieren der Variablen buttonPresses 
Serial.print("Schalter wurde "); 
Serial.print(buttonPresses); 
Serial.println(" gedrueckt"); }
} buttonState = val;  // Den Zustand merken 
if (buttonPresses == 5)
{digitalWrite(LED, HIGH);}
if (buttonPresses == 10)
{digitalWrite(LED, LOW);}
}

mit einem zweiten Taster machst Du aus diesem (buttonPresses++; ) das, buttonPresses--;
oder
wenn zweiter Taster, dann "buttonPresses = buttonPresses - 1"
Gruß und Spaß
Andreas

Ich habe das jetzt soweit am laufen mit

int laufzeit = 6500 ;
int pause = 5000 ;

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);




int links = 2;  
int rechts = 3;




void setup() {                
  pinMode(links, OUTPUT);
  pinMode(rechts, OUTPUT);  
//    Serial.begin(9600);
 
 
  lcd.clear();
lcd.begin(16, 2);
  
  
  lcd.setCursor(0, 0);
lcd.print("Hello, World!");

  

}

void loop() {
  
  
  delay (800);
  lcd.clear();      // LCD löschen 
  
  lcd.setCursor(0,0);        // 0. Spalte (= ganz links) und 0. Zeile (= oben) 
  lcd.print("Laufzeit"); 
  lcd.setCursor(9,0);
  lcd.print("Pause");   
  
  
  lcd.setCursor(0,1); 
  lcd.print(laufzeit);   
  lcd.setCursor(5,1); 
  lcd.print("ms");  
  
 lcd.setCursor(9,1);
  lcd.print(pause);  
  lcd.setCursor(14,1); 
  lcd.print("ms");  
  
  
  
     int x;
  x = analogRead (0);
if (x < 60) {
    pause += 100;
  }
  else if (x < 200) {
    laufzeit += 100;
  }
  else if (x < 400){
    laufzeit -= 100;
  }
  else if (x < 600){
    pause -= 100;
  }
   
  
  
  
 [glow=yellow,2,300][b] digitalWrite(links , HIGH);// schaltet links ein
  delay(laufzeit);          // Strom für x Sekunden (Millisekunden)
  digitalWrite(links, LOW);    // schaltet links aus 
  delay(pause);               // pause für x sekunden 
  digitalWrite(rechts, HIGH);  // schaltet rechts rechts ein 
  delay(laufzeit);               // Strom für s Sekunden 
  digitalWrite(rechts, LOW);  // schaltet die rechts aus 
   delay(pause);               // pause für x Sekunde [/b][/glow]
  

  

  
}

nur leider "blockiert" das delay für den markierten Schaltbefehl die Eingabe über die Tasten.

Ich müsse das delay ersetzen nur hab ich keine Ahnung wie das mit millis() funktioniert

Siehe hier:

void loop()
{
    static unsigned long previousMillis;

    if(millis() - previousMillis > 800)
    {
         previousMillis = millis(); 

          ....
    }
}

Du kannst/musst dann noch Status-Variablen einführen und diese mit && verknüpfen, so dass die Abfrage nur gemacht wird, wenn der vorherige Zustand ausgeführt wurde. Wenn die Verzögerung dann vorbei ist und der Pin geschaltet wurde, in den nächsten Zustand wechseln.

lcd.clear() ist übrigens auch nicht so gut. Das dauert ziemliche lange und damit flackert oft das Display. Besser man überschreibt nur was sich tatsächlich ändert.

Serenifly:
Siehe hier:
http://arduino.cc/en/Tutorial/BlinkWithoutDelay

ich habs mal versucht.

Zu Testzwecken habe ich an den einen Geschalteten Pin eine rote an den anderen eine grüne LED angebracht

Die laufzeit lässt sich einstellen ABER es schaltet nur die grüne ein für die dauer der laufzeit aber er hält die pause nicht ein und schaltet auch die rote LED nicht ein

  digitalWrite(links, LOW);    // schaltet links aus 
 if(currentMillis - previousMillis > pause) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;  
  digitalWrite(rechts, HIGH);  // schaltet rechts rechts ein 
 if(currentMillis - previousMillis > laufzeit) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;  
    digitalWrite(rechts, LOW);  // schaltet die rechts aus 
     if(currentMillis - previousMillis > pause) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;

Du brauchst wie gesagt eine kleine State Machine, damit die Abfragen nicht in jedem Durchlauf gemacht werden sondern hintereinander.

z.B.:

enum states { LINKS, RECHTS, AUS };
states currentState = LINKS;

void loop()
{

  if(currentState == LINKS && currentMillis - previousMillis > pause)
  {
      previousMillis = currentMillis;  
      digitalWrite(rechts, HIGH);

      currentState = RECHTS;
  }
  else if(currentState == RECHTS && .....)
  {
  }
}