/*
code by MOK AMAR ; ALGERIA
project of control system with lcd dsiplay MENU
controlled by Joystick and keypad
*/
#include <LiquidCrystal_I2C.h>
#include <Joystick.h>
#include <Adafruit_NeoPixel.h>
#include <FastLED.h>
#define NUM_LEDS 16 // for fastled library
#define DATA_PIN 11 // number of pixel in strip and data IN pin
#define BRIGHNESS 255
#define VERT_PIN A0
#define HORZ_PIN A1
#define SEL_PIN 13
LiquidCrystal_I2C lcd(0x27, 20, 4);
int melody[] = {2637,4435,2637};
int pos = 0;
int on_state = 1;
CRGB leds[NUM_LEDS];
CRGB leds2[NUM_LEDS];
// Custom Character
byte power0_Char[] = {
B11100,
B10100,
B11100,
B10000,
B10111,
B00101,
B00101,
B00111
};
byte power1_Char[] = {
B11100,
B10000,
B11100,
B10111,
B11101,
B00111,
B00110,
B00101
};
byte H0_Char[] = {
B11000,
B11000,
B11000,
B11111,
B11111,
B11000,
B11000,
B11000
};
byte H1_Char[] = {
B00011,
B00011,
B00011,
B11111,
B11111,
B00011,
B00011,
B00011
};
byte E0_Char[] = {
B11111,
B11111,
B11000,
B11111,
B11111,
B11000,
B11111,
B11111
};
byte E1_Char[] = {
B11111,
B11111,
B00000,
B11111,
B11111,
B00000,
B11111,
B11111
};
byte L0_Char[] = {
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11111,
B11111
};
byte L1_Char[] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111
};
byte O0_Char[] = {
B01111,
B11111,
B11000,
B11000,
B11000,
B11000,
B11111,
B01111
};
byte O1_Char[] = {
B11110,
B11111,
B00011,
B00011,
B00011,
B00011,
B11111,
B11110
};
// setup ==========================================================
void setup() {
// put your setup code here, to run once:
// define color matrix
leds2[0] = CRGB::Red;
leds2[1] = CRGB(251, 116, 5);
leds2[2] = CRGB(255, 179, 0);
leds2[3] = CRGB(255, 221, 0);
leds2[4] = CRGB(251, 247, 1);
leds2[5] = CRGB(193, 238, 13);
leds2[6] = CRGB(76, 247, 8);
leds2[7] = CRGB(76, 247, 8);
leds2[8] = CRGB(7, 245, 245);
leds2[9] = CRGB(8, 91, 245);
leds2[10] = CRGB(26, 10, 243);
leds2[11] = CRGB(122, 10, 234);
leds2[12] = CRGB(239, 6, 247);
leds2[13] = CRGB(247, 3, 153);
leds2[14] = CRGB(243, 9, 79);
leds2[15] = CRGB(234, 23, 104);
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
pinMode(VERT_PIN, INPUT);
pinMode(HORZ_PIN, INPUT);
pinMode(SEL_PIN, INPUT_PULLUP);
lcd.init();
lcd.backlight();
//power_on();
}
// loop Main Routine ===================================================================================
void loop() {
// put your main code here, to run repeatedly:
//readJoy();
int i = ((millis()/1000) % 10); //count from 0 to 9 10steps
int j = ((millis()/1000) % 20); //count from 0 to 19 20 steps
int k = ((millis()/1000) / 10); // each 10sec increased by 1
lcd.setCursor(0,0);
lcd.print("I = ");lcd.print(i);lcd.print(" 0..9 "); //10 times
lcd.setCursor(0,1);
lcd.print("j = ");lcd.print(j);lcd.print(" 0..19 "); //20 times
lcd.setCursor(0,2);
lcd.print("K = ");lcd.print(k);lcd.print(" +1 >10sec");
/*
//rainbow_beat();
rainbow_march( 500, 255);
// power ON pressed
if (pos == 5 && on_state == 1)
{
do{
} while (digitalRead(SEL_PIN) == LOW);
pos = 0;
delay(1000);
//on_state = 0;
power_on();
}
// power OFF pressed
if (pos == 5 && on_state == 0)
{
do{
} while (digitalRead(SEL_PIN) == LOW);
pos = 0;
delay(1000);
//on_state = 1;
power_off();
}
*/
}
//=======================================================================================================
// Read Joystick Routine =================================================================================
int readJoy()
{
int horz = analogRead(HORZ_PIN);
int vert = analogRead(VERT_PIN);
int x = map(horz,0,1023,0,255);
int y = map(vert,0,1023,0,255);
String pos1 = " ";
if ( x != 127 || y != 127 || digitalRead(SEL_PIN) == LOW)
{
if (x == 255 && y == 127)
{
pos = 1;// left
pos1 = " LEFT ";
}
if (x == 0 && y == 127)
{
pos = 2; //right
pos1 = "RIGHT ";
}
if (x == 127 && y == 255)
{
pos = 3; //up
pos1 = " UP ";
}
if (x == 127 && y == 0)
{
pos = 4; //down
pos1 = " DOWN ";
}
if (digitalRead(SEL_PIN) == LOW)
{
do{
}while (digitalRead(SEL_PIN) == LOW);
pos = 5; //power Buton pressed
}
key_tone();
}
return pos;
}
//=======================================================================================================
//Menu List Routine
void menu_list()
{
delay(10);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("----- MENU LIST ----");
lcd.setCursor(0,0);
lcd.print("> LEDs Setting");
lcd.setCursor(0,1);
lcd.print(" Date & Time");
lcd.setCursor(0,2);
lcd.print(" HDMI Source Select");
do{
do{
}while (digitalRead(SEL_PIN) == LOW);
}while (digitalRead(SEL_PIN) == HIGH);
lcd.clear();
}
// power OFF routine ====================================================================================
void power_off()
{
delay(10);
lcd.clear();
lcd.setCursor(6,1);
lcd.print("GOOD BYE...");
delay(3000);
for (int i = 0 ;i<= NUM_LEDS;i++)
{
leds[i] = CRGB::Black;
FastLED.show();
}
lcd.clear();
lcd.noBacklight();
on_state = 1;
do
{
} while (digitalRead(SEL_PIN) == HIGH);
power_on();
}
//=======================================================================================================
// power ON HELLO Screen routine =====================================================================================
void power_on()
{
delay(1000);
lcd.backlight();
lcd.clear();
lcd.createChar(0, power0_Char);
lcd.createChar(1, power1_Char);
lcd.setCursor(3,1);
lcd.print("PRESS ");lcd.write(0);lcd.write(1);lcd.print(" BUTTON");
do{ //wait for SEL button of joystick to be pressed
} while (digitalRead(SEL_PIN) == HIGH);
lcd.clear();
delay(10);
lcd.createChar(0, H0_Char);
lcd.createChar(1, H1_Char);
lcd.createChar(2, E0_Char);
lcd.createChar(3, E1_Char);
lcd.createChar(4, L0_Char);
lcd.createChar(5, L1_Char);
lcd.createChar(6, O0_Char);
lcd.createChar(7, O1_Char);
start_tone();
//lcd.backlight();
lcd.clear();
lcd.setCursor(5,1);
lcd.write(0);lcd.write(1);lcd.write(2);lcd.write(3);lcd.write(4);lcd.write(5);lcd.write(4);lcd.write(5);
lcd.write(6);lcd.write(7);
on_state = 0;
delay(5000);
lcd.clear();
}
//=======================================================================================================
// key tone routine =====================================================================================
void key_tone()
{
tone(12, 2637, 50);
delay(10);
}
//=======================================================================================================
// system start tone routine ============================================================================
void start_tone()
{
for (int mnote = 0 ; mnote < 4; mnote++)
{
tone(12, melody[mnote], 50);
delay(50);
}
}
//=======================================================================================================
// RGB light effect routine =============================================================================
void rgb_effect(int dot,int color)
{
leds[dot] = leds2[color];
FastLED.show();
delay(2);
}
// rainbow effect 1
void rainbow_beat() {
uint8_t beatA = beatsin8(17, 0, 255); // Starting hue
uint8_t beatB = beatsin8(13, 0, 255);
fill_rainbow(leds, NUM_LEDS, (beatA+beatB)/2, 8); // Use FastLED's fill_rainbow routine.
FastLED.show();
} // rainbow_beat()
// rainbow effect 2
void rainbow_march(uint8_t thisdelay, uint8_t deltahue) { // The fill_rainbow call doesn't support brightness levels.
uint8_t thishue = millis()*(255-thisdelay)/255; // To change the rate, add a beat or something to the result. 'thisdelay' must be a fixed value.
// thishue = beat8(50); // This uses a FastLED sawtooth generator. Again, the '50' should not change on the fly.
// thishue = beatsin8(50,0,255); // This can change speeds on the fly. You can also add these to each other.
fill_rainbow(leds, NUM_LEDS, thishue, deltahue); // Use FastLED's fill_rainbow routine.
FastLED.show();
} // rainbow_march()
//=======================================================================================================
// date & time routine
//=======================================================================================================
//=======================================================================================================