Infrarood Logic Game

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 2
Geregistreerd: 25 Feb 2018, 21:48

Infrarood Logic Game

Berichtdoor peevdee » 08 Mrt 2018, 22:01

Ik ben bezig met een infraroodspel na te maken.
Maar ipv led's gebruik ik relays die lampen aansturen.
Alles lijkt goed te werken behalve dat het spel niet correct werkt.
I.p.v. dat alle lampen uit zijn bij de start, gaan ze allemaal aan.
En één knop (0) op de afstandsbediening die normaal alle lampen moet doen uitgaan werkt niet.
Wat is er verkeerd?
Ik heb de code van het internet.

Hieronder de code. Zie ik iets over het hoofd of heeft het met de relays te maken? Nu heb ik de stuurdraden van de leds gewoon verbonden met de relays...
cpp code
/* Arduino Project - Infrared Logic Puzzle
* This Sketch Allows you to control the Digital Settings
* of 5 LED's. The challenge is to turn them all on
*
* See Fritzing Diagram attached in Github
*
* Created on December 12 2017 by FIELDING
*/

#include <IRremote.h> //Infrared Remote Library

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN); //Setup the IR remote for initilisation
decode_results results; // set a decode variable, called results


const int LED [] = {0, 7, 6, 5, 4, 3}; // Set LED's as Digital Pins 7 thru 3

int LED_State[] = {0, 0, 0, 0, 0, 0, 0}; // Inlcude one more than the number of LED's
// you have, first val must be zero. Sets all
// LED's to low/off

unsigned int val = 0; // A variable to store the IR reading

const int code1 = 25979; //Set the values recieved
const int code2 = 65015; //from the IR remote
const int code3 = 15547; //for your chosen buttons
const int code4 = 58359;
const int code5 = 64539;
const int code6 = 58747;


void setup() {

Serial.begin(9600); // Turn on to allow you to check your IR remote values

irrecv.enableIRIn(); // Start the IR receiver

for (int i = 1; i < 6; i++) { // Set all LED's as OUTPUTS
pinMode(LED[i], OUTPUT);
}
}

void loop() {

if (irrecv.decode(&results)) { //If the IR receiver gets a signal
val = results.value; //Save that signal as a value to 'val'
Serial.println(val); //To check the values from your remote


switch (val) {
case code1: //If the IR reciever picks up code1
toggle2(1, 4); //Toggle these LED's on/off
break;
case code2: //If the IR reciever picks up code2
toggle2(2, 3); //Toggle these LED's on/off
break;
case code3: //If the IR reciever picks up code3
toggle3(3, 4, 5); //Toggle these LED's on/off
break;
case code4: //If the IR reciever picks up code4
toggle3(1, 4, 5); //Toggle these LED's on/off
break;
case code5: //If the IR reciever picks up code5
toggle3(1, 3, 4); //Toggle these LED's on/off
break;
case code6:
for (int i = 1; i < 6; i++) { // If Code 6 is received, all LED's are
digitalWrite(LED[i], LOW); // turned off
LED_State[i] = 0;
}
break;
}
irrecv.resume(); // Recieve the Next value
}
}

//Create a function to toggle two LED's on/off
void toggle2(int x, int y) { //Set x and y as two of the LED's (mix it up!)
if (LED_State[x] == 0) { //check to see if LED is currently on low/off
digitalWrite(LED[x], HIGH); // if its off, turn it on
LED_State[x] = 1;
} else {
digitalWrite(LED[x], LOW); // if its on, turn it off
LED_State[x] = 0;
}
if (LED_State[y] == 0) { //check to see if LED is currently on low/off
digitalWrite(LED[y], HIGH); // if its off, turn it on
LED_State[y] = 1;
} else {
digitalWrite(LED[y], LOW); // if its on, turn it off
LED_State[y] = 0;
}
}

//Create a function to toggle three LED's on/off
void toggle3(int x, int y, int z) { //Set x and y as two of the LED's (mix it up!)
if (LED_State[x] == 0) { //check to see if LED is currently on low/off
digitalWrite(LED[x], HIGH); // if its off, turn it on
LED_State[x] = 1;
} else {
digitalWrite(LED[x], LOW); // if its on, turn it off
LED_State[x] = 0;
}
if (LED_State[y] == 0) { //check to see if LED is currently on low/off
digitalWrite(LED[y], HIGH); // if its off, turn it on
LED_State[y] = 1;
} else {
digitalWrite(LED[y], LOW); // if its on, turn it off
LED_State[y] = 0;
}
if (LED_State[z] == 0) { //check to see if LED is currently on low/off
digitalWrite(LED[z], HIGH); // if its off, turn it on
LED_State[z] = 1;
} else {
digitalWrite(LED[z], LOW); // if its on, turn it off
LED_State[z] = 0;
}
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Infrarood Logic Game

Berichtdoor nicoverduin » 08 Mrt 2018, 22:41

Nou die definitie van die codes kan nooit kloppen. Een int is positief maximaal 32768. Dat moeten allemaal unsigned ints zijn.
Daarnaast:
a) Het is maar net hoe je de leds heb bedraad. Als ze naar de + schakelen dan zullen ze aan gaan. Omdat ze vrijwel altijd LOW zijn bij initialisatie. Dit gebeurt niet door de code dus zou het toeval zijn.
b) Je moet inderdaad van die const ints etc een const unsigned int maken. val is een unsigned int. Dat betekent een positief getal van 16 bits. Die kan de waarde 0-65535 hebben. En gaat dus goed met de codes die je uit de afstand bediening krijgt. De codes die je hebt voorgedefinieerd zijn ints en kunne een bereik hebben van -32767 tot +32768. Dus stel je vergelijkt
cpp code
const int code6 = 58747;


met

cpp code
case code6:
for (int i = 1; i < 6; i++) { // If Code 6 is received, all LED's are
digitalWrite(LED[i], LOW); // turned off
LED_State[i] = 0;
}
break;
}


Is de vergelijking geworden:
cpp code
case (58747 - 65536):


en dat is gelijk aan

cpp code
case -6789:


En dat is dus niet waar en wordt het niet uitgevoerd. Alle codes die onder de 32676 zitten zullen waarschijnlijk goed gaan. Dus alleen code1 en code3
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 7 gasten