Probleme mit Programmierung

Hallo,

ich habe ein kleines Projekt. Ich habe in ein Lego Feuerwehrauto LEDs, einen IR Empfänger und einen Arduino NANO eingebaut. Ich habe jedoch Probleme bei der Programmierung:

#include <IRremote.h>
int RECV_PIN = 3;
int Sir = 2;
int LV = 4;
int LO = 5;
int LR = 6;
int BL = 7;
int BR = 8;
int BLL = 9;
int BLR = 10;
int X = 11;
int i = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
 Serial.begin(9600);
 irrecv.enableIRIn();
 pinMode (Sir, OUTPUT);
 pinMode (LV, OUTPUT);
 pinMode (LO, OUTPUT);
 pinMode (LR, OUTPUT);
 pinMode (BL, OUTPUT);
 pinMode (BR, OUTPUT);
 pinMode (BLL, OUTPUT);
 pinMode (BLR, OUTPUT);
 pinMode (X, OUTPUT);
}

void loop() {
 if (irrecv.decode(&results)) {    //Wenn Daten empfangen wurden,

 Serial.println(results.value, DEC); //werden sie als Dezimalzahl (DEC) an den Serial-Monitor ausgegeben.

 irrecv.resume();

 if (results.value == 16718055){     //Licht vorne
   digitalWrite (LV, HIGH);
 }
 if (results.value == 16730805){
   digitalWrite (LV, LOW);
 }
 if (results.value == 16754775){     //Licht Oben
   digitalWrite (LO, HIGH);
 }
 if (results.value == 16750695){
   digitalWrite (LO, LOW);
 }

 if (results.value == 16753245){     //Blinker Links  
   tone(BL, 2);
 }
 if (results.value == 16720605){     
   noTone(BL);
 }

 if (results.value == 16769565){       //Blinker Rechts
   tone(BR, 2);
 }
 if (results.value == 16761405){
   noTone(BR);
 }

 if (results.value == 16736925){         //Warnblinker
   tone(BL, 2);
   tone(BR, 2);
 }
 if (results.value == 16712445){
   noTone(BL);
   noTone(BR);
 }

 if (results.value == 16769055){         //Blaulicht
   tone(X, 5);
   int i=1;
 }
 if (results.value == 16738455){
   noTone(X);
   int i=0;
 }
 if ((X==1)&& (i==1)){
   tone(BLL, 20);
   noTone(BLR);
 }
 if ((X==0)&& (i==1)){
   tone(BLR, 20);
   noTone(BLL);
 }

 
 if (results.value == 16748655){
   digitalWrite (Sir, HIGH);
   delay(200);
   digitalWrite (Sir, LOW);
   }

 }
}

das ist folgende Programmierung. Ich bekomme die LEDs einfach nicht dazu zu blinken. vielleicht kann mir jemand helfen.

Ich sollte vielleicht noch erwähnen, dass ich in der IR Bibliothek was umgeschrieben habe und einen anderen Timer nutze, da das mit etwas anderem kollidiert ist.

Hallo Philip,

wenn ein Programm nicht tut, was es tuen soll, dann baue ich Serial.print("....") Zeilen ein und kontrolliere damit Schritt für Schritt, ob das getan wird, was getan werden soll.

Also immer der Abgleich: was erwarte ich und was wird geliefert.
Die Reihe an IF-Abfragen würde ich mit Switch case abarbeiten - Stichwort endlicher Automat.

Vielleicht ist das Dein Problem: It is not possible to generate tones lower than 31Hz.

Siehe hier

@ PhilipGauder
Sehe ich das richtig, du willst mit der Tone-Lib die Leds zum Blinken bringen ?
Da hast du sicher Probleme.
Sieh dir mal "BlinkWithoutDelay" an, findest du in der IDE.
Damit wird das sicher funktionieren.

@HotSystems
Ja, ich wusste keine andere Möglichkeit ohne delays die LEDs zum blinken zu bringen. Aber ich habe etwas Probleme dieses BlinkWithoutDelay ganz zu verstehen, ich bin noch ziemlich am Anfang des Programmierens. Aber danke für die vielen Tipps

