Hallo!
Ich bin absoluter Programmier-Anfänger und hab keine Ahnung wie ich
meine Fehler beheben kann.
Der Code ist im Anhang.
Ich bin momentan am Programmieren von eimer RC-Lichtanlage.
Die Schaltung der einzelnen LED's soll über einen 1-0-1 Taster an der
Funke gesteuert werden, das Funktioniert auch fast gut.
Das Problem ist wenn ich den Taster gedrückt halte wird die Variable SM
jedesmal um 1 veränder. das macht ein genaues wählen der gewünschten
Beleuchtungsart fast zum russischen Roulette.
Was ich möchte ist das ich den Taster gedrückt halten kann und die
Variable um 1 verändert wird, danach muss ich den Taster erneut drücken
um die Variable wieder um 1 zu verändern.
ich hoffe das ganze ist verständlich was ich genau möchte :D
Gruß
hmpfknpf
1
intch4;//Der Kanal den man auslesen möchte
2
intStandlichtL=13;//Pin für das Standlicht links
3
intStandlichtR=5;//Pin für das Standlicht rechts
4
intAbblendlichtL=10;//Pin für die Bi-Xenoneinheit links
5
intAbblendlichtR=11;//Pin für die Bi-Xenoneinheit Rechts
6
intSM=0;//Merker für Standlicht an oder aus
7
intAM=0;//Merker für Abblendlicht an oder aus
8
intANZ=3;//Anzahl der Schaltstufen des Lichtschalters
9
inti;
10
intdel=20;//Pause wird benötigt für das Aufdimmen vom Xenon
11
inthelligkeit=90;//Helligkeit des Abblendlichts
12
intdim=10;//Schritte für das Aufdimmen vom Xenon
13
14
voidsetup()
15
{
16
pinMode(7,INPUT);//Pin 7 Eingang z Auswerten d Funksignals
Christian Kern schrieb:> if (ch4 >1700)> {> ++SM;> }> if (ch4 <1100)> {> --SM;> }
Ich habe zwar nicht viel Ahnung von dem Arduino Zeug und vermute, dass
du hier die Tasten einließt, aber versuchs mal so:
1
if((ch4>1700)&&(ch4_old<1700))
2
{
3
++SM;
4
}
5
if((ch4<1100)&&(ch4_old>1100))
6
{
7
--SM;
8
}
9
ch4_old=ch4;
P.S. In "Projekte & Code" bist du Falsch:
Beschreibung "Projekte & Code":
> Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel> vorstellen und diskutieren. Bitte hier keine Fragen posten!
Hallo Max
Danke für die Idee aber ich habs grade probiert aber da kommt nix raus
Was funktioniert.
Habe gerade den Hinweiß bekommen ich solle mit Timern arbeiten??
Hat da jmd vielleicht ne idee?
Ich weiß echt nicht nach was ich googeln soll..
kopfkratz
Dann brauchst Du noch eine Variable die Dir anzeigt das der Knopf
schonmal gedrückt worden ist, sobald dann der Taster losgelassen wird
setzt Du die Variable zurück.
Schau mal in die Doku von Deinem Arduino-Sketch, wenn es da sowas wie
PeDas Tastenentprellung mit einzel und dauer gibt einfach Deinen Code
auf einzelne Taster Events anpassen ...
Habe ich das eigentlich richtig verstanden, dass die Taste mit
> ch4 = pulseIn(7, HIGH, 11000);
eingelesen und dann mit
> if (ch4 >1700)> {> ++SM;> }> if (ch4 <1100)> {> --SM;> }
abgefragt wird?
Und die Taste hängt nicht direkt an µC sondern über eine Fernsteuerung?
Max H. schrieb:> Und die Taste hängt nicht direkt an µC sondern über eine Fernsteuerung?
Es ist recht unüblich, daß eine FB nur einen Puls sendet. Die Gefahr
einer Fehlerkennung ist viel zu groß. Auch hat dann die AGC des
Empfängers keine Möglichkeit, sich auf das Signal einzuregeln.
Ein FB sendet einen Code aus mehreren Bits und den muß man dekodieren.
Dann kann man auch erkennen, ob der Knopf kurz oder lange gedrückt wird.
Man benutzt dafür ein Hilsflag, das nur dann einmalig den Statuswert der
asuzuwertenden Variable ("Tastendruck") auf 1 setzt, wenn es z.B. von 0
auf 1 wechselt.
Prinzip:
If Flag=0 AND Taste=1 Then
Tastendruck=1
Flag=1
End if
Der Wert von "Tastendruck" bleibt dann auf 1
und kann dann irgendwann im Programm übernommen bzw. ausgewertet werden.
Unmittelbar danach wird dort die Variable "Tastendruck" auf 0
zurückgesetzt.
Erst wenn das Programm dann wieder bereit ist, einen neuen Tastendruck
anzunehmen, wird auch "Flag" auf 0 zurückgesetzt und damit die Erfassung
wieder "scharf" gemacht.
Peter Dannegger schrieb:> Max H. schrieb:>> Und die Taste hängt nicht direkt an µC sondern über eine Fernsteuerung?>> Es ist recht unüblich, daß eine FB nur einen Puls sendet. Die Gefahr> einer Fehlerkennung ist viel zu groß. Auch hat dann die AGC des> Empfängers keine Möglichkeit, sich auf das Signal einzuregeln.> Ein FB sendet einen Code aus mehreren Bits und den muß man dekodieren.> Dann kann man auch erkennen, ob der Knopf kurz oder lange gedrückt wird.
Ich komm immer mehr zur Überzeugung, dass der TO einen wesentlichen
Punkt nicht richtig rausgearbeitet hat.
Ich denke im gegenständlichen Fall geht es in Wirklichkeit um eine
Modellbau-Fernsteuerung, bei der am Sender ein entsprechender
Taster/Schalter sitzt.
D.h. wir reden hier eigentlich von RC-Signalauswertung. Daher auch das
pulsin im Code mit Vergleich der Pulszeiten.
@K.H.
davon bin ich ausgegangen. Einen gültig erkannten RF_Befehl kann man ja
als "TasteXY=1" wie gezeigt weiterverarbeiten, um bei Dauerdrücken einen
Einzelbefehl zu isolieren. Mit dem Rücksetzen von "Flag" wird vom Prog
bestimmt, wann es bereit ist den nächsten Einzelbefehl zu erlauben.
So wie das Teo Derix geschrieben hat müsste es schon funktionieren.
Da RC Signale im "Ruhezustand" 1.5ms Pulsdauer haben und ich nehm an bei
gedrückt in die eine Richtung 2ms und in die andere Richtung 1ms.
Du musst also beurteilen ob das Signal gerade von 1.5ms auf 1 bzw. 2ms
gewechselt hat und nicht schon länger diese Pulszeit hat.
gruß
Mat schrieb:> Da RC Signale im "Ruhezustand" 1.5ms Pulsdauer haben und ich nehm an bei> gedrückt in die eine Richtung 2ms und in die andere Richtung 1ms.
Dann braucht man eine Hysterese.
Z.B. 1,4-1,6 = losgelassen, >1,8 gedrückt links, <1,2 gedrückt rechts.
Und nur beim Übergang von losgelassen auf gedrückt wird eine Aktion
durchgeführt.
Es müssen die einzelnen Tastendrücke durch Nichtdrücke separiert werden.
Dann kann man, unabhängig von der Dauer des Tastendrucks, einen Zähler
damit inkrementieren, oder sonstwas Definiertes damit machen.
Einfache Tasten-RC-Sender sollten aus ökonomischen Gründen bei
ungedrückter Taste gar keine "Pulsdauer" versenden. ;-)
Stimmt, eine Hysterese braucht er natürlich, aber die hat er sich auch
schon eingebaut.
Signale kürzer 1.1ms und Signale größer 1.7ms, alles andere ist nicht
gedrückt :)
lg
Hi
Das Zauberwort ist nicht nur Entprellen sonder auch Flankenauswertung.
Dabei nimmst du den aktuellen Eingang und machst mit einem abgelegten
alten Wert eine Exclusiv Oder-Verknüpfung. Das Ergebnis ist nur bei
einem Unterschied 1 und das ist dein Flankenmerker. Nach der ExOR
schreibst du den aktuellen Wert in die Ablage. Im Programm fragst du das
Flankenbit ab und löst deine Aufgabe je anch Status. Nach der Arbeit
wird es gelöscht. Erst wenn wieder eine Flanke kommt, wird die Aufgabe
erneut angefasst. Aber, Sowohl Signalwechsel von 1 nach 0 und umkekehrt
sind Flanken. Daher musst du das Ergebnis der ExOr noch mit dem alten
oder neuen Status verunden. And mit alt ist Wechsel von 1 nach 0 und And
mit Neu ist Wechsel von 0 nach 1.
Keine große Sache.
Gruß oldmax
Mat schrieb:> Stimmt, eine Hysterese braucht er natürlich, aber die hat er sich auch> schon eingebaut.
Nö.
Wenn der Wert nahe 1,1 oder 1,7 ist, wirst Du ständig Flanken erhalten.
Hysterese ist ein Totbereich, in dem der letzte Zustand beibehalten
wird.
Quasi ein Schmitt-Trigger für die Zeitdauer.