Arduino - Loop Zähler

OP #3496885
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
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
>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
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
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
>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 #3496925
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); }
  }
Gast #3496927
Und jetzt ne Klammer zu viel:(

Jetzt aber:

void loop() {
  var++;
  if(var <2) {
  digitalWrite(ledoutput, HIGH);
  delay(1000);
  digitalWrite(ledoutput, LOW);
  delay(1000); }

  delay(1000);
  }
Gast #3496956
>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
>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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.