Zwei von zig Varianten zum beliebigen anpassen

Variante 1:

if(millis()%(100+500)<100)
 {
  LED an
 }
 else
 {
   LED aus
 }

Varianten 2:

//Flash two LEDs at different rates using Simon Monk's Timer library
//http://www.doctormonk.com/2012/01/arduino-timer-library.html
//
//Jack Christensen 30Sep2013
//
//Beerware license: Free for any and all purposes, but if you find it
//useful AND we actually meet someday, you can buy me a beer!

#include "Timer.h"                     //http://github.com/JChristensen/Timer

const int LED1 = 8;                    //connect one LED to this pin (with appropriate current-limiting resistor of course)
const int LED2 = 9;                    //connect another LED to this pin (don't forget the resistor)
const unsigned long PERIOD1 = 1000;    //one second
const unsigned long PERIOD2 = 10000;   //ten seconds
Timer t;                               //instantiate the timer object

void setup(void)
{
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    t.oscillate(LED1, PERIOD1, HIGH);
    t.oscillate(LED2, PERIOD2, HIGH);
}

void loop(void)
{
    t.update();
}

Hier findest du eine ausführliche Erklärung zu BlinkWithoutDelay. Und hier nochmal eine andere.

Danke, ich probiere damit mal etwas rum, vielleicht bekomme ich es ja hin :slight_smile:

wenn du ein sicheres Gefühl mit dem Umgang von BlinkWithoutDelay hast, kannst du auch probieren die einzelnen BlinkLeds in ein Objekt zu stopfen. Jedes Objekt kümmert sich dann quasi selbst ums blinken, unterschiedliche Objekte mit verschiedenen Blinkzeiten sind dann sehr einfach zu erweitern.

Da ich es die Tage auch mal im englischen Forum gepostet habe, mal ein kleines Beispiel mit zwei LEDs

/* Blink a LED in a specific rhythm

  Turns on and off light emitting diodes (LED) connected to a digital pin,
  without using the delay() function. This means that other code can run at the
  same time without being interrupted by the LED code.

  Version 2019-02-12: added class for BouncingLed http://forum.arduino.cc/index.php?topic=597083.0
  Version 2018-11-24: changed .setup method to .begin for Arduino 1.8.7

*/


class BlinkLed {
    byte state = 1;                    // 0 off, 1 blink
    unsigned long previousMillis;      // last blink timestamp
    uint16_t on = 180;
    uint16_t off = 320;                // 180/320 is according ECE
    const byte ledPin;                 // a GPIO for the LED

  public:
    BlinkLed(byte attachTo, uint16_t _on = 180, uint16_t _off = 320):
      ledPin(attachTo),
      on (_on),
      off (_off)
    {}
    void begin() {
      pinMode(ledPin, OUTPUT);
    }
    void set(uint16_t _on, uint16_t _off) { // modify on/off times during runtime
      on = _on;
      off = _off;
    }
    void setState(byte _state) {           // 1 Switch on blinking; 0 switch off blinking
      state = _state;
    }
    void tick() {
      if (state) {
        uint32_t currentMillis = millis();
        if (digitalRead(ledPin) && currentMillis - previousMillis >= on) {
          // save the last time you blinked the LED
          previousMillis = currentMillis;
          digitalWrite(ledPin, LOW);
        }
        else if (!digitalRead(ledPin) && currentMillis - previousMillis >= off) {
          // save the last time you blinked the LED
          previousMillis = currentMillis;
          digitalWrite(ledPin, HIGH);
        }
      }
    }
};


// declare your LED objects (assign GPIOs to you LEDs)
BlinkLed anotherBlinkLed(7);                       // a simple blink LED on a GPIO with default on/off times
BlinkLed myBlinkLed(13);                           // a simple blink LED on a GPIO with default on/off times

