Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
In deze instructable laat ik je zien hoe je een RGB-led bedient met een IR-afstandsbediening en er een leuk spel van maakt!
Stap 1: benodigde onderdelen
De onderdelen die je nodig hebt voor dit project zijn:
- arduino één- RGB Led- IR-sensor
(aantal leds hangt af van het spel, het aantal levens of) - 2 groene leds - 1 gele led - 1 oranje led - 3 rode leds
Stap 2: Coderen
#erbij betrekken
int redPin = 10;
int groenePin = 6; int blauwPin = 5;
int levensPin1 = 8;
int levensPin2 = 9; int levensPin3 = 12;
int niveauPin1 = 2;
int niveauPin2 = 3; int niveauPin3 = 4; int niveauPin4 = 7;
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN); decode_results resultaten;
// invoerkleuren
int invoer = {-1, -1, -1}; int-kleur = {-1, -1, -1};
int indexNummer = 0;
int indexColor = 0;
int waarde = 0;
int rood = 0;
int groen = 0; int blauw = 0;
// genereer kleuren
int roodRandom = 0; int groenRandom = 0; int blauwRandom = 0;
// spelvariabelen
int verschil = 200;
int levelNumber = 1;
int-niveau = {-1, -1, -1, -1};
int t = 0;
int-niveau1 = 255;
int-niveau2 = 0; int-niveau3 = 0; int-niveau4 = 0;
int levens = 3;
int levens1 = 255; int levens2 = 255; int levens3 = 255;
int roodGok = 0;
int groenGok = 0; int blauwGok = 0;
ongeldige setup() {
Serieel.begin(9600); onrecv.enableIRIn(); // start de ontvanger pinMode (redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode (bluePin, UITGANG);
pinMode (levensPin1, UITGANG);
pinMode (levensPin2, UITGANG); pinMode (levensPin3, UITGANG);
}
lege lus() {
if (irrecv.decode(&results)) // ontvang de signalen van de afstandsbediening {Serial.println(results.value, DEC); // toon de signalen die zijn ontvangen van elke ingedrukte knop irrecv.resume(); // ontvang volgende signaalschakelaar (results.value) { // zet de signalen om in de cijfers op de knoppen en wijs acties toe aan knoppen
zaak 109562864:
addWaarde(1); pauze;
zaak 109562824:
addWaarde(2); pauze;
zaak 109562856:
addWaarde(3); pauze;
zaak 109562872:
addWaarde(4); pauze;
zaak 109562820:
addWaarde(5); pauze;
zaak 109562852:
addWaarde(6); pauze;
zaak 109562868:
addWaarde(7); pauze;
zaak 109562828:
addWaarde(8); pauze;
zaak 109562860:
addWaarde(9); pauze;
zaak 109562876:
addWaarde(0); pauze;
zaak 109562818: //oud ding enter/R CLK
handvatInvoer(); pauze;
zaak 109562816: //oud ding power
handvatKleur(); pauze; case 109562878: //oud ding cancel/L CLK resetColor(); pauze;
zaak 109562866: //lege knop midden
willekeurige kleur(); pauze;
zaak 109562830: // pijltje naar rechts
toonAlles(); pauze; case 109562838: // esc case 109562822: // AV-bron resetEverything(); pauze; }
// ken knoppen op de afstandsbediening toe om de kleur te regelen: op deze manier kunnen spelers zien hoe de kleuren eruit zien en hoe ze te combineren, // voordat je een spel start. switch(results.value){ case 109562840: rood = 255; pauze;
zaak 109562844:
groen = 255; pauze;
koffer 109562850:
blauw = 255; pauze;
zaak 109562836:
rood = 0; groen = 0; blauw = 0; pauze; }
}
analogWrite(redPin, abs(255 - rood)); // RGB-led aansturen: omgekeerd, omdat de mijne omgekeerd is bedraad.
analogWrite(greenPin, abs(255 - groen)); analogWrite(bluePin, abs(255 - blauw));
// aansturen van live leds
if (leeft == 2){ levens1 = 0; } if (leeft == 1){ levens2 = 0; } if (leeft == 0){ levens3 = 0; } analogWrite(levensPin1, levens1); analoogWrite(levensPin2, levens2); analogWrite(levensPin3, levens3);
// aansturen van niveau-leds
if (levelNumber == 1){ level1 = 255; } if (levelNumber == 2){ level1 = 255; niveau2 = 255; } if (levelNumber == 3){ level1 = 255; niveau2 = 255; niveau3 = 255; } if (levelNumber == 4){ level1 = 255; niveau2 = 255; niveau3 = 255; niveau4 = 255; } analoogWrite(niveauPin1, niveau1); analoogWrite(niveauPin2, niveau2); analoogWrite(niveauPin3, niveau3); analoogWrite(niveauPin4, niveau4);
}
void addWaarde (int value) { // voeg ingedrukte waarde toe aan lijst
if (indexNummer == 3) {
opbrengst; }
if (invoer [indexnummer] == -1){
input[indexNumber] = waarde; indexNummer++; } }
void handleInput() { // maak een 'waarde'(waarde) uit de lijst
waarde = abs(invoer[0] * 100 + invoer[1] * 10 + invoer[2]); invoer[0] = -1; // reset de invoer [1] = -1; invoer [2] = -1;
indexNummer = 0;
Serial.print("waarde opgeslagen: "); Serial.println(waarde); addColor(waarde); }
void addColor(int waarde) { // voeg de 3-cijferige 'waarde' toe aan een lijst
if (indexColor == 3) {
opbrengst; }
if (kleur[indexKleur] == -1){
kleur[indexKleur] = waarde; if (kleur [indexKleur] > 255){ kleur [indexKleur] = 255; } indexColor++; }
}
void randomColor(){ // laat het licht een willekeurige kleur krijgen en sla het op in variabelen
roodRandom = willekeurig (0, 255);
groenRandom = willekeurig (0, 255);
blauwRandom = willekeurig (0, 255);
rood = roodRandom;
groen = groenRandom; blauw = blauwRandom; Serial.print("roodRandom = "); Serial.println(roodRandom); Serial.print("groenRandom = "); Serial.println(groenRandom); Serial.print("blauwRandom = "); Serial.println(blauwRandom);
}
void handleColor() { // verander de 'waarde' uit de lijst in 'Gok' (gok) variabelen
roodGok = kleur[0]; groenGok = kleur[1]; blauwGok = kleur[2]; // controleer of de Gok-variabelen te veel verschillen met de echte willekeurige kleur: zo ja, geef de schatting drie seconden weer, knippert groen en verander de kleur opnieuw, voeg een niveau toe en maak het toegestane verschil kleiner // zo niet, toon de drie seconden raden, rood knipperen en een leven aftrekken // als je geen levens meer hebt, begint het spel opnieuw als (abs((rood + groen + blauw) - (roodGok + groenGok + blauwGok)) <= diff){ analogWrite(redPin, abs(255 - roodGok)); analogWrite(greenPin, abs(255 - groenGok)); analogWrite(bluePin, abs(255 - blauwGok)); vertraging (3000); analoogWrite(redPin, 255); analoogWrite(greenPin, 0); analoogWrite(bluePin, 255); vertraging (300); analoogWrite(redPin, 255); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (300); analoogWrite(redPin, 255); analoogWrite(greenPin, 0); analoogWrite(bluePin, 255); vertraging (300); analoogWrite(redPin, 255); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (300);
Serial.print("roodGok = ");
Serial.println(roodGok); Serial.print("groenGok = "); Serial.println(groenGok); Serial.print("blauwGok = "); Serial.println(blauwGok); resetKleur(); willekeurige kleur(); niveauNummer++; verschil -= 50; } else{ analogWrite(redPin, abs(255 - roodGok)); analogWrite(greenPin, abs(255 - groenGok)); analogWrite(bluePin, abs(255 - blauwGok)); vertraging (3000); analoogWrite(redPin, 0); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (300); analoogWrite(redPin, 255); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (300); analoogWrite(redPin, 0); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (300); analoogWrite(redPin, 255); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (300); Serial.print("roodGok = "); Serial.println(roodGok); Serial.print("groenGok = "); Serial.println(groenGok); Serial.print("blauwGok = "); Serial.println(blauwGok);
resetKleur();
leeft--; } if (leeft == 0){ analogWrite(redPin, 0); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (100); analoogWrite(redPin, 255); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (100); analoogWrite(redPin, 0); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (100); analoogWrite(redPin, 255); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (100); analoogWrite(redPin, 0); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (100); analoogWrite(redPin, 255); analoogWrite(greenPin, 255); analoogWrite(bluePin, 255); vertraging (100); alles resetten(); }
}
void resetColor () { // gebruik voor reset-waarden, voor een verkeerde druk of elke nieuwe gok (alleen voor zekerheid)
kleur[0] = -1; kleur [1] = -1; kleur [2] = -1;
indexNummer=0;
indexKleur=0; }
void resetEverything(){ // herstart het spel
kleur[0] = -1; kleur [1] = -1; kleur [2] = -1;
indexNummer=0;
indexKleur=0;
levens = 3;
rood = 0; groen = 0; blauw = 0;
roodRandom = 0;
groenRandom = 0; blauwRandom = 0;
levens1 = 255;
levens2 = 255; levens3 = 255;
niveau1 = 255;
niveau2 = 0; niveau3 = 0; niveau4 = 0;
niveauNummer = 1;
t = 0;
}
void displayEverything(){ // gebruik dit om belangrijke informatie op de seriële monitor weer te geven
Serial.print("roodGok = "); Serial.println(roodGok); Serial.print("groenGok = "); Serial.println(groenGok); Serial.print("blauwGok = "); Serial.println(blauwGok); Serial.print("roodRandom = "); Serial.println(roodRandom); Serial.print("groenRandom = "); Serial.println(groenRandom); Serial.print("blauwRandom = "); Serial.println(blauwRandom);
Serial.print("rood = ");
Serial.println(rood); Serial.print("groen = "); Serial.println(groen); Serial.print("blauw = "); Serial.println(blauw);
Serial.print("waarde opgeslagen: ");
Serial.println(waarde); }
Stap 3: Bouw
U wilt natuurlijk een mooie build voor dit project. dit deel is vrij voor interpretatie vatbaar, maar er zijn wel wat dingen om rekening mee te houden: - houd het frontpaneel dun, zodat je er nog je leds doorheen kunt steken en de IR-ontvanger nog werkt
- houd voldoende ruimte in de build voor de arduino en een soldeerbord
- zorg dat er een gat in de achterkant zit voor de kracht van de arduino
Ik heb een ruw schema voor de bedrading toegevoegd.
Veel succes en veel plezier!