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
4 Tasten für 4 Laufzeiten des gleichen Programms
16.07.2016, 16:45
Beitrag #1
4 Tasten für 4 Laufzeiten des gleichen Programms
Hallo,
wenn man nicht permanent mit dem Arduion arbeitet, dann bleibt man an den einfachsten Aufgaben stecken - so bei mir:
Ich möchte ein Programm für vier unterschiedliche Laufzeiten ablaufen lassen. Dazu gibt es eine Folientastatur mit vier Tasten - Taste 1 = 1s, Taste2=2s usw.
Da ich keine zusätzlichen Widerstände dazubauen will, verwende ich die internen Pull-Ups.
Zum einfachen Üben und Austesten soll als Programm nur die LED13 für die unterschieldichen Laufzeiten leuchten - tut es aber nicht.
Zugegeben, mit den Millis hab ich es nicht so.Blush
Mein bisheriger Versuch - aber nicht lachen Sad

Code:
const int ledPin =  13;      
int interval = 0;
unsigned long interval1 = 1000; //Laufdauer 1 mit 1s
unsigned long interval2 = 2000; // laufdauer 2 mit 2s
unsigned long interval3 = 3000;// Laufdauer 3 mit 3s
unsigned long interval4 = 4000; // Laufdauer 4 mit 4s
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit der letzten Änderung vergangen sind

void setup()  
{    
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
}
void loop()
{
  int buttonState1 = (digitalRead(2));
  int buttonState2 = (digitalRead(3));
  int buttonState3 = (digitalRead(4));
  int buttonState4 = (digitalRead(7));
  if (buttonState1 == true && buttonState2 == false && buttonState3 == false && buttonState4 == false, interval1); // Abfrage Taster Nummer 1 - nur gültig, wenn kein anderer Taster gedrückt ist
   if (buttonState1 == false && buttonState2 == true && buttonState3 == false && buttonState4 == false, interval2);
   if (buttonState1 == false && buttonState2 == false && buttonState3 == true && buttonState4 == false, interval3);
    if (buttonState1 == false && buttonState2 == false && buttonState3 == false && buttonState4 == true, interval4);
  interval = interval1 && interval2 && interval3 && interval4;
if (millis() - previousMillis>interval){
digitalWrite(13, HIGH);}  
}
Wo liegt der logische Fehler?

VD

------------------------------------------------------------------------------------------
Ein Teufelskreis: Kaum macht man es richtig,funktionierts!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2016, 17:30 (Dieser Beitrag wurde zuletzt bearbeitet: 17.07.2016 01:06 von Scheams.)
Beitrag #2
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Hey!

Hier sind ein paar Fehler Blush

Also:
If-Abfragen:
Code:
if (condition) { }
NICHT:
Code:
if (condition, ?Variable setzten?) { }

D.h. für deine 1. If-Abfrage:
Code:
if (buttonState1 == true && buttonState2 == false && buttonState3 == false && buttonState4 == false) interval  = interval1;
usw.

Code:
interval = interval1 && interval2 && interval3 && interval4;
Was ist das? && sind boolsche Operatoren dh sie sind 1 oder 0 und somit deine Variable "interval" 1 oder 0. Wenn dann zusammen rechnen? interval = intervalx + ...

Millis Schleifen gehen so:
Code:
if (millis() - previousMillis > interval) {
    // etwas tun
    previousMillis = millis();
}

Da bei dir aber nur die LED 13 einmal auf HIGH gesetzt wird, nie auf LOW wird sie immer leuchten. Außerdem müsstest du einen Status definieren, dass ein Taster gedrückt wurde und dann soll die LED soundsoviele Millisekunden leuchten. Außer du willst eine blinkende LED mit verschiedenen Intervallen, dann musst du in deiner Millis-Schleife die LED immer umschalten:
Code:
if (millis() - previousMillis > interval) {
    digitalWrite(13, digitalRead(13)); // umschalten ein/aus
    previousMillis = millis();
}

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.07.2016, 07:53
Beitrag #3
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Moin Scheams,
danke für Deine Antwort und ich habe versucht die Empfehlungen um- und einzusetzen:
Code:
const int ledPin =  13;      
int interval = 0;
unsigned long interval1 = 1000; //Laufdauer 1 mit 1s
unsigned long interval2 = 2000; // laufdauer 2 mit 2s
unsigned long interval3 = 3000;// Laufdauer 3 mit 3s
unsigned long interval4 = 4000; // Laufdauer 4 mit 4s
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit der letzten Ändeung vergangen sind