void setup() {
  // each LED object has to be called once in the setup
  anotherBlinkLed.begin();
  myBlinkLed.begin();

  // modify some default values
  anotherBlinkLed.set(50, 50); // on/off time
  myBlinkLed.set(100, 100); // on/off time
  
  Serial.begin(115200);    //only used for debug
  Serial.println(F("BlinkWithoutDelay the OOP way"));
  Serial.print  (__DATE__);
  Serial.print  (F(" "));
  Serial.println(__TIME__);
}

void loop() {
  // each LED object has to be called once in the loop
  anotherBlinkLed.tick();
  myBlinkLed.tick();
 
  // put here other code which needs to run:
}

In deinem Fall kannst du bei deiner IR-Auswertung einfach den Status der Blinkled ein oder ausschalten:

myBlinkLed.setState(1); // einschalten

Wenn die Idee gefällt, habe ich auch noch andere Varianten, Warnleuchten, KITT-Lauflicht, Dimmerleuchten. Alles nach dem gleichen Schimmel - Grundlage ist jedoch im wesentlichen immer BlinkWithoutDelay.

Ich komme nicht weiter, ich habe bisher folgendes:

#include <IRremote.h>
int RECV_PIN = 3;
int Sir = 2;
int LV = 4;
int LO = 5;
int LR = 6;
int led_1 = 7;
int BR = 8;
int BLL = 9;
int BLR = 10;
int X = 11;
int i;
int BL;
IRrecv irrecv(RECV_PIN);
decode_results results;

// Variablen deklarieren in denen die Startzeiten
// der einzelnen Zeitfunktionen gespeichert werden
unsigned long startzeit_1 = 0;
unsigned long startzeit_2 = 0;
unsigned long startzeit_3 = 0;

// Definitionen der einzelnen Schaltzeiten
#define laufzeit_1 400UL
#define laufzeit_2 200UL
#define laufzeit_3 50UL

void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode (Sir, OUTPUT);
pinMode (LV, OUTPUT);
pinMode (LO, OUTPUT);
pinMode (LR, OUTPUT);
pinMode (led_1, OUTPUT);
pinMode (BR, OUTPUT);
pinMode (BLL, OUTPUT);
pinMode (BLR, OUTPUT);
pinMode (X, OUTPUT);
}

