IR bediening voor LED

Arduino specifieke Software
Berichten: 21
Geregistreerd: 27 Feb 2017, 14:36
Woonplaats: Hoensbroek

IR bediening voor LED

Berichtdoor GTIBert » 10 Mrt 2020, 17:59

Ik heb de volgende code, zie onderstaande.
Hiermee doe ik 4 Led's schakelen.
Nu had ik gaarne dat de Led's met knop-5 met de waarde 255 allen uit gaan.
Wie kan me hier mee verder helpen??

Ik hoor het graag.

Mvg Bert



#include <IRremote.h> //including the remote library

#define knop_1 16575 // code gegeven door knop_1
#define knop_2 49215 // code gegeven door knop_2
#define knop_3 8415 // code gegeven door knop_3
#define knop_4 41055 // code gegeven door knop_4
#define knop_5 255 // code gegeven door knop_5

int receiver_pin = 2; //Aansluiting output pin van de IR receiver.

//initializing the pins for leds
int led_1 = 4;
int led_2 = 5;
int led_3 = 6;
int led_4 = 7;
int led_state[] = {0,0,0,0,0}; //The initial state of the led's will be high

IRrecv receiver(receiver_pin); //Arduino will take output of IR receiver from pin 2
decode_results output;

void setup()
{
Serial.begin(9600);
receiver.enableIRIn(); // Start to take the output from IR receiver
//initializing all the pins where we have connected the led's as output pins
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);
}

void loop() {
if (receiver.decode(&output)) {
unsigned int value = output.value;
switch(value) {
case knop_1:

if(led_state[1] == 1) { // checking whether the previous state is on or not
digitalWrite(led_1, LOW); //zet eerste led UIT
led_state[1] = 0; //zet de status op LOW
} else { //Als de eerste LED uit is
digitalWrite(led_1, HIGH); //Zet hem AAN
led_state[1] = 1; //zet de status op HOOG

}
break;
case knop_2:

if(led_state[2] == 1) {
digitalWrite(led_2, LOW); //zet tweede led UIT
led_state[2] = 0; //zet de status op LOW
} else { //Als de tweede LED uit is
digitalWrite(led_2, HIGH); //Zet hem AAN
led_state[2] = 1; //zet de status op HOOG
}
break;
case knop_3:

if(led_state[3] == 1) {
digitalWrite(led_3, LOW);
led_state[3] = 0;
} else {
digitalWrite(led_3, HIGH);
led_state[3] = 1;
}
break;
case knop_4:

if(led_state[4] == 1) {
digitalWrite(led_4, LOW);
led_state[4] = 0;
} else {
digitalWrite(led_4, HIGH);
led_state[4] = 1;
}
break;
}
Serial.println(value);
receiver.resume();
}
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: IR bediening voor LED

Berichtdoor Koepel » 10 Mrt 2020, 21:28

Zijn alle leds uit bij aanzetten ?
En de uitgang op HIGH is de led aan ?

Dan is het een kwestie van alles uit zetten.

cpp code
case knop_5:
led_state[0] = 0;
led_state[1] = 0;
led_state[2] = 0;
led_state[3] = 0;
led_state[4] = 0;
digitalWrite(led_1, LOW);
digitalWrite(led_2, LOW);
digitalWrite(led_3, LOW);
digitalWrite(led_4, LOW);
break;


Ik had zomaar zin om allerlei ideeën neer te zetten :o
Misschien zie je er iets tussen dat je aanspreekt.

Met een for-loop is leuker:
cpp code
case knop_5:
for( int i=0; i<5; i++)
{
led_state[i] = 0;
}
digitalWrite(led_1, LOW);
digitalWrite(led_2, LOW);
digitalWrite(led_3, LOW);
digitalWrite(led_4, LOW);
break;


Je kunt ook de sizeof() gebruiken, dan gaat de compiler kijken hoe groot het array is in bytes.
Met "sizeof(led_state)" maakt de compiler daar "10" van.
Met "sizeof(int)" maakt de compiler daar "2" van (voor een Arduino Uno).
Die twee delen voor het aantal elementen van het array.
Dat is de ouderwetse manier. In de C++ taal zitten modernere dingen om met arrays om te gaan.
cpp code
for( int i=0; i<sizeof(led_state)/sizeof(int); i++)
{
led_state[i] = 0;
}


Je kunt het array "led_state" als integers gebruiken zoals nu, je kunt er ook booleans van maken (true of false), en je kunt er meteen HIGH of LOW in zetten. Met HIGH en LOW is het minder abstract en misschien te direct, maar in een Arduino sketch is dat vaak het duidelijkste.

cpp code
int led_state[] = {LOW, LOW, LOW, LOW, LOW};
...
if( led_state[1] == LOW)
led_state[1] = HIGH;
else
led_state[1] = LOW;
digitalWrite(led_1, led_state[1];


Dat kan korter:
cpp code
int led_state[] = {LOW, LOW, LOW, LOW, LOW};
...
led_state[1] = LOW ? HIGH : LOW; // toggle de state
digitalWrite(led_1, led_state[1];


Je kunt ook een variabele nemen en die 0, 1, 2, 3 maken voor de ingedrukte knop. Dan kun je dat meteen als index van een array gebruiken.

Bijvoorbeeld:
cpp code
int led_pin[] = { 4, 5, 6, 7);
int led_state[] = { LOW, LOW, LOW, LOW};
...

// knop waarde -1 betekend niet ingedrukt, 0 tot en met 3 is de index, overeenkomend met knop 1 tot en met 4.
int index = -1; // -1 is default, geen knop ingedrukt.
switch( value)
{
case knop_1:
index = 0;
break;
case knop_2:
index = 1;
break;
case knop_3:
index = 2;
break;
case knop_4:
index = 3;
break;
}

if( index > -1)
{
led_state[index] = LOW ? HIGH : LOW; // toggle de state
digitalWrite( led_pin[index], led_state[index]);
}


En daar knop 5 aan toevoegen is die aparte knop apart in code zetten:

cpp code
// knop waarde -1 betekend niet ingedrukt, 0 tot en met 3 is de index, overeenkomend met knop 1 tot en met 4.
int indexToggle = -1; // -1 is default, geen knop ingedrukt.
switch( value)
{
case knop_1:
indexToggle = 0;
break;
case knop_2:
indexToggle = 1;
break;
case knop_3:
indexToggle = 2;
break;
case knop_4:
indexToggle = 3;
break;
case knop_5:
for( int i=0; i<4; i++)
{
led_state[i] = LOW;
digitalWrite( led_pin[i], LOW);
}
break;
}

if( indexToggle > -1 && indexToggle < 4)
{
led_state[indexToggle] = LOW ? HIGH : LOW; // toggle de state
digitalWrite( led_pin[indexToggle], led_state[indexToggle]);
}


Heb je zo genoeg om op te kauwen :lol:

Berichten: 21
Geregistreerd: 27 Feb 2017, 14:36
Woonplaats: Hoensbroek

Re: IR bediening voor LED

Berichtdoor GTIBert » 11 Mrt 2020, 09:53

Hallo Koepel.

Bedankt voor je reactie.
Ik heb gelijk het eerste advies in mijn code gezet en getest.
Het werkt zoals ik het wilde

Bedankt voor deze.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Google [Bot], Seo-Ul-Tip en 26 gasten