Arduino - Loop Zähler

OP #3496885
Lesenswert?

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
1
int ledoutput =9;
2
int var=0;
3

4

5
void setup() {
6
 
7
  pinMode(ledoutput, OUTPUT);
8
  
9
}
10

11

12
void loop() {
13
  
14
  var++;
15
  if(var <2) {
16
  digitalWrite(ledoutput, HIGH);
17
  delay(1000);
18
  digitalWrite(ledoutput, LOW);
19
  delay(1000); }
20
 
21
  }

Was ist falsch? ;)
OP #3496894
Lesenswert?

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 :)
Gast #3496901
Lesenswert?

>Okey das hätte ich wahrscheinlich noch erwähnen müssen, Setup ist keine
>Lösung.. ;)

void loop() {

  if(var == 0) {
  var = 1;
  digitalWrite(ledoutput, HIGH);
  delay(1000);
  digitalWrite(ledoutput, LOW);
  delay(1000); }

  }
OP #3496909
Lesenswert?

Klappt, vielen Dank :)


Trotzdem würde mich interessieren warum mein COde nicht funktioniert?
1
var++; 
2
  if(var <2) {
3
  digitalWrite(ledoutput, HIGH);
4
  delay(1000);
5
  digitalWrite(ledoutput, LOW);
6
  delay(1000); }
7
 
8
  }


Ich meine var wird auf eins erhöht, ist < als 2 & läuft durch und wird 
wieder erhöht. 2 = 2 also wird übersprungen

Wo ist der Denkfehler?
Gast #3496914
Lesenswert?

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.
Gast #3496922
Lesenswert?

>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;)
Gast #3496956
Lesenswert?

>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
  }
}
Gast #3496969
Lesenswert?

>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
void loop() {
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.
OP #3496971
Lesenswert?

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
int usbinput = 8;
4
int ledoutput =9;
5
int zaehler=0;
6
int zaehler1=0;
7

8
IRsend irsend;
9

10

11
void setup() {
12
 
13
  pinMode(usbinput, INPUT);
14
  pinMode(ledoutput, OUTPUT);
15
  
16
 }
17

18

19
void loop() {
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(int i=0; i<=12; i++) { //Dreht Lautstärke auf Maximum
33
      irsend.sendRC5(0x410, 12);
34
      delay(400);  }
35
 
36
      }
37
  }
38
  
39
      
40
      if (digitalRead(usbinput)==LOW) {
41
      digitalWrite(ledoutput, LOW);
42
      zaehler=0;
43
      
44
      if(zaehler1 == 0) {
45
      zaehler1 = 1;
46
      irsend.sendRC5(0x50C, 12); //Ausschalten 
47
      delay(2000);
48

49
      }
50
    }
51
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren