Aan Uit via afstand bediening

Hallo; ik zal proberen mijn probleem uit te leggen,Ik heb arduino geprogrammeerd met de code's van een afstand bed, dit doet wat het moet doen Ik heb 4 toetsen 2 t/m 5 als ik op toets 2 druk dan gaat de rode led aan,druk ik nochmaals op 2 dan gaat de rode led uit.Maar dat is niet wat ik wil,wat ik wil is dat ik de toets indruk de rode led aangaat en als ik de toets los laat de rode led uit gaat; en dit geld ook voor de toetsen 3,4,5.Na wat zoeken zit dit in de opdracht "TOGGELE" ik heb dit veranderd in"PULSE" maar dat is dus niet de oplossing.Dan krijg ik de Error (was not declared in this scope) Er moet dus noch iets gebeuren, maar wat. Graag wat Hulp.

c code:

/* Example code to control LEDs with an IR remote and receiver with Arduino. More info: https://www.makerguides.com/ */
#include <IRremote.h>
#define RECEIVER_PIN 6 // define the connections
#define ROOD_LED_PIN 2
#define GEEL_LED_PIN 3
#define GROEN_LED_PIN 4
#define BLAUW_LED_PIN 5

IRrecv receiver(RECEIVER_PIN); // create a receiver object of the IRrecv class
decode_results results; // create a results object of the decode_results class
unsigned long key_value = 0;

void setup() {
  Serial.begin(9600); // begin serial communication at a baud rate of 9600
  receiver.enableIRIn(); // enable the receiver
  receiver.blink13(true); // enable blinking of the built-in LED when an IR signal is received
  pinMode(ROOD_LED_PIN, OUTPUT); // set the LED pins as output
  pinMode(GEEL_LED_PIN, OUTPUT);
  pinMode(GROEN_LED_PIN, OUTPUT);
  pinMode(BLAUW_LED_PIN, OUTPUT);
  
  digitalWrite(ROOD_LED_PIN, LOW); // turn all the LEDs off
  digitalWrite(GEEL_LED_PIN, LOW);
  digitalWrite(GROEN_LED_PIN, LOW);
  digitalWrite(BLAUW_LED_PIN, LOW);
}
void loop() {
  if (receiver.decode(&results)) {
    if (results.value == 0xFFFFFFFF) {
      results.value = key_value;
    }
    switch (results.value) {
      case 0x55E2E7DA:
        Serial.println("1");
       toggleLED(ROOD_LED_PIN); // run the toggle LED function with the red LED pin as input
       delay(1000);
        break ;
        
      case 0x16D68307:
        Serial.println("2");
        toggleLED(GEEL_LED_PIN);
        delay(1000);
        break ;
        
      case 0x56E2E96F:
        Serial.println("3");
        toggleLED(GROEN_LED_PIN);
        delay(1000);
        break ;
        
      case 0x15D68172:
        Serial.println("4");
        toggleLED(BLAUW_LED_PIN);
        delay(1000);
        break ;
    }
    key_value = results.value;
    receiver.resume();
  }
}
void toggleLED(int pin) { // function to toggle the LED on and off
  if (digitalRead(pin) == HIGH) { // if the LED is on
    digitalWrite(pin, LOW); // turn it off
  }
  else { // else
    digitalWrite(pin, HIGH); // turn it on
  }
}
Electronica is mooi als het goed werkt
benleentje

Golden Member

Je zet de LED's aan als je de goede code ontvangt en als je niets ontvangt of een andere code zet je alles weer uit. De default in de switch case zet alles naar een default waarde als er aan geen enkele "case" word voldaan. Het kan zijn dat ik DigitalWrite verkeerd heb gespeld maar met die gekke hoofdletters kan ik die nooit goed onthouden.
De leds zullen niet gelijk uitgaan bij loslaten AB omdat je zelf een delay van 1S hebt toegevoegd.
En zet AUB alles in goede code tags en zorg ook voor een goede inspringen in je code dat maaklt het veel beter leesbaar.

c code:

switch (results.value) {
    case 0x55E2E7DA:
        Serial.println("1");
        DigitalWrite(ROOD_LED_PIN, HIGH); 
        delay(1000);
        break ;
    case 0x16D68307:
        Serial.println("2");
        DigitalWrite(GEEL_LED_PIN, HIGH);
        delay(1000);
        break ;
    case 0x56E2E96F:
        Serial.println("3");
        DigitalWrite(GROEN_LED_PIN, HIGH);
        delay(1000);
        break ;
    case 0x15D68172:
        Serial.println("4");
        DigitalWrite(BLAUW_LED_PIN, HIGH);
        delay(1000);
        break ;
    default:  // Default waarde als er geen case match gevonden word
        DigitalWrite(ROOD_LED_PIN, LOW); 
        DigitalWrite(GEEL_LED_PIN, LOW);
        DigitalWrite(GROEN_LED_PIN, LOW); 
        DigitalWrite(BLAUW_LED_PIN, LOW);
        break;
}
Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
buckfast_beekeeper

Golden Member

Dient de default niet low te zijn. Nu zet je alleen aan.

@TS: normaal dat je een foutmelding krijgt als je toggleLed vervangt door pulseLed. Er is geen functie of procedure die zo noemt wel een procedure die toggle... noemt.

c code:


void toggleLED(int pin) { // function to toggle the LED on and  off
    if (digitalRead(pin) == HIGH) { // if the LED is on
        digitalWrite(pin, LOW); // turn it off
    }
    else { // else
        digitalWrite(pin, HIGH); // turn it on
    }
}

Laat ook een keer 1 blanco regel tussen de verschillende functies en procedures. Het wordt alleen maar beter leesbaar en daar zal je na verloop van tijd heel blij mee zijn.

Van Lambiek wordt goede geuze gemaakt.

Ik heb de oplossing gevonden,ieder bedankt voor het mee denken.
Gr Bert

[Bericht gewijzigd door Bertjebuk op dinsdag 10 november 2020 16:24:41 (73%)

Electronica is mooi als het goed werkt

Hallo; Na wat oponthoud ben ik er inmiddels achter dat het realiseren van de aan uit via de afstand bediening toch niet was gelukt, Ik heb inmiddels wel een eenvoudigere Sketch gedownload , misschien is hier een wat simpelere oplossing voor.Voor alle duidelijkheid als de toets op de afstand bediening word ingedrukt dan signaal (hoog) zodra de toets word losgelaten dan signaal (laag),graag wat hulp om dit te realiseren.

c code:

#include <IRremote.h>
int IR_PIN = 9;

IRrecv irrecv(IR_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); 
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {

    //in each case instead of those hex number you have to put yours remote keys codes.
    switch(results.value){

      case 0x1ED:
      digitalWrite(2, !digitalRead(2));
      break;

      case 0x9ED:
      digitalWrite(3, !digitalRead(3));
      break;
      
      case 0x9F3:
      digitalWrite(4, !digitalRead(4));
      break;
      
      
      case 0x1F3:
      digitalWrite(5, !digitalRead(5));
      break;
    }
    irrecv.resume(); 
  }
  delay(10);
}
Electronica is mooi als het goed werkt

Toch jammer dat niemand hier een oplossing voor weet.:( Toch bedankt voor de spontane reacties.:)

Electronica is mooi als het goed werkt