Hallo :)
Kaum hab ich das erste Problem überwunden ist auch schon das nächste
da..:P
Hoffe mir kann wieder jemand so gut helfen.
Ich möchte dass eine LED genau einmal blinkt, egal wie oft der Loop
durchläuft. Da dachte ich mir ich realisiere das einfach mit einem
Zähler..klappt aber nicht und ich kann mir nicht erklären warum nicht.
Hier der Code
Okey das hätte ich wahrscheinlich noch erwähnen müssen, Setup ist keine
Lösung.. ;)
Um das zu erläutern.
Ich plane meine Stereoanlage automatisch synchron zu meinem TV ein &
auszuschalten. Wenn der Arduino also einen HIGH-Pegel bekommt soll
dieser einfach einmal den IR-Code "einschalten" senden. Geht aber nur im
Loop da der Arduino schon läuft.
Wenn der Arduino ein LOW vom TV bekommt soll dieser den IR-Befehl zum
Ausschalten senden und den Zähler zurücksetzen :)
Wolfgang schrieb:> Max E. schrieb:>> Was ist falsch? ;)>> var ist alle 256 loop-Durchläufe wieder 0
Danke für die Info das wusste ich nicht, erklärt aber trotzdem nicht
warum es nicht klappt. :P
Max E. schrieb:> Danke für die Info das wusste ich nicht, erklärt aber trotzdem nicht> warum es nicht klappt. :P
Doch, dein Zähler zählt
0, 1, 2, ..., 127, -128, -127, ... , -1, 0, 1, ...
und immer so weiter.
Wolfgang schrieb:> 0, 1, 2, ..., 127, -128, -127, ... , -1, 0, 1, ...
Sorry, da du für var den Typ int verwendest (und nicht int8), läuft dein
Zähler über 16 bit, also
> 0, 1, 2, ..., 32767, -32768, -32767, ... , -1, 0, 1, ...
und wiederholt sich erst nach 65536 Durchläufen.
>Trotzdem würde mich interessieren warum mein COde nicht funktioniert?
Ganz einfach:
var zählt so schnell durch das es nach einigen tausend CPU Zyklen
überläuft. Wurde oben ja schon beschrieben. Diese paar tausend
CPU Zyklen sind aber so schnell um das es für dich aussieht
als würde der Zähler nicht wirken und deine LED blinkt dauernd.
Mach mal das
void loop() {
if(var == 0) {
var = 1;
digitalWrite(ledoutput, HIGH);
delay(1000);
digitalWrite(ledoutput, LOW);
delay(1000); }
delay(1000); }
}
Dann wird es etwas dauern bis wieder geblinkt wird, aber
es wird wieder geblinkt;)
Verdammt zu früh abgesendet:(
So sollte das sein.
void loop() {
var++;
if(var <2) {
digitalWrite(ledoutput, HIGH);
delay(1000);
digitalWrite(ledoutput, LOW);
delay(1000); }
delay(1000); }
}
>void loop() {> var++;> if(var <2) {> digitalWrite(ledoutput, HIGH);> delay(1000);> digitalWrite(ledoutput, LOW);> delay(1000); }>> delay(1000);> }
Auch nicht!
Das ständige inkrementieren von var bewirkt, das diese irgendwann mal
Kopeister schlägt. Dann geht‘s bei 0 wieder los.
einfacher: nix inkrement
void loop() {
if (var == 0) { // Nur einmal am Anfang zutreffend
var = 1;
... an
... warte
... aus
... gut erhaltenes delay (1000) zu verkaufen
}
}
>Auch nicht!
Ja, war schlecht das Beispiel weil der gesamte Kontext
im Post stehen sollte.
>Das ständige inkrementieren von var bewirkt, das diese irgendwann mal>Kopeister schlägt. Dann geht‘s bei 0 wieder los.
Auch das wurde oben ja schon gesagt.
So, noch ein Beispiel damit er das ausprobieren kann
1
voidloop(){
2
var++;
3
if(var<2){
4
digitalWrite(ledoutput,HIGH);
5
delay(1000);
6
digitalWrite(ledoutput,LOW);
7
delay(1000);}
8
9
delay(1);
10
}
Wenn ich davon ausgehe das delay(1) eine Millisekunde dauert
wird in diesem Beispiel nach vermutlich 32s wieder dauernd geblinkt
weil der Zähler überläuft.
Okey, danke für deine Hilfe meine Stereosteuerung funktioniert & das mit
der Deklarierung nicht geklappt hat hab ich auch verstanden:)
Ich zeig dir mal den Code :)
1
#include<IRremote.h>
2
3
intusbinput=8;
4
intledoutput=9;
5
intzaehler=0;
6
intzaehler1=0;
7
8
IRsendirsend;
9
10
11
voidsetup(){
12
13
pinMode(usbinput,INPUT);
14
pinMode(ledoutput,OUTPUT);
15
16
}
17
18
19
voidloop(){
20
21
22
23
24
if(digitalRead(usbinput)==HIGH){
25
digitalWrite(ledoutput,HIGH);
26
27
if(zaehler==0){
28
zaehler=1;
29
zaehler1=0;
30
irsend.sendRC5(0x50C,12);//Einschalten
31
delay(6000);//Wartet bis Stero gestartet ist
32
for(inti=0;i<=12;i++){//Dreht Lautstärke auf Maximum