ich bin realtiv neu in der Arduino Welt und bräuchte mal etwas Hilfe.
folgendes:
ich habe bis jetzt einen Taster mit dem ich mittels millis Leuchtmodis einstelle also einmal drücken 1 Sekunde pause nochmal drücken halbe Sekunde usw. ( nicht selber geschrieben aber verstanden )
jetzt möchte ich aber wenn ich den Taster einmal drück die led 1 Sekunde leucht wenn ich den Taster mal hintereinander drücke soll er ne halbe sekunde leuchten und 3 mal drücken 100ms.
hat jemand da ne Idee oder sogar einen Beispielcode?
danke schon mal:))
// Konstanten
const int tasterPin = 2; // Pin Nummer des Tasters
const int ledPin = 3; // Pin Nummer der LED des Arduinos
// Variablen
int tasterStatus = LOW; // aktuelles Signal vom Eingangspin
int tasterGedrueckt = 0; // abfragen ob Taster gedrückt war
int lichtmodus = 0; // festlegen der verschiedenen Lichtprogramme
int ledStatus = LOW; // aktueller Zusatnd der LED
int entprellZeit = 200; // Zeit für Entprellung, anpassen!
unsigned long tasterZeit = 0; // Zeit beim drücken des Tasters
unsigned long ledMillis = 0; // Zeit für den Blinkrythmus der LED
void setup()
{
pinMode(ledPin, OUTPUT); // LED Pin wird als Ausgang gesetzt
pinMode(tasterPin, INPUT); // Taster Pin wird als Eingang gesetzt
}
void loop()
{
// Lesen des tasterPin
tasterStatus = digitalRead(tasterPin);
// Wenn der Taster gedrückt ist...
if (tasterStatus == HIGH)
{
tasterZeit = millis(); // aktualisiere tasterZeit
tasterGedrueckt = 1; // speichert, dass Taster gedräckt wurde
}
// Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
if ((millis() - tasterZeit > entprellZeit) && tasterGedrueckt == 1)
{
lichtmodus++; // lichtmodus wird um +1 erhöht
tasterGedrueckt = 0; // setzt gedrückten Taster zurück
}
***************************Leuchtprogramme************************************
// Wenn Lichtmodus 0 ist, blinke im 1000ms Rythmus
if (lichtmodus == 0)
{
// Wenn 1000ms vergangen sind...
if (millis() - ledMillis > 1000)
{
ledStatus = !ledStatus; // kehre den letzten LED Zustand um (z.B LOW -> HIGH)
digitalWrite(ledPin, ledStatus); // Ausgabe am LED Pin
ledMillis = millis(); // beginne die Zeitzählung von vorne
}
}
// Wenn Lichtmodus 1 ist, blinke im 500ms Rythmus
else if (lichtmodus == 1)
{
// Wenn 500ms vergangen sind...
if (millis() - ledMillis > 500)
{
ledStatus = !ledStatus; // kehre den letzten LED Zustand um (z.B LOW -> HIGH)
digitalWrite(ledPin, ledStatus); // Ausgabe am LED Pin
ledMillis = millis(); // beginne die Zeitzählung von vorne
}
}
// Wenn Lichtmodus 2 ist, blinke im 250ms Rythmus
else if (lichtmodus == 2)
{
// Wenn 250ms vergangen sind...
if (millis() - ledMillis > 250)
{
ledStatus = !ledStatus; // kehre den letzten LED Zustand um (z.B LOW -> HIGH)
digitalWrite(ledPin, ledStatus); // Ausgabe am LED Pin
ledMillis = millis(); // beginne die Zeitählung von vorne
}
}
// Wenn Lichtmodus 3 ist, leuchte durchgehend
else if (lichtmodus == 3)
{
digitalWrite(ledPin, HIGH); // LED leuchtet
}
// Wenn Lichtmodus 4 ist, LED aus
else if (lichtmodus == 4)
{
digitalWrite(ledPin, LOW); // LED ist aus
}
// Wenn der Lichtmodus auf 5 sprngt, setzte ihn wieder zurück auf 0 um von vorne zu beginnen
else
{
lichtmodus = 0;
}
}
combie:
Tipp:
"Endlicher Automat" ist das Stichwort, nach dem du suchen solltest
gut endlicher Automat ist ein wer hätte es gedacht ein Automat der unendliche Zustände hat und ein Übergang nur durch eine Eingabe stattfindet (habe eine Ampelschaltung als bsp. gefunden). Aber ich versteh nicht ganz wie mir das weiter hilft ? ich meine zustände habe ich ja auch also meine leuchtmodis die ja auch nur durch Taster drücken einen Übergang hat also ist das doch genau das was ich habe oder versteh ich das falsch ?
Mahimus:
Du willst also, dass die LED nach der Eingabe per Taster nur ein mal leuchtet, und zwar für die gewählte Dauer?
nein ich möchte das so haben :
1x taste drücken sagen wir mal vereinfacht Programm 1 soll ausgeführt werden
2x hintereinander taste drücken Programm 2 soll aufgeführt werden
3x hintereinander taste drücken Programm 3 soll ausgeführt werden
jetzt ist es nämlich so ich drücke die taste und er führt das Programm aus drücke ich 3x weil ich Programm 3 haben will durchläuft er ja auch 1 und 2 und das möchte ich umgehen
mit einem PAP hab ich mich einmal beschäftigt ich glaube wenn ich einen mache seid ihr noch verwirrter ich hoffe meine Antwort war verständlich
1x taste drücken sagen wir mal vereinfacht Programm 1 soll ausgeführt werden
2x hintereinander taste drücken Programm 2 soll aufgeführt werden
3x hintereinander taste drücken Programm 3 soll ausgeführt werden
jetzt ist es nämlich so ich drücke die taste und er führt das Programm aus drücke ich 3x weil ich Programm 3 haben will durchläuft er ja auch 1 und 2 und das möchte ich umgehen
Dann brauchst du einen nichtdeterministischen endlichen Automaten!
Denn er muss beim ersten Tastendruck 3 potentielle Zustände erkennen.
Beim 2ten sind es dann nur noch 2 mögliche Zustände.
usw.
Erst wenn die möglichen/potentiellen Zustände auf einen reduziert sind, hat der Automat einen deterministischen/eindeutigen Zustand erreicht, und es ist klar, welche Funktion ausgeführt werden muss.
Also wird hier auch ein Zeitdiagramm gemalt werden müssen.
(wenn man es nicht im Kopf abhandeln kann)
Ich würde halt einfach nach jedem Tastendruck (außer dem dritten) eine gewisse Zeit warten ob noch was kommt (und sonst nichts tun lassen). Dabei eine Variable hochzählen nach dem Schema "if Taster, dann ++i". Danach dann if-Abfragen: "if i = 1, dann Programm 1"
Wenn du die Verwendung von millis verstanden hast solltest du dir so etwas erarbeiten können. Viel Erfolg und wenn die ersten Versuche nicht funktionieren zeig einfach was du hast.
Mahimus:
Danach dann if-Abfragen: "if i = 1, dann Programm 1"
Wenn du die Verwendung von millis verstanden hast solltest du dir so etwas erarbeiten können. Viel Erfolg und wenn die ersten Versuche nicht funktionieren zeig einfach was du hast.
Wenn Du den Unterschied zwischen = und == verstanden hast, kannst Du das ja nochmal versuchen.
Mahimus:
Wenn du die Verwendung von millis verstanden hast solltest du dir so etwas erarbeiten können.
naja ich hab das schon verstanden was millis macht und auch mit meinem Code aber ob ich jetzt einfach so was zusammenbasteln kann weiß ich nicht. hab heute das erste mal von millis gehört. ich dachte delay wäre der letzte schrei
Wenn der entprellte Taster gedrückt (oder losgelassen) wird, inkrementierst Du den Zähler und startest eine Zeit. Läuft die Zeit ab, startest Du den zum Zähler passenden Programmteil und setzt den Zähler auf 0.
Bei einem nicht entprellten Taster darfst Du während der Prellzeit nicht zählen.
Tommy56:
Wenn Du den Unterschied zwischen = und == verstanden hast, kannst Du das ja nochmal versuchen.
Gruß Tommy
Wenn du den Unterschied zwischen Code und Pseudocode verstanden hast kannst du wieder versuchen an meinen Aussagen rum zu meckern.
An Mr. Proton: Natürlich ist es richtig, dass zwischen = und == ein Unterschied besteht, das ist in "deinem" Code oben ja auch richtig verwendet. Ich hoffe du hast verstanden, dass ich dir nur einen groben Ablauf geben wollte, ohne dabei schon einen lauffähigen Code zu liefern. Es war offenbar nicht so offensichtlich wie ich dachte. Als Tipp: Schau dir ein paar der zahlreichen Tutorials an und versuch auch mal einen einfachen Code (einfach nur LED mit millis() blinken lassen z.B.) von Grund auf selbst zu schreiben.
Tommy56:
Gerade bei Antworten an Anfänger sollte man auch bei sogenanntem "Pseudocode" solche wesentlichen Unterschiede beachten.
Gruß Tommy
Da würde ich dir sogar Recht geben und ich versuche in Zukunft daran zu denken. Nächstes mal den Hinweis nur bitte ohne einen Vorwurf, z.B. dass etwas Einfaches nicht verstanden wäre.