void loop() {
if (irrecv.decode(&results)) { //Wenn Daten empfangen wurden,

Serial.println(results.value, DEC); //werden sie als Dezimalzahl (DEC) an den Serial-Monitor ausgegeben.

irrecv.resume();

if (results.value == 16718055){ //Licht vorne
digitalWrite (LV, HIGH);
}
if (results.value == 16730805){
digitalWrite (LV, LOW);
}
if (results.value == 16754775){ //Licht Oben
digitalWrite (LO, HIGH);
}
if (results.value == 16750695){
digitalWrite (LO, LOW);
}

if (results.value == 16753245){ //Blinker Links
int (BL, HIGH);
}

if ((millis() - startzeit_1 >= laufzeit_1)&&(BL==HIGH)) {
startzeit_1 = millis();
digitalWrite(led_1, digitalRead(led_1) ^ 1);
}

if (results.value == 16720605){
digitalWrite (led_1, LOW);
int (BL, LOW);
}

Aber wenn ich die ensprechende Taste drücke passiert rein gar nicht. Ich weiß nicht was ich falsch mache, wie gesagt, bin noch Anfänger

also wenn nicht mal die Serial-Ausgabe funktioniert:

Schaltplan und Echtbild von deinem Aufbau bitte.

doch, also das Licht Vorne und so geht an und aus, das hatte ich vergessen raus zu nehmen. bloß das blinken geht halt immernoch nicht

Hi

Wenn Du noch ein paar Mal wiederholst, daß Du Das eh nicht selber hin bekommst - wird Das auch so passieren - nennt man Motivation - klappt halt auch in die andere Richtung.
Außerdem: Code-Tags hattest Du bereits schon drauf, bitte nachbessern.

Wenn mein Sketch nicht Das macht, was ich will, packe ich tonnenweise serial.print("Stelle 1"); in den Code - daran sehe ich, wo mein Sketch 'vorbei kommt' - und wenn Er irgendwo NICHT vorbei kommt, wo Er eigentlich vorbei kommen müsste - bin ich dem Fehler schon auf der Spur.

MfG

was macht

int (BL, HIGH);

aus deiner sicht?

Außerdem Kompiliert dein Sketch nicht (zumindest das nicht, was du hier reingestellt hast).
Klammern fehlen.

Außerdem gehört dein

if ((millis() - startzeit_1 >= laufzeit_1)&&(BL==HIGH)) {

in einen Bereich der IMMER durch den Loop angesprochen wird, nicht in den IR-IF

Variablen ansehen. Es gibt auch was anderes als int.
const setzen was const ist (PINs!)

edit: ohne Pistole und Gewehr (aber mit Code-Tags gem. Forenhilfe)

#include <IRremote.h>
const int RECV_PIN = 3;
const int Sir = 2;
const int LV = 4;
const int LO = 5;
const int LR = 6;
const int led_1 = 7;
const int BR = 8;
const int BLL = 9;
const int BLR = 10;
const int X = 11;
//int i;
uint8_t BL;
IRrecv irrecv(RECV_PIN);
decode_results results;

// Variablen deklarieren in denen die Startzeiten
// der einzelnen Zeitfunktionen gespeichert werden
unsigned long startzeit_1 = 0;
unsigned long startzeit_2 = 0;
unsigned long startzeit_3 = 0;

// Definitionen der einzelnen Schaltzeiten
#define        laufzeit_1   400UL
#define        laufzeit_2   200UL
#define        laufzeit_3   50UL

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode (Sir, OUTPUT);
  pinMode (LV, OUTPUT);
  pinMode (LO, OUTPUT);
  pinMode (LR, OUTPUT);
  pinMode (led_1, OUTPUT);
  pinMode (BR, OUTPUT);
  pinMode (BLL, OUTPUT);
  pinMode (BLR, OUTPUT);
  pinMode (X, OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {    //Wenn Daten empfangen wurden,
    Serial.println(results.value, DEC); //werden sie als Dezimalzahl (DEC) an den Serial-Monitor ausgegeben.
    irrecv.resume();
    if (results.value == 16718055) {    //Licht vorne
      digitalWrite (LV, HIGH);
    }
    else if (results.value == 16730805) {
      digitalWrite (LV, LOW);
    }
    else if (results.value == 16754775) {    //Licht Oben
      digitalWrite (LO, HIGH);
    }
    else if (results.value == 16750695) {
      digitalWrite (LO, LOW);
    }
    else if (results.value == 16753245) {    //Blinker Links
      Serial.println(F("D59 Blinker ein"));
      BL = HIGH;
    }
    else if (results.value == 16720605) {
      Serial.println(F("D63 Blinker aus"));
      digitalWrite (led_1, LOW);
      BL = LOW;
    }
  }
  if ((millis() - startzeit_1 >= laufzeit_1) && (BL == HIGH)) {
    startzeit_1 = millis();
    digitalWrite(led_1, digitalRead(led_1) ^ 1);
    Serial.print(F("LED ist ")); Serial.println(digitalRead(led_1));
  }
}

Vielen Dank, jetzt läuft schon mal der linke Blinker, ich denke jetzt bekomme ich es für die anderen abgewandelt :slight_smile:

Läuft jetzt endlich alles so wie es soll. Vielen Dank für die ganzen hilfreichen Kommentare. Ich habe viel dazugelernt was die Programmierung und die Möglichkeiten des Arduinos angeht :slight_smile:

Und zum Abschluss solltest Du das Ergebnis hier präsentieren, dann haben andere auch etwas davon.

wie kann ich denn Dateien anhängen hier?

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Wenn er > 9000 Zeichen ist unter “Attachments and other options” schauen.

Gruß Tommy