void setup()  
{    
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
}
void loop()
{
  int buttonState1 = (digitalRead(2));
  int buttonState2 = (digitalRead(3));
  int buttonState3 = (digitalRead(4));
  int buttonState4 = (digitalRead(7));
  if ((buttonState1 == false) && (buttonState2 == true) && (buttonState3 == true) && (buttonState4 == true)) interval = interval1;
  //In unbetätigten Fall = true, Bei Druck des Tasters false; Abfrage Taster Nummer 1 - nur gültig, wenn kein anderer Taster gedrückt ist
  if ((buttonState1 == true) && (buttonState2 == false) && (buttonState3 == true) && (buttonState4 == true)) interval = interval2;
  if ((buttonState1 == true) && (buttonState2 == true) && (buttonState3 == false) && (buttonState4 == true)) interval = interval3;
  if ((buttonState1 == true) && (buttonState2 == true) && (buttonState3 == true) && (buttonState4 == false)) interval = interval4;

if (millis() - previousMillis > interval){
digitalWrite(13, HIGH);}
else
{digitalWrite(13, LOW);}
previousMillis=millis();}
Jetzt glimmt zu Beginn die LED ganz leicht und erlischt beim Drücken eines Tasters.
Also nicht das, was es soll!
Was habe ich denn jetzt noch übersehen?

------------------------------------------------------------------------------------------
Ein Teufelskreis: Kaum macht man es richtig,funktionierts!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.07.2016, 09:09
Beitrag #4
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Prüfe doch als erstes, ob die 4 Buttons überhaupt richtig erkannt werden.

Serial.print(buttonState1);
Serial.print(buttonState2);
Serial.print(buttonState3);
Serial.println(buttonState4);

Wenn das schonmal sauber reinkommt, kannst Du die Hardware schonmal als tauglich werten.


Dann weiter in der letzen IF:

Lass Dir die Parameter per Serial.Print() anzeigen.
Jetzt kannst Du erkennen, welche Bedingung erfüllt wird und was das Programm macht.

Wenn der Bildschirm zu schnell gefüllt wird, kannst Du den Programmablauf mit delay(500) etwas bremsen.
Dann reagiert es natürlich auch deutlich langsamer, sollte klar sein.

Jedenfalls kommst Du mit Serial.print schneller zum Ziel, als wenn Du hier den Code einstellst und darauf wartest, bis einer den Fehler findet.

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.07.2016, 12:30
Beitrag #5
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Hallo Binatone,
danke für den Tipp - stimmt schon...mit den Infos, die im serial monitor dargestellt werden, kann man sich langsam rantasten.
Also die Tasten wurden richtig eingelesen, und die LED fängt bei Tastendruck an zu leuchten, aber nur so lange die Taste gedrückt bleibt. Der Monitor zeigt die gewählte Zeitdauer, z.B. 3000 bei Taste 3 an, aber eine zeitrelevante Funktion startet nicht.
Code:
const int ledPin =  13;    
int ledState = LOW;
int interval=0;
unsigned long interval1 = 1000; //Laufdauer 1 mit 1s
unsigned long interval2 = 2000; // laufdauer 2 mit 2s
unsigned long interval3 = 3000;// Laufdauer 3 mit 3s
unsigned long interval4 = 4000; // Laufdauer 4 mit 4s
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit der letzten Änderung vergangen sind

void setup()  
{    
    Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
}
void loop()
{
  int buttonState1 = (digitalRead(2));
  Serial.println(buttonState1);
  int buttonState2 = (digitalRead(3));
  Serial.print(buttonState2);
  int buttonState3 = (digitalRead(4));
  Serial.print(buttonState3);
  int buttonState4 = (digitalRead(7));
  Serial.print(buttonState4);
  
  if ((buttonState1 == false) && (buttonState2 == true) && (buttonState3 == true) && (buttonState4 == true)) interval = interval1;
  //In unbetätigten Fall = true, Bei Druck des Tasters false; Abfrage Taster Nummer 1 - nur gültig, wenn kein anderer Taster gedrückt ist
  if ((buttonState1 == true) && (buttonState2 == false) && (buttonState3 == true) && (buttonState4 == true)) interval = interval2;
  if ((buttonState1 == true) && (buttonState2 == true) && (buttonState3 == false) && (buttonState4 == true)) interval = interval3;
  if ((buttonState1 == true) && (buttonState2 == true) && (buttonState3 == true) && (buttonState4 == false)) interval = interval4;

Serial.println(interval);
//delay(300);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval){
digitalWrite(13, LOW);}
else
  {digitalWrite(13, HIGH);  }
previousMillis=millis();
interval = 0;
}

Noch ein weiteres Problem: Wie kann ich ausschließen, dass wenn dann mal die Zeitfunktion startet, dass die Funktion bis zum Zeitende durchläuft und ein erneuter Tastendruck die Zeitfunktion nicht wieder bei Null starten läßt?
danke für Eure Tipps- ich lerne gerne dazu Smile

------------------------------------------------------------------------------------------
Ein Teufelskreis: Kaum macht man es richtig,funktionierts!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.07.2016, 14:52 (Dieser Beitrag wurde zuletzt bearbeitet: 17.07.2016 14:59 von Scheams.)
Beitrag #6
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Hey!

Code:
if (currentMillis - previousMillis >= interval){
digitalWrite(13, LOW);}
else
  {digitalWrite(13, HIGH);  }
previousMillis=millis();
interval = 0;
}

Geh das hier nochmal genau Schritt für Schritt durch und überleg:
1. Durchlauf: Kein Taster gedrückt, Interval = 0, CurrentMillis = z.B. 1000, previousMillis = 0
If Abfrage = true -> led LOW

2. Durchlauf: Taster 1 gedrückt, Interval = 1000, CurrentMillis = 1050, previousMillis = 1000
If Abfrage = falsch -> led HIGH

Wenn du weiter überlegst wird dieser 2. Durchlauf immer wiederholt, da previousMillis immer gesetzt wird, da es außerhalb der IF Schleife ist. Also irgendwas kann nicht stimmen.

Ich habe dir schon ein Beispiel gegeben, wie soeine Millis Schleife aussehen kann
(16.07.2016 17:30)Scheams schrieb:  ...
Millis Schleifen gehen so:
Code:
if (millis() - previousMillis > interval) {
    // etwas tun
    previousMillis = millis();
}
...
previousMillis wird IN der if Schleife gesetzt, nicht außerhalb!
Beachte diese Millis-Schleifen WIEDERHOLEN sich nach jedem interval.

Ich bin mir immer noch nicht sicher was die Funktion von dem Sketch sein soll.
- ein/mehrere Taster drücken -> Interval wird gesetzt
- LED leuchtet je nach Intervallänge, nachdem gedrückt wurde
- Warten auf nächsten Tastendruck
- Wenn während dem Leuchten gedrückt wird, wird die Leuchtdauer aktualisiert?
Bitte kurz mal beschreiben/korrigieren Smile

