#include <FastLED.h>
#include "IRremote.hpp"
// #include <RCSwitch.h>
// RCSwitch mySwitch = RCSwitch();
// long ReceivedValue;
// RTC UDI
// #include <Wire.h>
#include <DS3231.h>
RTClib myRTC; // SOURCE
DS3231 myRTC_UDI;
// ESP32 ::
#define DATA_PIN 2
#define RF_RECEIVER 999999
#define IR_PIN 4
#define BUZZER_PIN 16
#define VIBRATION_PIN 5
// ARDUINO ::
// #define DATA_PIN 4
// #define RF_RECEIVER 0 // PIN NUM 2 !!!
// #define BUZZER_PIN 11
// #define IR_PIN 9999
int yearNow, monthNow, dayNow, hourNow, minuteNow, secondNow;
// Timing variables
unsigned long currentMillis_2;
unsigned long previousMillis_2 = 0;
unsigned long interval_2 = 20; // Adjust for speed of color change (milliseconds)
// Color tracking
int hue = 0; // Starting hue value for the rainbow effect
bool direction = true; // Forward or backward color transition
// int yearNow, monthNow, dayNow, hourNow, minuteNow, secondNow;
unsigned long lastMillis_IR = 0;
unsigned long debounceDelay = 300; // Time in milliseconds to debounce
int IR_code;
long currentMillis = 0;
long previousMillis = 0;
int interval = 10000;
bool isForceDisplay = true;
int x;
int mode = 1;
int lastMode = 0;
bool isModeChanged = false;
int delayBetweenLetters = 50;
// ================= SMALL IR REMOTE DEFINE
#define IR_KEY_1 69
#define IR_KEY_2 70
#define IR_KEY_3 71
#define IR_KEY_4 68
#define IR_KEY_5 64
#define IR_KEY_6 67
#define IR_KEY_7 7
#define IR_KEY_8 21
#define IR_KEY_9 9
#define IR_KEY_0 22
#define IR_KEY_STAR 25 // כוכבית (*)
#define IR_KEY_HASH 13 // סולמית (#)
#define IR_KEY_UP 24
#define IR_KEY_DOWN 82
#define IR_KEY_LEFT 8
#define IR_KEY_RIGHT 90
#define IR_KEY_OK 28
// SMALL REMOTE
#define FAST_REWIND_BTN 8
#define FAST_FORWARD_BTN 90
// BIG IR REMOTE
// #define SOURCE_BTN 1
// #define UP_ARROW 96
// #define DOWN_ARROW 97
// #define LEFT_ARROW 101
// #define RIGHT_ARROW 98
// #define RIGHT_ARROW_1 1728
// #define MIDDLE_ARROW 104
// #define UP_VOLUME 7
// #define DOWN_VOLUME 11
// #define CHANNEL_UP 18
// #define CHANNEL_DOWN 16
// #define RED_BUTTON 108
// #define GREEN_BUTTON 20
// #define YELLOW_BUTTON 21
// #define BLUE_BUTTON 22
// #define CONTENT_BUTTON 121
// #define MUTE_BUTTON 15
// #define POWER_BTN 2
// #define FAST_REWIND_BTN 69
// #define PLAY_BTN 71
// #define PAUSE_BTN 74
// #define FAST_FORWARD_BTN 72
// BIG IR REMOTE
// ============================ IR REMOTE DEFINE END
// FOR GPT effects
#define MATRIX_WIDTH 8
#define MATRIX_HEIGHT 8
// TEMPERATURE
#define TEMPERATURE_1 Tungsten100W
#define TEMPERATURE_2 OvercastSky
#define DISPLAYTIME 20 // How many seconds to show each temperature before switching
#define BLACKTIME 0 // How many seconds to show black between switches
#define DELAY_BETWEEN_LETTERS 50
#define NUM_LEDS 64
#define ONE 1
#define TWO 2
#define THREE 3
#define FOUR 4
#define FIVE 16
#define SIX 6
#define SEVEN 7
#define EIGHT 8
#define NINE 9
#define TEN 10
#define ELEVEN 11
#define TWELVE 12
#define MFIVE 5
#define MTEN 20
// #define AQUARTER 99
#define A 14
#define QUARTER 15
#define TWENTY 13
#define HALF 19
#define PAST 18
#define TO 17
#define ANDYDORO 99
int brightness = 160;
CRGB leds[NUM_LEDS];
CRGB colors[] = {
CRGB::Red,
CRGB::Green,
CRGB::Blue,
CRGB::Yellow,
CRGB::Cyan,
CRGB::Magenta,
CRGB::Orange,
CRGB::Purple,
CRGB::Aqua,
CRGB::Lime,
CRGB::Indigo,
CRGB::Teal,
CRGB::Turquoise,
CRGB::Gold,
CRGB::Maroon,
CRGB::Olive,
CRGB::Navy,
CRGB::SkyBlue,
CRGB::Coral,
CRGB::Lavender,
CRGB::Silver,
CRGB::Pink,
CRGB::White
};
/*
A T W E N T Y D
Q U A R T E R Y
F I V E H A L F
D P A S T O R O
F I V E I G H T
S I X T H R E E
T W E L E V E N
F O U R N I N E
*/
unsigned int wordsSelected[23];
unsigned int fourWordsSelected[4];
// Matrix ZigZag: // FLEXIBLE MATRIX
unsigned int arrWodrs[23][8] = { { 99, 99, 99, 99, 99, 99, 99 }, // ALL // LOC=0
{ 57, 60, 63, 99, 99, 99, 99 }, // ONE #1
{ 54, 55, 57, 99, 99, 99, 99 }, // two
{ 43, 44, 45, 46, 47, 99, 99 }, // three
{ 56, 57, 58, 59, 99, 99, 99 }, // 4
{ 20, 21, 22, 23, 99, 99, 99 }, // 5 // First five
{ 40, 41, 42, 99, 99, 99, 99 }, // 6
{ 40, 48, 49, 50, 51, 99, 99 }, // 7
{ 32, 33, 34, 35, 36, 99, 99 }, // 8
{ 60, 61, 62, 63, 99, 99, 99 }, // 9
{ 48, 51, 55, 99, 99, 99, 99 }, // #10
{ 48, 49, 50, 51, 52, 53, 99 }, // 11 #11
{ 49, 50, 52, 53, 54, 55, 99 }, // 12
{ 1, 2, 3, 4, 5, 6, 99 }, // TWENTY #13
{ 8, 9, 10, 11, 12, 13, 14 }, // QUARTER #14
{ 7, 99, 99, 99, 99, 99, 99 }, // A #15
{ 36, 37, 38, 39, 99, 99, 99 }, // FIVE - SECOND #16
{ 28, 29, 99, 99, 99, 99, 99 }, // TO // #17
{ 25, 26, 27, 28, 99, 99, 99 }, // PAST // #18
{ 16, 17, 18, 19, 99, 99, 99 }, // HALF #19
{ 3, 4, 6, 99, 99, 99, 99 }, // MTEN #20
{ 0, 0, 0 } }; // EMPTY
// "NINE" (reused same LEDs)
void setup() {
Serial.begin(115200);
IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
// mySwitch.enableReceive(RF_RECEIVER); // UDI gpio 13
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(VIBRATION_PIN, INPUT);
// MUST !!!! to use I2C RTC // UDI
Wire.begin();
displayTimeOnWordClock();
// BEEP();
// rainbowAnimation();
// showAllWords();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FastLED.clear();
// setWordRandColor(1);
// delay(99999999999999);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BEEP();
}
// ====================================================================== 101
void loop() {
lastMode = mode;
handleTimeRTC();
// handleVibration();
// getRF433();
// handle_RF_code_RECIEVED();
get_IR();
handleIR_code();
handleMode();
}
// ======================================================================
void handleIR_code() {
// Serial.print(" HERE 100:: ");
// Serial.println(IR_code);
switch (IR_code) {
case FAST_FORWARD_BTN: //012
Serial.print(" FAST_REWIND_BTN ");
if (minuteNow < 55) {
minuteNow += 5;
} else {
if (hourNow == 23) hourNow = 0;
else hourNow++;
myRTC_UDI.setHour(hourNow);
minuteNow = 0;
}
isForceDisplay = true;
myRTC_UDI.setMinute(minuteNow);
FastLED.clear();
displayTimeOnWordClock();
break;
case FAST_REWIND_BTN:
// mode = 98;
Serial.print(" FAST_REWIND_BTN ");
if (minuteNow > 5) {
minuteNow -= 5;
} else {
if (hourNow == 0) hourNow = 23;
else hourNow--;
myRTC_UDI.setHour(hourNow);
minuteNow = 59;
}
isForceDisplay = true;
myRTC_UDI.setMinute(minuteNow);
FastLED.clear();
displayTimeOnWordClock();
break;
case IR_KEY_1:
BEEP();
mode = 1;
Serial.print(" ==>> MODE=");
Serial.print(mode);
break;
case IR_KEY_2:
BEEP();
mode = 2;
Serial.print(" ==>> MODE=");
Serial.print(mode);
break;
case IR_KEY_3:
BEEP();
mode = 3;
Serial.print(" ==>> MODE=");
Serial.print(mode);
break;
case IR_KEY_4:
BEEP();
mode = 4;
Serial.print(" ==>> MODE=");
Serial.print(mode);
break;
case IR_KEY_5:
BEEP();
mode = 5;
Serial.print(" ==>> MODE=");
Serial.print(mode);
break;
case IR_KEY_6:
BEEP();
mode = 6;
Serial.print(" ==>> MODE=");
Serial.print(mode);
break;
case IR_KEY_7:
BEEP();
mode = 7;
Serial.print(" ==>> MODE=");
Serial.print(mode);
break;
case IR_KEY_8:
BEEP();
mode = 8;
Serial.print(" ==>> MODE=");
Serial.print(mode);
break;
case IR_KEY_9:
BEEP();
mode = 9;
Serial.print(" ==>> MODE=");
Serial.print(mode);
break;
;
}
}
void fastForwardBTN() {
delayBetweenLetters = 0;
if (minuteNow < 55) {
minuteNow += 5;
} else {
hourNow++;
myRTC_UDI.setHour(hourNow);
minuteNow = 0;
}
isForceDisplay = true;
myRTC_UDI.setMinute(minuteNow);
displayTimeOnWordClock();
delayBetweenLetters = 50;
}
void fastBackwardBTN() {
delayBetweenLetters = 0;
if (minuteNow > 5) {
minuteNow -= 5;
} else {
if (hourNow == 0) hourNow = 23;
else hourNow--;
myRTC_UDI.setHour(hourNow);
minuteNow = 55;
}
isForceDisplay = true;
myRTC_UDI.setMinute(minuteNow);
displayTimeOnWordClock();
delayBetweenLetters = 50;
}
void testMatrix() {
setWordRandColor(TEN);
delay(3000);
// allRed()
// for (x = 0; x < NUM_LEDS; x = x + 1) {
// leds[x] = CRGB::Red;
// delay(100);
// FastLED.show();
// }
showAllWords();
// setWordRandColor(ONE);
// delay(1000);
// setWordRandColor(TWO);
// delay(1000);
}
// FROM GPT 240921 :::::::::::::::::::
// Rainbow animation across the matrix
void rainbowAnimation() {
uint8_t hue = 0;
for (int x = 0; x < MATRIX_WIDTH; x++) {
for (int y = 0; y < MATRIX_HEIGHT; y++) {
leds[XY(x, y)] = CHSV(hue, 255, 255);
hue += 3; // Increment hue for rainbow effect
}
FastLED.show();
delay(50); // Adjust delay for speed of animation
}
}
// Color wipe effect - wipes across the matrix in a single color
void colorWipe(CRGB color, int wait) {
for (int x = 0; x < MATRIX_WIDTH; x++) {
for (int y = 0; y < MATRIX_HEIGHT; y++) {
leds[XY(x, y)] = color;
FastLED.show();
delay(wait);
}
}
}
void handleMode() {
if (lastMode != mode) {
// Serial.println(" >>>>> MEW MODE ");
// allBlack(); //Display.displayClear();
// setWordRandColor(48, delayBetweenLetters); // "UPDATE" TEXT
// if (mode < 10) setWordRandColor(mode, delayBetweenLetters);
// delay(1000);
}
switch (mode) {
case 1: // TimeOnWordClock
if (lastMode != mode) {
Serial.print(" mode: ");
Serial.print(mode);
isForceDisplay = true;
displayTimeOnWordClock();
} else {
displayTimeOnWordClock();
}
break;
case 2: // handleTemperatureEffect
if (lastMode != mode) {
Serial.print(" mode: ");
Serial.print(mode);
allBlack();
}
handleTemperatureEffect();
break;
case 3:
rainbowAnimation();
colorWipe(CRGB::Blue, 25);
break;
case 4:
if (lastMode != mode) {
Serial.print(" mode: ");
Serial.print(mode);
FastLED.clear();
showAllWords();
}
break;
case 5: // CASE SNAKE
// startNewGame();
// while (IR_code != POWER_BTN) {
// SNAKE_handle_IR();
// if (isGameOver) {
// // checkStartButton();
// } else {
// moveSnake();
// checkCollision();
// drawSnake();
// FastLED.show();
// delay(200);
// }
// }
// mode = 6;
break;
case 6:
allRed();
break;
case 7:
allGreen();
break;
case 8:
allBlue();
break;
case 9:
if (lastMode != mode) {
FastLED.clear();
int myDelay = 100;
// draw drawSquare :
for (int i = 1; i <= 16; i++) {
drawSquare(0, 0, i, CRGB::Red);
delay(myDelay);
drawSquare(0, 0, i, CRGB::Black);
drawSquare(0, 0, i, CRGB::Blue);
delay(myDelay);
drawSquare(0, 0, i, CRGB::Black);
// delay(meDelay);
}
}
break;
case 98:
break;
case 99:
break;
}
}
void get_IR() {
IR_code = 0;
if (IrReceiver.decode()) {
// Serial.println("Receiver IR Code");
unsigned long currentMillis_IR = millis();
if (currentMillis_IR - lastMillis_IR > debounceDelay) {
IR_code = IrReceiver.decodedIRData.command;
Serial.println();
handleIR_code();
Serial.print(" || IR_code: ");
Serial.print(IR_code);
Serial.print(" ");
Serial.println(" ");
lastMillis_IR = currentMillis_IR; // Update the last valid button press time
}
IrReceiver.resume();
// BEEP();
}
}
void handleTimeRTC() {
DateTime now = myRTC.now();
yearNow = now.year();
monthNow = now.month();
dayNow = now.day();
hourNow = now.hour();
minuteNow = now.minute();
secondNow = now.second();
// Serial.print(now.year(), DEC);
// Serial.print('/');
// Serial.print(now.month(), DEC);
// Serial.print('/');
// Serial.print(now.day(), DEC);
// Serial.print(' ');
// Serial.print(now.hour(), DEC);
// Serial.print(':');
// Serial.print(now.minute(), DEC);
// Serial.print(':');
// Serial.print(now.second(), DEC);
// Serial.println();
}
void selectWordInAraay(int wordNum) {
wordsSelected[wordNum] = 1;
}
void printMonitorSelectWordInArray() { // 1216
Serial.println();
Serial.print(" wordsSelected: ");
// for (int i = 0; i < 23; i++) {
// Serial.print(" ");
// Serial.print(wordsSelected[i]);
// }
int wordSelect = 0;
for (int i = 0; i < 23; i++) {
if (wordsSelected[i] == 1) {
Serial.print(" ");
Serial.print(i);
Serial.print(" ");
fourWordsSelected[wordSelect] = i;
wordSelect++;
}
}
Serial.println();
}
void displayTimeOnWordClock() {
currentMillis = millis();
if (currentMillis - previousMillis > interval || isForceDisplay) {
previousMillis = millis();
isForceDisplay = false;
clearMatrix();
// 241217 CLEAN four Selected Words
for (int i = 0; i < 4; i++) {
fourWordsSelected[i] = 0;
}
prepareFourSelectedWords();
for (int i = 0; i < 4; i++) {
setWordRandColor(fourWordsSelected[i]);
Serial.println(fourWordsSelected[i]);
// delay(500); // 241216
}
}
}
// void displayTimeOnWordClock(void) {
void prepareFourSelectedWords(void) { // 013
clearMatrix(); // udi 241210
Serial.println(" void prepareFourSelectedWords() ");
for (int i = 0; i < 23; i++) {
wordsSelected[i] = 0;
}
DateTime thetime = myRTC.now();
// yearNow = thetime.year();
// monthNow = thetime.month();
// dayNow = thetime.day();
// hourNow = thetime.hour();
// minuteNow = thetime.minute();
// secondNow = thetime.second();
// print the time to Monitor
Serial.print(thetime.year(), DEC);
Serial.print('/');
Serial.print(thetime.month(), DEC);
Serial.print('/');
Serial.print(thetime.day(), DEC);
Serial.print(' ');
Serial.print(thetime.hour(), DEC);
Serial.print(':');
Serial.print(thetime.minute(), DEC);
Serial.print(':');
Serial.print(thetime.second(), DEC);
Serial.println();
// time we display the appropriate thetime.minute() counter
if ((thetime.minute() > 4) && (thetime.minute() < 10)) {
selectWordInAraay(MFIVE);
}
if ((thetime.minute() > 9) && (thetime.minute() < 15)) {
selectWordInAraay(MTEN);
}
if ((thetime.minute() > 14) && (thetime.minute() < 20)) {
selectWordInAraay(A);
selectWordInAraay(QUARTER);
}
if ((thetime.minute() > 19) && (thetime.minute() < 25)) {
//setWordRandColor(TWENTY);
selectWordInAraay(TWENTY);
// Serial.print("twenty");
}
if ((thetime.minute() > 24) && (thetime.minute() < 30)) {
//setWordRandColor(TWENTY);
selectWordInAraay(TWENTY);
//setWordRandColor(MFIVE);
selectWordInAraay(MFIVE);
// Serial.print("twenty five");
}
if ((thetime.minute() > 29) && (thetime.minute() < 35)) {
//setWordRandColor(HALF);
selectWordInAraay(HALF);
// Serial.print("half");
}
if ((thetime.minute() > 34) && (thetime.minute() < 40)) {
//setWordRandColor(TWENTY);
selectWordInAraay(TWENTY);
//setWordRandColor(MFIVE);
selectWordInAraay(MFIVE);
// Serial.print("twenty five");
}
if ((thetime.minute() > 39) && (thetime.minute() < 45)) {
//setWordRandColor(TWENTY);
selectWordInAraay(TWENTY);
// Serial.print("twenty");
}
if ((thetime.minute() > 44) && (thetime.minute() < 50)) {
//setWordRandColor(A);
selectWordInAraay(A);
//setWordRandColor(QUARTER);
selectWordInAraay(QUARTER);
// Serial.print("a quarter");
}
if ((thetime.minute() > 49) && (thetime.minute() < 55)) {
//setWordRandColor(MTEN);
selectWordInAraay(MTEN);
// Serial.print("ten");
}
if (thetime.minute() > 54) {
//setWordRandColor(MFIVE);
selectWordInAraay(MFIVE);
// Serial.print("five");
}
if ((thetime.minute() < 5)) {
switch (thetime.hour()) {
case 1:
case 13:
//setWordRandColor(ONE);
selectWordInAraay(ONE);
break;
case 2:
case 14:
//setWordRandColor(TWO);
selectWordInAraay(TWO);
break;
case 3:
case 15:
//setWordRandColor(THREE);
selectWordInAraay(THREE);
break;
case 4:
case 16:
//setWordRandColor(FOUR);
selectWordInAraay(FOUR);
break;
case 5:
case 17:
//setWordRandColor(FIVE);
selectWordInAraay(FIVE);
break;
case 6:
case 18:
//setWordRandColor(SIX);
selectWordInAraay(SIX);
break;
case 7:
case 19:
//setWordRandColor(SEVEN);
selectWordInAraay(SEVEN);
break;
case 8:
case 20:
//setWordRandColor(EIGHT);
selectWordInAraay(EIGHT);
break;
case 9:
case 21:
//setWordRandColor(NINE);
selectWordInAraay(NINE);
break;
case 10:
case 22:
//setWordRandColor(TEN);
selectWordInAraay(TEN);
break;
case 11:
case 23:
selectWordInAraay(ELEVEN);
break;
case 0:
case 12:
case 24:
selectWordInAraay(TWELVE);
break;
}
} else if ((thetime.minute() <= 34) && (thetime.minute() > 4)) {
//setWordRandColor(PAST);
selectWordInAraay(PAST);
// Serial.print(" past ");
switch (thetime.hour()) {
case 1:
case 13:
//setWordRandColor(ONE);
selectWordInAraay(ONE);
break;
case 2:
case 14:
//setWordRandColor(TWO);
selectWordInAraay(TWO);
break;
case 3:
case 15:
//setWordRandColor(THREE);
selectWordInAraay(THREE);
break;
case 4:
case 16:
//setWordRandColor(FOUR);
selectWordInAraay(FOUR);
break;
case 5:
case 17:
//setWordRandColor(FIVE);
selectWordInAraay(FIVE);
break;
case 6:
case 18:
//setWordRandColor(SIX);
selectWordInAraay(SIX);
break;
case 7:
case 19:
//setWordRandColor(SEVEN);
selectWordInAraay(SEVEN);
break;
case 8:
case 20:
//setWordRandColor(EIGHT);
selectWordInAraay(EIGHT);
break;
case 9:
case 21:
//setWordRandColor(NINE);
selectWordInAraay(NINE);
break;
case 10:
case 22:
selectWordInAraay(TEN);
break;
case 11:
case 23:
selectWordInAraay(ELEVEN);
break;
case 0:
case 12:
case 24:
selectWordInAraay(TWELVE);
break;
}
// } else { // udi changed 241012
} else if ((thetime.minute() >= 35) && (thetime.minute() <= 59)) {
// if we are greater than 34 minutes past the hour then display
// the next hour, as we will be displaying a 'to' sign
// Add "TO"
if ((thetime.minute() >= 35) && (thetime.minute() <= 55)) {
selectWordInAraay(TO);
Serial.println();
Serial.print(" >>>>>>>>>>>>>>>>>>>>>>>>>> selectWordInAraay(TOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO) ");
Serial.println();
}
switch (thetime.hour()) {
case 1:
case 13:
selectWordInAraay(TWO);
break;
case 14:
case 2:
selectWordInAraay(THREE);
break;
case 15:
case 3:
//setWordRandColor(FOUR);
selectWordInAraay(FOUR);
break;
case 4:
case 16:
//setWordRandColor(FIVE);
selectWordInAraay(FIVE);
break;
case 5:
case 17:
//setWordRandColor(SIX);
selectWordInAraay(SIX);
break;
case 6:
case 18:
//setWordRandColor(SEVEN);
selectWordInAraay(SEVEN);
break;
case 7:
case 19:
//setWordRandColor(EIGHT);
selectWordInAraay(EIGHT);
break;
case 8:
case 20:
//setWordRandColor(NINE);
selectWordInAraay(NINE);
break;
case 9:
case 21:
//setWordRandColor(TEN);
selectWordInAraay(TEN);
break;
case 10:
case 22:
//setWordRandColor(ELEVEN);
selectWordInAraay(ELEVEN);
break;
case 11:
case 23:
//setWordRandColor(TWELVE);
selectWordInAraay(TWELVE);
break;
case 0:
case 12:
case 24:
//setWordRandColor(ONE);
selectWordInAraay(ONE);
break;
}
}
// Serial.println();
// applyMask(); // apply phrase mask to colorshift function
printMonitorSelectWordInArray();
}
// ======= NEW ================================
void showWord(int wordNum, CRGB color) {
Serial.println();
Serial.print("showWord:: ");
for (int i = 0; i < 7; i++) {
leds[arrWodrs[wordNum][i]] = color;
// Serial.print(" wordNum:: ");
// Serial.print(wordNum);
// Serial.print(" ");
// Serial.print(i);
// Serial.print(" ");
// Serial.print(arrWodrs[wordNum][i]);
}
Serial.println("END SHOW WORD");
FastLED.show();
}
void showAllWords() {
Serial.println(" ===================");
Serial.println("void showAllWords() ");
Serial.println(" =================== ");
for (int i = 1; i <= 20; i++) {
setWordRandColor(i);
// Serial.print
delay(200);
deleteWord(i);
}
}
void deleteWord(int wordNum) {
showWord(wordNum, CRGB::Black);
}
// void setWordRandColor(int wordNum, int myDelayBetweenLetters) {
void setWordRandColor(int wordNum) {
// randomSeed(analogRead(0));
int myRandom = random(0, 16);
CRGB myColor = colors[myRandom];
showWord(wordNum, myColor);
// setLED(arrWodrs[wordNum][0], arrWodrs[wordNum][1], myColor, 1, myDelayBetweenLetters);
}
void showAllColorsToWord(int wordNum, int myDelay) { // udi2
for (int i = 0; i <= 17; i++) {
CRGB myColor = colors[i];
setWordColor(wordNum, myColor, 0);
Serial.println();
Serial.print("WORD:");
Serial.print(wordNum);
Serial.print(" COLOR:");
Serial.println(i);
delay(myDelay);
}
}
void clearMatrix() {
Serial.println(" === === void clearMatrix()");
FastLED.clear();
FastLED.show();
// delay(500);
}
void setLED(int ledNrFrom, int ledNrTo, CRGB color, int switchOn, int myDelayBetweenLetters) {
if (ledNrFrom > ledNrTo) {
for (int i = ledNrFrom; i >= ledNrTo; i--) {
leds[i] = color;
//udi
if (myDelayBetweenLetters > 0) {
delay(myDelayBetweenLetters);
FastLED.show();
}
}
} else {
for (int i = ledNrFrom; i <= ledNrTo; i++) {
leds[i] = color;
//udi
if (myDelayBetweenLetters > 0) {
delay(myDelayBetweenLetters);
FastLED.show();
}
}
}
if (switchOn == 0) {
for (int i = ledNrFrom; i <= ledNrTo; i++) {
leds[i] = CRGB::Black;
}
}
FastLED.show();
}
void setWordColor(int wordNum, CRGB color, int myDelayBetweenLetters) {
setLED(arrWodrs[wordNum][0], arrWodrs[wordNum][1], color, 1, myDelayBetweenLetters);
}
// int getLEDNumber(int x, int y) {
// if (y % 2 == 0) {
// return y * 8 + x;
// } else {
// return y * 8 + (7 - x);
// }
// }
void BEEP() {
Serial.println("BEEP()");
digitalWrite(BUZZER_PIN, HIGH);
delay(100);
digitalWrite(BUZZER_PIN, LOW);
delay(100);
}
void allBlue() {
clearMatrix();
// for (x = 16; x < 24; x = x + 1) {
// leds[x] = CRGB::Blue;
// // delay(ledSpeed);
// }
// FastLED.show();
// delay(1000);
for (x = 0; x < NUM_LEDS; x = x + 1) {
leds[x] = CRGB::Blue;
// delay(1);
// delay(ledSpeed);
}
FastLED.show();
// colorMode = 3;
}
void allRed() {
clearMatrix();
// for (x = 0; x < 8; x = x + 1) {
// leds[x] = CRGB::Red;
// // delay(ledSpeed);
// }
// FastLED.show();
// delay(1000);
for (x = 0; x < NUM_LEDS; x = x + 1) {
leds[x] = CRGB::Red;
// delay(ledSpeed);
}
FastLED.show();
// colorMode = 1;
}
void allPurple() {
for (x = 0; x < NUM_LEDS; x = x + 1) {
leds[x] = CRGB::Purple;
FastLED.show();
// delay(ledSpeed);
}
}
void allGreen() {
clearMatrix();
// for (x = 8; x < 16; x = x + 1) {
// leds[x] = CRGB::Green;
// // delay(ledSpeed);
// }
// FastLED.show();
// delay(1000);
for (x = 0; x < NUM_LEDS; x = x + 1) {
leds[x] = CRGB::Green;
// delay(ledSpeed);
}
FastLED.show();
// colorMode = 2;
}
void allOrange() {
for (x = 0; x < NUM_LEDS; x = x + 1) {
leds[x] = CRGB::Orange;
FastLED.show();
// delay(ledSpeed);
}
}
void displayTime_Effect_B() { // 011
currentMillis = millis();
if (currentMillis - previousMillis > interval || isForceDisplay) {
previousMillis = millis();
isForceDisplay = false;
clearMatrix();
prepareFourSelectedWords();
}
static uint8_t starthue = 0;
// Example: Define specific LED indices to apply rainbow effect
// GOOD
// int word_indices[] = { 5, 10, 15, 20, 25, 30, 35 }; // Replace with actual LED indices for your letters/words
int word_indices[28];
for (int i = 0; i < 7; i++) {
word_indices[i] = arrWodrs[fourWordsSelected[0]][i];
word_indices[i + 7] = arrWodrs[fourWordsSelected[1]][i];
word_indices[i + 14] = arrWodrs[fourWordsSelected[2]][i];
word_indices[i + 21] = arrWodrs[fourWordsSelected[3]][i];
}
int num_words = sizeof(word_indices) / sizeof(word_indices[0]);
// Create a temporary array to hold the colors
CRGB temp_leds[num_words];
// Apply fill_rainbow to the temporary array
fill_rainbow(temp_leds, num_words, --starthue, 20);
// Now map the rainbow colors to the specific LEDs
// udi test 1 = was 0
for (int i = 0; i < num_words; i++) {
leds[word_indices[i]] = temp_leds[i];
}
// Choose the temperature profile
uint8_t secs = (millis() / 1000) % (DISPLAYTIME * 2);
if (secs < DISPLAYTIME) {
FastLED.setTemperature(TEMPERATURE_1); // First temperature
} else {
FastLED.setTemperature(TEMPERATURE_2); // Second temperature
}
// Black out the LEDs for a few seconds between color changes
if ((secs % DISPLAYTIME) < BLACKTIME) {
memset8(leds, 0, NUM_LEDS * sizeof(CRGB));
}
FastLED.show();
FastLED.delay(16);
}
void handleTemperatureEffect() {
// draw a generic, no-name rainbow
static uint8_t starthue = 0;
// fill_rainbow( leds + 5, NUM_LEDS - 5, --starthue, 20);
fill_rainbow(leds, NUM_LEDS, --starthue, 20);
// Choose which 'color temperature' profile to enable.
uint8_t secs = (millis() / 1000) % (DISPLAYTIME * 2);
if (secs < DISPLAYTIME) {
FastLED.setTemperature(TEMPERATURE_1); // first temperature
// leds[0] = TEMPERATURE_1; // show indicator pixel
} else {
FastLED.setTemperature(TEMPERATURE_2); // second temperature
// leds[0] = TEMPERATURE_2; // show indicator pixel
}
// Black out the LEDs for a few secnds between color changes
// to let the eyes and brains adjust
if ((secs % DISPLAYTIME) < BLACKTIME) {
memset8(leds, 0, NUM_LEDS * sizeof(CRGB));
}
FastLED.show();
FastLED.delay(8);
}
void handleTemperatureEffectFullScreen() { // 015
// draw a generic, no-name rainbow
static uint8_t starthue = 0;
fill_rainbow(leds, NUM_LEDS, --starthue, 20); // fill_rainbow( leds + 5, NUM_LEDS - 5, --starthue, 20);
// fill_rainbow(leds, NUM_LEDS, --starthue, 20);
// Choose which 'color temperature' profile to enable.
uint8_t secs = (millis() / 1000) % (DISPLAYTIME * 2);
if (secs < DISPLAYTIME) {
FastLED.setTemperature(TEMPERATURE_1); // first temperature
// leds[0] = TEMPERATURE_1; // show indicator pixel
} else {
FastLED.setTemperature(TEMPERATURE_2); // second temperature
// leds[0] = TEMPERATURE_2; // show indicator pixel
}
// Black out the LEDs for a few secnds between color changes
// to let the eyes and brains adjust
if ((secs % DISPLAYTIME) < BLACKTIME) {
memset8(leds, 0, NUM_LEDS * sizeof(CRGB));
}
FastLED.show();
FastLED.delay(16); // FastLED.delay(8);
}
void handleTemperatureEffect_Udi() {
// draw a generic, no-name rainbow
static uint8_t starthue = 0;
// arrWodrs[23][8]
// fill_rainbow(word_indices, 7, --starthue, 20);
// udi test
// fill_rainbow(leds, NUM_LEDS, --starthue, 20);
// Choose which 'color temperature' profile to enable.
uint8_t secs = (millis() / 1000) % (DISPLAYTIME * 2);
if (secs < DISPLAYTIME) {
FastLED.setTemperature(TEMPERATURE_1); // first temperature
// leds[0] = TEMPERATURE_1; // show indicator pixel
} else {
FastLED.setTemperature(TEMPERATURE_2); // second temperature
// leds[0] = TEMPERATURE_2; // show indicator pixel
}
// Black out the LEDs for a few secnds between color changes
// to let the eyes and brains adjust
if ((secs % DISPLAYTIME) < BLACKTIME) {
memset8(leds, 0, NUM_LEDS * sizeof(CRGB));
}
FastLED.show();
FastLED.delay(16); // FastLED.delay(8);
}
// UDI from GPT ============================================
void drawSquare(int x, int y, int side, CRGB color) {
for (int i = 0; i < side; i++)
for (int j = 0; j < side; j++) {
if (x + i < MATRIX_WIDTH && y + j < MATRIX_HEIGHT) {
leds[XY(x + i, y + j)] = color;
}
}
FastLED.show();
}
// Function to convert 2D coordinates to the index in the LEDs array
int XY(int x, int y) {
// Assumes a serpentine layout (zigzag pattern)
// if (isMatrixLeftToRight) return (y * MATRIX_WIDTH) + x;
if (y % 2 == 0) {
return (y * MATRIX_WIDTH) + x;
} else {
return (y * MATRIX_WIDTH) + (MATRIX_WIDTH - 1 - x);
}
}
// UDI from GPT ============================================
void allBlack() {
setWordColor(0, CRGB::Black, 0);
}
// case RIGHT_ARROW:
// // case RIGHT_ARROW_1:
// // songNum++;
// // mp3.playWithFileName(folderNum, songNum);
// Serial.println("RightButton");
// break;
// case LEFT_ARROW:
// // songNum--;
// // mp3.playWithFileName(folderNum, songNum);
// Serial.println("LEFT_ARROW");
// break;
// case UP_ARROW:
// Serial.println("UP_ARROW");
// break;
// case DOWN_ARROW:
// Serial.println("DOWN_ARROW");
// break;
// // case UP_VOLUME:
// // vol += 1;
// // mp3.setVolume(vol);
// // Serial.print("DownButton, VOL: ");
// // Serial.println(vol);
// // break;
// // case DOWN_VOLUME:
// // vol -= 1;
// // mp3.setVolume(vol);
// // Serial.print("DownButton, VOL: ");
// // Serial.println(vol);
// // break;
// BTN ARROW 17 // 24.12.21
// #define BLACK_BUTTON 68924 // BTN_ARR_99_06
// #define RED_BUTTON 68927 // BTN_ARR_99_07
// #define GREEN_BUTTON 69104 // BTN_ARR_99_08
// #define BLUE_BUTTON 69059 // BTN_ARR_99_09
// #define BRIGHTNESS_UP 68867 // BTN_ARR_99_01
// #define BRIGHTNESS_DOWN 68876 // BTN_ARR_99_02
// #define CLOCK_MODE_BTN 69071 // BTN_ARR_99_05
// #define FAST_FORWARD_BTN 68880 // BTN_ARR_99_18
// #define FAST_REWIND_BTN 68864 // BTN_ARR_99_16
// #define MODE_UP_BTN 69068 // BTN_ARR_99_04
// #define MODE_DOWN_BTN 68912 // BTN_ARR_99_03
// ARROW 5 // HOME 2023 04 25
// #define BTN_ARR_5_01 217347
// #define BTN_ARR_5_02 217356
// #define BTN_ARR_5_03 217392
// #define BTN_ARR_5_04 217548
// #define BTN_ARR_5_05 217551
// #define BTN_ARR_5_06 217404
// #define BTN_ARR_5_07 217407
// #define BTN_ARR_5_08 217584
// #define BTN_ARR_5_09 217539
// NO
// #define BTN_ARR_5_10 213775
// #define BTN_ARR_5_11 214012
// #define BTN_ARR_5_12 214003
// #define BTN_ARR_5_13 214015
// #define BTN_ARR_5_14 213952
// #define BTN_ARR_5_15 213811
// #define BTN_ARR_5_16 217344
// #define BTN_ARR_5_17 217408
// #define BTN_ARR_5_18 217360
// BTN ARROW 99 // 26.04.2023
// #define BTN_ARR_99_01 200451
// #define BTN_ARR_99_02 200460
// #define BTN_ARR_99_03 200496
// #define BTN_ARR_99_04 200652
// #define BTN_ARR_99_05 200655
// #define BTN_ARR_99_06 200508
// #define BTN_ARR_99_07 200511
// #define BTN_ARR_99_08 200688
// #define BTN_ARR_99_09 200643
// #define BTN_ARR_99_10 200463
// #define BTN_ARR_99_11 200700
// #define BTN_ARR_99_12 200691
// #define BTN_ARR_99_13 200703
// #define BTN_ARR_99_14 200640
// #define BTN_ARR_99_15 200499
// #define BTN_ARR_99_16 200448
// #define BTN_ARR_99_17 200512
// #define BTN_ARR_99_18 200464
// #define BLACK_BUTTON BTN_ARR_99_06
// #define RED_BUTTON BTN_ARR_99_07
// #define GREEN_BUTTON BTN_ARR_99_08
// #define BLUE_BUTTON BTN_ARR_99_09
// #define BRIGHTNESS_UP BTN_ARR_99_01
// #define BRIGHTNESS_DOWN BTN_ARR_99_02
// #define CLOCK_MODE_BTN BTN_ARR_99_05
// #define FAST_FORWARD_BTN BTN_ARR_99_18
// #define FAST_REWIND_BTN BTN_ARR_99_16
// #define MODE_UP_BTN BTN_ARR_99_04
// #define MODE_DOWN_BTN BTN_ARR_99_03
////// BTN ARROW 99 // 26.04.2023
// OLD:
// #define BTN_ARR_3_01 521987
// #define BTN_ARR_3_02 521996
// #define BTN_ARR_3_03 522032
// #define BTN_ARR_3_04 522188
// #define BTN_ARR_3_05 522191
// #define BTN_ARR_3_06 522044
// #define BTN_ARR_3_07 522047
// #define BTN_ARR_3_08 522224
// #define BTN_ARR_3_09 522179
// #define BTN_ARR_3_10 521999
// #define BTN_ARR_3_11 522236
// #define BTN_ARR_3_12 522227
// #define BTN_ARR_3_16 521984
// #define BTN_ARR_3_17 522048
// #define BTN_ARR_3_18 522000
//////////////////// ARROW 3 // 8.2.23 // 555555555555
// #define BLACK_BUTTON BTN_ARR_5_06
// #define RED_BUTTON BTN_ARR_5_07
// #define GREEN_BUTTON BTN_ARR_5_08
// #define BLUE_BUTTON BTN_ARR_5_09
// #define BRIGHTNESS_UP BTN_ARR_5_01
// #define BRIGHTNESS_DOWN BTN_ARR_5_02
// #define CLOCK_MODE_BTN BTN_ARR_5_05
// #define FAST_FORWARD_BTN BTN_ARR_5_18
// #define FAST_REWIND_BTN BTN_ARR_5_16
// #define MODE_UP_BTN BTN_ARR_5_04
// #define MODE_DOWN_BTN BTN_ARR_5_03
//////////////////// ARROW 3 // 8.2.23 // 33333333333333
// #define BLACK_BUTTON BTN_ARR_3_06
// #define RED_BUTTON BTN_ARR_3_07
// #define GREEN_BUTTON BTN_ARR_3_08
// #define BLUE_BUTTON BTN_ARR_3_09
// #define BRIGHTNESS_UP BTN_ARR_3_01
// #define BRIGHTNESS_DOWN BTN_ARR_3_02
// #define CLOCK_MODE_BTN BTN_ARR_3_05
// #define FAST_FORWARD_BTN BTN_ARR_3_18
// #define FAST_REWIND_BTN BTN_ARR_3_16
// ============================ IR REMOTE
// #define SOURCE_BTN 1
// #define UP_ARROW 96
// #define DOWN_ARROW 97
// #define LEFT_ARROW 101
// #define RIGHT_ARROW 98
// #define RIGHT_ARROW_1 1728
// #define MIDDLE_ARROW 104
// #define UP_VOLUME 7
// #define DOWN_VOLUME 11
// #define CHANNEL_UP 18
// #define CHANNEL_DOWN 16
// #define RED_BUTTON 108
// #define GREEN_BUTTON 20
// #define YELLOW_BUTTON 21
// #define BLUE_BUTTON 22
// #define CONTENT_BUTTON 121
// #define MUTE_BUTTON 15
// #define POWER_BTN 2
// #define FAST_REWIND_BTN 69
// #define PLAY_BTN 71
// #define PAUSE_BTN 74
// #define FAST_FORWARD_BTN 72
void getRF433() {
// ReceivedValue = 0;
// if (mySwitch.available()) {
// if (mySwitch.getReceivedValue()) {
// ReceivedValue = mySwitch.getReceivedValue();
// }
// mySwitch.resetAvailable();
// }
// delay(5);
// if (ReceivedValue != 0) Serial.println(ReceivedValue);
}
void handle_RF_code_RECIEVED() { // udi15
// switch (ReceivedValue) {
// case BLACK_BUTTON: //MIDDLE_ARROW:
// BEEP();
// mode = 1;
// allBlack();
// break;
// case RED_BUTTON:
// BEEP();
// mode = 1;
// allRed();
// break;
// case GREEN_BUTTON:
// BEEP();
// mode = 1;
// allGreen();
// break;
// // case YELLOW_BUTTON:
// // mode = 1;
// // allOrange();
// // break;
// case BLUE_BUTTON:
// BEEP();
// mode = 1;
// allBlue();
// break;
// case BRIGHTNESS_UP: // UP_VOLUME:
// BEEP();
// if (brightness < 200) brightness += 20;
// else {
// BEEP();
// BEEP();
// BEEP();
// }
// FastLED.setBrightness(brightness);
// FastLED.show();
// Serial.print(" UP_VOLUME");
// Serial.print(" brightness:");
// Serial.print(brightness);
// break;
// case BRIGHTNESS_DOWN: // DOWN_VOLUME:
// BEEP();
// if (brightness > 21) brightness -= 20;
// else {
// BEEP();
// BEEP();
// BEEP();
// }
// FastLED.setBrightness(brightness);
// FastLED.show();
// Serial.print(" DOWN_VOLUME");
// Serial.print(" brightness:");
// Serial.print(brightness);
// // BEEP(3);
// break;
// case CLOCK_MODE_BTN:
// BEEP();
// mode = 1;
// Serial.print(" SOURCE_BTN ");
// break;
// case FAST_FORWARD_BTN:
// case BTN_C:
// Serial.print(" FAST_FORWARD_BTN ");
// fastForwardBTN();
// break;
// case FAST_REWIND_BTN: //010
// case BTN_D:
// // mode = 98;
// Serial.print(" FAST_REWIND_BTN ");
// fastBackwardBTN();
// break;
// case MODE_UP_BTN: // MODE UP
// case BTN_A:
// BEEP();
// if (mode < 8) mode++;
// else mode = 1;
// Serial.print("CHANNEL_UP");
// Serial.print(" MODE=");
// Serial.print(mode);
// break;
// case MODE_DOWN_BTN: // MODE DOWN
// BEEP();
// if (mode > 1) mode--;
// // else mode = 1;
// Serial.print("CHANNEL_UP");
// Serial.print(" MODE=");
// Serial.print(mode);
// // displayMode();
// break;
// }
// Serial.println();
}
// RF CODES
// #define BTN_A 16736113
// #define BTN_B 16642212
// #define BTN_C 16736114
// #define BTN_D 16736120
//////////////////// ARROW 3 // 19.11.24 // RF433
// #define BTN_ARR_3_01 789763
// #define BTN_ARR_3_02 789772
// #define BTN_ARR_3_03 789808
// #define BTN_ARR_3_04 789964
// #define BTN_ARR_3_05 789967
// #define BTN_ARR_3_06 789820
// #define BTN_ARR_3_07 789823
// #define BTN_ARR_3_08 790000
// #define BTN_ARR_3_09 789955
// #define BTN_ARR_3_10 789775
// #define BTN_ARR_3_11 790012
// #define BTN_ARR_3_12 790003
// #define BTN_ARR_3_16 789760
// #define BTN_ARR_3_17 789824
// #define BTN_ARR_3_18 789776
// BTN ARROW 99 // 17.01.25
// #define BRIGHTNESS_UP 200451 // BTN_ARR_99_01
// #define BRIGHTNESS_DOWN 200460 // BTN_ARR_99_02
// #define MODE_DOWN_BTN 200496 // BTN_ARR_99_03
// #define MODE_UP_BTN 200652 // BTN_ARR_99_04
// #define CLOCK_MODE_BTN 200655 // BTN_ARR_99_05
// #define BLACK_BUTTON 200508 // BTN_ARR_99_06
// #define RED_BUTTON 200511 // BTN_ARR_99_07
// #define GREEN_BUTTON 200688 // BTN_ARR_99_08
// #define BLUE_BUTTON 200643 // BTN_ARR_99_09
// #define FAST_REWIND_BTN 200448 // BTN_ARR_99_16
// #define FAST_FORWARD_BTN 200464 // BTN_ARR_99_18
// #define BTN_ARR_99_11 200700
// #define BTN_ARR_99_12 200691
// #define BTN_ARR_99_13 200703
// #define BTN_ARR_99_14 200640
// #define BTN_ARR_99_15 200499
// #define BTN_ARR_99_17 200512
void handleVibration() {
if (digitalRead(VIBRATION_PIN) == HIGH) {
BEEP();
if (mode == 1) mode = 2;
else if (mode == 2) mode = 4;
else if (mode == 4) mode = 6;
else if (mode == 6) mode = 7;
else if (mode == 7) mode = 8;
else if (mode == 8) mode = 1;
// allRed();
// mode = 1;
delay(500);
}
}
// case CHANNEL_UP:
// BEEP();
// if (mode < 8) mode++;
// else mode = 1;
// Serial.print(" CHANNEL_UP ");
// Serial.print(" ==>> MODE=");
// Serial.print(mode);
// break;
// case CHANNEL_DOWN:
// BEEP();
// if (mode > 1) mode--;
// // else mode = 1;
// Serial.print("CHANNEL_UP");
// Serial.print(" ==>> MODE=");
// Serial.print(mode);
// // displayMode();
// break;
// case MIDDLE_ARROW:
// mode = 1;
// clearMatrix();
// isForceDisplay = true;
// displayTimeOnWordClock();
// break;
// case RED_BUTTON:
// mode = 1;
// allRed();
// break;
// case GREEN_BUTTON:
// mode = 1;
// allGreen();
// break;
// case YELLOW_BUTTON:
// mode = 1;
// allOrange();
// break;
// case BLUE_BUTTON:
// mode = 1;
// allBlue();
// break;
// case UP_VOLUME:
// if (brightness < 200) brightness += 20;
// else {
// BEEP();
// BEEP();
// BEEP();
// }
// FastLED.setBrightness(brightness);
// FastLED.show();
// Serial.print(" UP_VOLUME");
// Serial.print(" brightness:");
// Serial.print(brightness);
// break;
// case DOWN_VOLUME:
// if (brightness > 21) brightness -= 20;
// else if (brightness > 6) brightness -= 5;
// else {
// BEEP();
// BEEP();
// BEEP();
// }
// FastLED.setBrightness(brightness);
// FastLED.show();
// Serial.print(" DOWN_VOLUME");
// Serial.print(" brightness:");
// Serial.print(brightness);
// // BEEP(3);
// break;
// Serial.println()