#include <IRremote.h>
#include <time.h>
#include <stdlib.h>
//declaring IR-Remote codes
const unsigned long value_0 = 3910598400;
const unsigned long value_1 = 3476094720;
const unsigned long value_2 = 3877175040;
const unsigned long value_3 = 2239430400;
const unsigned long value_4 = 4144561920;
const unsigned long value_5 = 3810328320;
const unsigned long value_6 = 2774204160;
const unsigned long value_7 = 3175284480;
const unsigned long value_8 = 2907897600;
const unsigned long value_9 = 3041591040;
const unsigned long value_pause = 3158572800;
const unsigned long value_plus = 3927310080;
const unsigned long value_minus = 4161273600;
//declaring Pins
const int remote_input = 12;
int redLedPins[] = {8, 9, 10};
int greenLedPins[] = {5, 6, 7};
int blueLedPins[] = {2, 3, 4};
int allPins[] = {2,3,4,5,6,7,8,9,10};
int activeLedPins[9] = {0}; //stores which LED Pins are active as boolean (0 = None)
int activeLeds[9] = {0}; // array for all current shining led-pins (0 = None)
int modeStep = 0;
//creating object for IR-Sensor
IRrecv irrecv(remote_input);
void toggleLedGroup(int ledPins[], int numLeds) {
bool isActive = false;
for (int i = 0; i < numLeds; i++) {
for (int j = 0; j < 9; j++) {
if (activeLedPins[j] == ledPins[i]) {
isActive = true;
}
}
}
if (!isActive) {
addLedGroup(ledPins, numLeds);
} else {
removeLedGroup(ledPins, numLeds);
}
Serial.print("activeLedPins: ");
for (int i = 0; i < 9; i++) {
Serial.print(activeLedPins[i]);
}
Serial.println("");
}
void addLedGroup(int ledPins[], int numLeds) {
int index = 0;
while (activeLedPins[index] != 0 && index < 9) {
index++;
}
if (index < 9) {
for (int i = 0; i < numLeds; i++) {
activeLedPins[index + i] = ledPins[i];
}
}
}
void removeLedGroup(int ledPins[], int numLeds) {
for (int i = 0; i < 9; i++) {
if (activeLedPins[i] == ledPins[0]) {
for (int j = 0; j < numLeds; j++) {
activeLedPins[i + j] = 0;
ledOff(i + j);
}
break;
}
}
}
void ledOn(int ledPin) {
/*
schaltet eine einzelne LED an
*/
//beendet die Funktion wenn die Leds bereits leuchtet
for (int i = 0; i < 9; i++) {
if (activeLeds[i] == ledPin) {
return;
}
}
int index = 0;
while (activeLeds[index] != 0 && index < 9) {
index++;
}
if (index < 9) {
activeLeds[index] = ledPin;
}
}
void ledOff(int ledPin) {
/*
schaltet eine einzelne LED aus
*/
for (int i = 0; i < 9; i++) {
if (activeLeds[i] == ledPin) {
activeLeds[i] = 0;
break;
}
}
}
/*
-------------------------------------------------------------------------
Alle LED Modi
*/
void (*pLedModeFunc)() = static_leds; //Pointer zu einer Funktion, die der aktulle Beleuchtungsmodi ist
void resetMode() {
/*
bereitet das Programm darauf vor den Beleuchtungmode zu ändern
*/
//alle aktiven LEDs entfernen
for (int i = 0; i < 9; i++) {
activeLeds[i] = 0;
}
modeStep = 0;
}
void static_leds() {
//läst alle ausgewählten LED Gruppen leuchten
//solange inaktive Pins überspringen bis ein aktiver gefunden wird
while (activeLedPins[modeStep] == 0) {
modeStep += 1;
//current Step zurücksetzten wenn das Ende des Arrays erreicht wurde
if (modeStep >= 9) {
modeStep = 0;
return;
}
}
ledOn(activeLedPins[modeStep]);
modeStep += 1;
}
void snake_leds() {
/*
Alle LEDs werden nacheinander angeschaltet.
Wenn alle LEDs an sind werden alle wieder ausgeschaltet.
*/
//solange inaktive Pins überspringen bis ein aktiver gefunden wird
while (activeLedPins[modeStep] == 0) {
modeStep += 1;
//current Step zurücksetzten wenn das Ende des Arrays erreicht wurde
if (modeStep >= 9) {
delay(400);
resetMode();
return;
}
}
ledOn(activeLedPins[modeStep]);
modeStep += 1;
delay(400);
}
void random_leds() {
/*
Alle LEDs werden zufällig an- und dann wieder ausgeschaltet.
*/
int randomNumber = rand() % 10; // Returns a pseudo-random integer between 0 and 9.
if (activeLedPins[randomNumber] == 0) {
return;
}
Serial.print(randomNumber);
Serial.print(" --> ");
Serial.println(activeLedPins[randomNumber]);
ledOn(activeLedPins[randomNumber]);
delay(1000);
ledOff(activeLedPins[randomNumber]);
}
/*
Ende LED Modi
-------------------------------------------------------------------------
*/
bool checkIrInput() {
/*
checks if the IR-receiver detected an IR-input.
When an input is detected checks which button is pressed
and changes the led-lighting mode arccodingly
returns true when an IrInput was detected and false when there was
no Input detected
*/
//when the IR-receiver detects an input
if (irrecv.decode()) {
unsigned long remote_data = irrecv.decodedIRData.decodedRawData;
Serial.println(remote_data);
//checks which button got pressed on the remote
switch (remote_data) {
case value_1: // switch red leds
Serial.println("Toggle red leds");
toggleLedGroup(redLedPins, 3);
break;
case value_2: // switch green leds
Serial.println("Toggle green leds");
toggleLedGroup(greenLedPins, 3);
break;
case value_3: // switch blue leds
Serial.println("Toggle blue leds");
toggleLedGroup(blueLedPins, 3);
break;
case value_7:
//Random Beleuchtungsmode einschalten
resetMode();
pLedModeFunc = random_leds;
Serial.println("Mode changed to random_leds");
break;
case value_8:
//Snake Beleuchtungsmode einschalten
resetMode();
pLedModeFunc = snake_leds;
Serial.println("Mode changed to snake_leds");
break;
case value_9:
//statischer Beleuchtungsmodi einschalten
resetMode();
pLedModeFunc = static_leds;
Serial.println("Mode changed to static_leds");
break;
}
irrecv.resume();
return true;
}
return false;
}
void setup() {
irrecv.enableIRIn(); //enabling the IR-receiver
Serial.begin(9600); //Serial for debug printing
// initialise led pins as output pins
for (int i = 0; i < 3; i++) {
pinMode(redLedPins[i], OUTPUT);
pinMode(greenLedPins[i], OUTPUT);
pinMode(blueLedPins[i], OUTPUT);
}
Serial.println("Starting process finished");
}
void loop() {
if (checkIrInput()) {
Serial.println("Remote Input");
}
// Schalte alle LEDs aus
for (int i = 0; i < 9; i++) {
digitalWrite(allPins[i], LOW);
}
// Schalte alle LEDs ein
for (int i = 0; i < 9; i++) {
if (activeLeds[i] != 0) {
digitalWrite(activeLeds[i], HIGH);
}
}
// Schalte LEDs aus, die nicht leuchten sollten
for (int i = 0; i < 9; i++) {
bool active = false;
//überspringe inaktive Pins
if (activeLeds[i] == 0) {
continue;
}
for (int k = 0; k < 9; k++) {
//überspringe inaktive Pins
if (activeLedPins[k] == 0) {
continue;
}
if (activeLeds[i] == activeLedPins[k]) {
active = true;
break;
}
}
//schalte die LED aus, wenn sie nicht an sein sollte
if (!active) {
ledOff(activeLeds[i]);
}
}
pLedModeFunc(); //Beleuchtungsmodi ausführen
}