Ansonsten müsstest du soetwas machen:
Code:
// Wenn Taster gedrückt wurde, wird interval gesetzt, somit ist interval > 0 == true
if (interval > 0) {
    // Erster Durchlauf, LED ist noch LOW, die Startzeit wird gemerkt, und LED wird HIGH gesetzt. Bei den folgenden Durchläufen ist dieser IF falsch
    if (digitalRead(13) == LOW) {
        startTimer = millis();
        digitalWrite(13, HIGH);
    }
    // nach einer Zeit (interval) wird alles wieder zurückgesetzt
    if (millis() - startTimer > interval) {
        digitalWrite(13, LOW);
        interval = 0;
    }
}

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.07.2016, 15:54
Beitrag #7
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Also ich denke, Dein "interval = 0;" steht ein paar Zeilen zu tief.
Solange Deine LED leuchtet, läuft die Zeitschleife.
In dieser Zeit darf der Interval nicht verändert werden.
Bestenfalls durch erneutes Drücken einer der drei Tasten.

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.07.2016, 14:45
Beitrag #8
RE: 4 Tasten für 4 Laufzeiten des gleichen Programms
Erfolsmeldung!
Mit einem Mix aus den Tipps von Scheams und Binatone (vielen Dank) hat es nun geklappt!
Nur noch eine Frage: wie bekomme ich eine einmal gedrückte Tasteneingabe für weitere Tasteneingaben blockiert - außer einem zusätzlichen "Notstopp".
jetzt ist es so, dass die Intervalle alle wie gewünscht laufen, wenn aber während des Intervallablaufes eine Taste gedrückt wird, wird die zeit quasi aufaddiert. Wie kann das verhindert werden?
Code:
const int ledPin =  13;
int ledState = LOW;
int interval=0;
unsigned long interval1 = 1000; //Laufdauer 1 mit 1s
unsigned long interval2 = 2000; // laufdauer 2 mit 2s
unsigned long interval3 = 3000;// Laufdauer 3 mit 3s
unsigned long interval4 = 4000; // Laufdauer 4 mit 4s
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit der letzten Änderung vergangen sind
unsigned long startTimer;
void setup()
{
    Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
}
void loop()
{
  int buttonState1 = (digitalRead(2));
  int buttonState2 = (digitalRead(3));
  int buttonState3 = (digitalRead(4));
  int buttonState4 = (digitalRead(7));

  if ((buttonState1 == false) && (buttonState2 == true) && (buttonState3 == true) && (buttonState4 == true)) interval = interval1;
  //In unbetätigten Fall = true, Bei Druck des Tasters false; Abfrage Taster Nummer 1 - nur gültig, wenn kein anderer Taster gedrückt ist
  if ((buttonState1 == true) && (buttonState2 == false) && (buttonState3 == true) && (buttonState4 == true)) interval = interval2;
  if ((buttonState1 == true) && (buttonState2 == true) && (buttonState3 == false) && (buttonState4 == true)) interval = interval3;
  if ((buttonState1 == true) && (buttonState2 == true) && (buttonState3 == true) && (buttonState4 == false)) interval = interval4;

unsigned long currentMillis = millis();
if (interval > 0) {
    // Erster Durchlauf, LED ist noch LOW, die Startzeit wird gemerkt, und LED wird HIGH gesetzt. Bei den folgenden Durchläufen ist dieser IF falsch
    if (digitalRead(13) == LOW) {
        startTimer = millis();
        digitalWrite(13, HIGH);
    }
    // nach einer Zeit (interval) wird alles wieder zurückgesetzt
    if (millis() - startTimer > interval) {
        digitalWrite(13, LOW);
        interval = 0;
    }
}
}

------------------------------------------------------------------------------------------
Ein Teufelskreis: Kaum macht man es richtig,funktionierts!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Question Keine Verbindung via USB nach flashen des Programms chaoscrack 5 204 23.08.2016 14:58
Letzter Beitrag: hotsystems
  2 Tasten drücken damit licht angeht tjard 11 555 19.06.2016 12:24
Letzter Beitrag: hotsystems
  SainSmart 1602 LCD Keypad Shield Modul Display Tasten Rossy 20 3.073 08.08.2015 12:44
Letzter Beitrag: hotsystems
  Tasten prellen StephanBuerger 10 2.014 11.02.2015 10:11
Letzter Beitrag: Thorsten Pferdekämper
  Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten Marlox 42 6.617 28.12.2014 22:49
Letzter Beitrag: Marlox
  Start + Stop Tasten für Schrittmotor Dortmunder85 3 7.452 27.08.2013 17:51
Letzter Beitrag: rkuehle

Gehe zu:


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