From 61035645d04693b57a25d3e86af5f708292f8777 Mon Sep 17 00:00:00 2001 From: Hiajen Hiajen Date: Sat, 8 Jan 2022 12:38:11 +0100 Subject: [PATCH] init --- script.c | 317 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 317 insertions(+) create mode 100644 script.c diff --git a/script.c b/script.c new file mode 100644 index 0000000..3a8053b --- /dev/null +++ b/script.c @@ -0,0 +1,317 @@ +#include +#include +#include +#include + +// PINS +const uint16_t irRecivePin = 14; // Pin of IR Diode +const uint16_t ledRedPin = 4; +const uint16_t ledGreenPin = 5; +const uint16_t ledBluePin = 0; + +// CONST VARS +const int mainLoopDelay = 50; +const int ledCycelSpeed = 50; +const int irReciveSpeed = 100; +const int maxColourRange = 256; + +// Struck +enum status { + NONE, STROBE, COLOR_FADE, FADE, COLOR_CHANGE +} status; + +//GLOBAL VARS +unsigned long key_value = 0; + +int currentRedValue = 0; +int currentGreenValue = 0; +int currentBlueValue = 0; +int dimmValue = 0; +bool cdirection = false; + +int deltaRedValue = 0; +int deltaGreenValue = 0; +int deltaBlueValue = 0; + +int loopTimerLEDController = 0; +int loopTimerIRReciver = 0; + +IRrecv irrecv(irRecivePin); +decode_results results; // store read IR values here + +void readIR(); +void controllLED(); +bool myTurn(int *timer, int target); + +void setup() { + Serial.begin(115200); + irrecv.enableIRIn(); // Start the receiver + while (!Serial) // Wait for the serial connection to be establised. + delay(50); + Serial.println(); + Serial.print("IRrecvDemo is now running and waiting for IR message on Pin "); + Serial.println(irRecivePin); + pinMode(ledRedPin, OUTPUT); + pinMode(ledGreenPin, OUTPUT); + pinMode(ledBluePin, OUTPUT); + + pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output + + randomSeed(analogRead(0)); + +} + +void loop() { + + readIR(); + controllLED(); + + delay(mainLoopDelay); // Mainloop delay timer + loopTimerLEDController += mainLoopDelay; + loopTimerIRReciver += mainLoopDelay; +} + +bool myTurn(int *timer, int target) { + if ((*timer) > target) { + (*timer) = ((*timer) % target); // reset timer and add rest value + return true; + } + return false; +} + +// Reads From set Pin IR values +// should only be executet 100mils delay +void readIR() { + if (!myTurn(&loopTimerIRReciver, irReciveSpeed)) + return; + + if (irrecv.decode(&results)) { + digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level + + serialPrintUint64(results.value, HEX); + Serial.println(""); + + switch (results.value) { + case 0xF700FF: // 1 - 1 | dimm less + dimmValue -= 25; + if (dimmValue < 0) + dimmValue = 0; + break; + case 0xF7807F: // 1 - 2 | dimm more + dimmValue += 25; + if (dimmValue > maxColourRange) + dimmValue = maxColourRange; + break; + case 0xF740BF: // 1 - 3 | random Colour + status = NONE; + currentRedValue = random(maxColourRange + 1); + currentGreenValue = random(maxColourRange + 1); + currentBlueValue = random(maxColourRange + 1); + dimmValue = 0; + break; + case 0xF7C03F: // 1 - 4 | OFF + status = NONE; + currentRedValue = 0; + currentGreenValue = 0; + currentBlueValue = 0; + break; + case 0xF720DF: // 2 - 1 | Red UP + status = NONE; + currentRedValue += 25; + if (currentRedValue > maxColourRange) + currentRedValue = maxColourRange; + break; + case 0xF7A05F: // 2 - 2 | Green UP + status = NONE; + currentRedValue += 25; + if (currentGreenValue > maxColourRange) + currentGreenValue = maxColourRange; + break; + case 0xF7609F: // 2 - 3 | Blue UP + status = NONE; + currentBlueValue += 25; + if (currentBlueValue > maxColourRange) + currentBlueValue = maxColourRange; + break; + case 0xF7E01F: // 2 - 4 | WHITE + status = NONE; + currentRedValue = maxColourRange; + currentGreenValue = maxColourRange; + currentBlueValue = maxColourRange; + break; + case 0xF710EF: // 3 - 1 | Red DOWN + status = NONE; + currentRedValue -= 25; + if (currentRedValue < 0) + currentRedValue = 0; + break; + case 0xF7906F: // 3 - 2 | Green DOWN + status = NONE; + currentRedValue -= 25; + if (currentGreenValue < 0) + currentGreenValue = 0; + break; + case 0xF750AF: // 3 - 3 | Blue DOWN + status = NONE; + currentBlueValue -= 25; + if (currentBlueValue < 0) + currentBlueValue = 0; + break; + case 0xF7D02F: // 3 - 4 | Party Colour + status = COLOR_CHANGE; + deltaRedValue = random(5) + 1; + deltaGreenValue = random(5) + 1; + deltaBlueValue = random(5) + 1; + break; + case 0xF730CF: // 4 - 1 | Dark Orange + status = NONE; + currentRedValue = 143; + currentGreenValue = 61; + currentBlueValue = 75; + break; + case 0xF7B04F: // 4 - 2 | Light BLue + status = NONE; + currentRedValue = 125; + currentGreenValue = 232; + currentBlueValue = 234; + break; + case 0xF7708F: // 4 - 3 | Purble + status = NONE; + currentRedValue = 106; + currentGreenValue = 58; + currentBlueValue = 79; + break; + case 0xF7F00F: // 4 - 4 | Party WHite + break; + case 0xF708F7: // 5 - 1 | Orange + status = NONE; + currentRedValue = 255; + currentGreenValue = 165; + currentBlueValue = 0; + break; + case 0xF78877: // 5 - 2 | Beige + status = NONE; + currentRedValue = 83; + currentGreenValue = 186; + currentBlueValue = 184; + break; + case 0xF748B7: // 5 - 3 | Lila + status = NONE; + currentRedValue = 220; + currentGreenValue = 44; + currentBlueValue = 108; + break; + case 0xF7C837: // 5 - 4 | Current colour fade + status = FADE; + break; + case 0xF728D7: // 6 - 1 | Yellow + status = NONE; + currentRedValue = 252; + currentGreenValue = 236; + currentBlueValue = 203; + break; + case 0xF7A857: // 6 - 2 | Ocean + status = NONE; + currentRedValue = 184; + currentGreenValue = 227; + currentBlueValue = 234; + break; + case 0xF76897: // 6 - 3 | Pink + status = NONE; + currentRedValue = 249; + currentGreenValue = 121; + currentBlueValue = 173; + break; + case 0xF7E817: // 6 - 4 | Colour fade shuffle + status = COLOR_FADE; + break; + } + + irrecv.resume(); // Receive the next value + + digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off by making the voltage HIGH + } +} + +void controllLED() { + if (myTurn(&loopTimerLEDController, ledCycelSpeed)) { + + switch (status) { + case FADE: + dimmValue += (cdirection == true ? -2 : 2); + if (dimmValue > maxColourRange || dimmValue < 0) + cdirection = !cdirection; + break; + case COLOR_FADE: + dimmValue += (cdirection == true ? -2 : 2); + if (dimmValue > maxColourRange + || (((currentRedValue - dimmValue) < 0) && (currentGreenValue - dimmValue) < 0 && (currentBlueValue - dimmValue) < 0)) + cdirection = !cdirection; + + if (dimmValue > maxColourRange) { + currentRedValue = random(maxColourRange + 1); + currentGreenValue = random(maxColourRange + 1); + currentBlueValue = random(maxColourRange + 1); + } + break; + } + + if (status != COLOR_CHANGE) { + deltaRedValue = 0; + deltaGreenValue = 0; + deltaBlueValue = 0; + } + + + currentRedValue += deltaRedValue; + if (currentRedValue > maxColourRange) { + currentRedValue = maxColourRange; + deltaRedValue *= -1; + } + if (currentRedValue < 0) { + currentRedValue = 0; + deltaRedValue *= -1; + } + + currentGreenValue += deltaGreenValue; + if (currentGreenValue > maxColourRange) { + currentGreenValue = maxColourRange; + deltaGreenValue *= -1; + } + if (currentGreenValue < 0) { + currentGreenValue = 0; + deltaGreenValue *= -1; + } + + currentBlueValue += deltaBlueValue; + if (currentBlueValue > maxColourRange) { + currentBlueValue = maxColourRange; + deltaBlueValue *= -1; + } + if (currentBlueValue < 0) { + currentBlueValue = 0; + deltaBlueValue *= -1; + } + } + + //if(deltaRedValue != 0) + int val = ((PWMRANGE / (((double)maxColourRange)) * (currentRedValue - dimmValue))); + if (val < 0) + val = 0; + + analogWrite(ledRedPin, val); + //if(deltaGreenValue != 0) + val = ((PWMRANGE / (((double)maxColourRange)) * (currentGreenValue - dimmValue))); + if (val < 0) + val = 0; + + analogWrite(ledGreenPin, val); + //if(deltaBlueValue != 0) + val = ((PWMRANGE / (((double)maxColourRange)) * (currentBlueValue - dimmValue))); + if (val < 0) + val = 0; + + analogWrite(ledBluePin, val); + + return; +} \ No newline at end of file