#include "IRremote.h"
#include "IR.h"
#include "pitches.h"
#include "LiquidCrystal.h"
#define BLUE 6
#define GREEN 9
#define RED 10
#define LCD 13
LiquidCrystal lcd(2, 4, 7, 3, 5, 8);
IRrecv irrecv(RECEIVER); // create instance of 'irrecv'
decode_results results; // create instance of 'decode_results'
boolean isPowerButtonPressed = false;
boolean isLedOn = false;
int redValue;
int greenValue;
int blueValue;
int duration = 150; // 500 miliseconds
int codeDigitCount = 0;
int attemptsRemaining = 3;
String codeInputted = "";
void PlayMelody(const char* type)
{
int success[] = { NOTE_B5, NOTE_C6, NOTE_B5, NOTE_C6, NOTE_B5, NOTE_C6, NOTE_B5, NOTE_C6 };
int error[] = { NOTE_C5, NOTE_D5, NOTE_C5, NOTE_D5 };
int off[] = { NOTE_C6, NOTE_B5, NOTE_A5, NOTE_G5, NOTE_F5, NOTE_E5, NOTE_D5, NOTE_C5 };
int on[] = { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6 };
int alarm[] = { NOTE_A5, NOTE_A4, NOTE_A5, NOTE_A2, NOTE_A5, NOTE_A2, NOTE_A5, NOTE_A4,NOTE_A5, NOTE_A4, NOTE_A5, NOTE_A2, NOTE_A5, NOTE_A2, NOTE_A5, NOTE_A4,};
if (type == "success") {
for (int thisNote = 0; thisNote < 8; thisNote++) {
tone(12, success[thisNote], duration);
delay(100);
}
} else if (type == "error") {
for (int thisNote = 0; thisNote < 4; thisNote++) {
tone(12, error[thisNote], duration);
delay(100);
}
} else if (type == "off") {
for (int thisNote = 0; thisNote < 8; thisNote++) {
tone(12, off[thisNote], duration);
delay(100);
}
} else if (type == "on") {
for (int thisNote = 0; thisNote < 8; thisNote++) {
tone(12, on[thisNote], duration);
delay(100);
}
} else if (type == "alarm") {
for (int thisNote = 0; thisNote < 16; thisNote++) {
tone(12, alarm[thisNote], 500);
delay(500);
}
}
}
void PowerOff()
{
redValue = 0;
greenValue = 0;
blueValue = 0;
codeDigitCount = 0;
codeInputted = "";
isPowerButtonPressed = false;
SetLedColour(redValue, greenValue, blueValue);
PlayMelody("off");
attemptsRemaining = 3;
ClearLcdScreen();
digitalWrite(LCD, LOW);
}
void PowerOn()
{
redValue = 0;
greenValue = 0;
blueValue = 255;
codeDigitCount = 0;
codeInputted = "";
isPowerButtonPressed = false;
SetLedColour(redValue, greenValue, blueValue);
PlayMelody("on");
ClearLcdScreen();
ResetLcdScreen();
digitalWrite(LCD, HIGH);
}
void TooManyIncorrectAttempts()
{
redValue = 255;
greenValue = 0;
blueValue = 0;
SetLedColour(redValue, greenValue, blueValue);
lcd.setCursor(0, 0);
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("Too bad...");
lcd.setCursor(0, 1);
lcd.print("Alarm Triggered!!!");
PlayMelody("alarm");
}
void MarqueeScroll() {
for (int positionCounter = 7; positionCounter > 0; positionCounter--) {
lcd.scrollDisplayLeft();
delay(250);
}
delay(250);
for (int positionCounter = 7; positionCounter > 0; positionCounter--) {
lcd.scrollDisplayRight();
delay(250);
}
delay(250);
for (int positionCounter = 7; positionCounter > 0; positionCounter--) {
lcd.scrollDisplayRight();
delay(250);
}
delay(250);
for (int positionCounter = 7; positionCounter > 0; positionCounter--) {
lcd.scrollDisplayLeft();
delay(250);
}
delay(250);
}
void TextMarquee() {
MarqueeScroll();
ClearLcdScreen();
lcd.setCursor(6, 1);
lcd.print(".42.");
lcd.setCursor(0, 0);
delay(1000);
ClearLcdScreen();
lcd.setCursor(6, 0);
lcd.print(".42.");
ClearLcdScreen();
lcd.setCursor(6, 1);
lcd.print(".42.");
ClearLcdScreen();
lcd.setCursor(6, 0);
lcd.print(".42.");
}
void CodeAccepted()
{
redValue = 0;
greenValue = 255;
blueValue = 0;
SetLedColour(redValue, greenValue, blueValue);
lcd.setCursor(0, 0);
lcd.print("Code Accepted!!!");
PlayMelody("success");
delay(2000);
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("The answer to");
lcd.setCursor(0, 1);
lcd.print("the ultimate ");
delay(2000);
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("question of life,");
lcd.setCursor(0, 1);
lcd.print("the universe");
delay(2000);
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("and everything");
lcd.setCursor(0, 1);
lcd.print("is...");
delay(2500);
ClearLcdScreen();
lcd.setCursor(6, 0);
lcd.print(".42.");
lcd.setCursor(0, 0);
delay(1000);
TextMarquee();
}
void IncorrectCode()
{
attemptsRemaining = attemptsRemaining - 1;
redValue = 255;
greenValue = 0;
blueValue = 0;
SetLedColour(redValue, greenValue, blueValue);
lcd.setCursor(0, 0);
lcd.print("Incorrect code!");
lcd.setCursor(0, 1);
String message = (String(attemptsRemaining) + "/3 attempts.");
lcd.print(message);
PlayMelody("error");
delay(2000);
redValue = 0;
blueValue = 255;
SetLedColour(redValue, greenValue, blueValue);
ClearLcdScreen();
ResetLcdScreen();
}
void SetupRgbLed()
{
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(BLUE, HIGH);
PlayMelody("on");
}
void SetupIrReceiever()
{
Serial.begin(9600);
Serial.println("IR Receiver Button Decode");
irrecv.enableIRIn();
}
void SetLedColour(int redValue, int greenValue, int blueValue)
{
analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
analogWrite(BLUE, blueValue);
}
void SetupLcdDisplay()
{
pinMode(LCD, OUTPUT);
digitalWrite(LCD, HIGH);
lcd.begin(16, 2);
lcd.print("Please enter");
lcd.setCursor(0, 1);
lcd.print("unlock code...");
}
void ClearLcdScreen()
{
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
}
void ResetLcdScreen()
{
lcd.setCursor(0, 0);
lcd.print("Please enter");
lcd.setCursor(0, 1);
lcd.print("unlock code...");
}
void LoopIrReceiever()
{
int tmpValue;
if (irrecv.decode(&results))
{
for (int i = 0; i < 23; i++)
{
if ((keyValue[i] == results.value) && (i < KEY_NUM))
{
ClearLcdScreen();
switch (results.value)
{
case 0xFFA25D:
Serial.println("POWER");
isPowerButtonPressed = true;
isLedOn = !isLedOn;
break;
case 0xFFE21D: Serial.println("FUNC/STOP"); break;
case 0xFF629D: Serial.println("VOL+"); break;
case 0xFF22DD: Serial.println("FAST BACK"); break;
case 0xFF02FD: Serial.println("PAUSE"); break;
case 0xFFC23D: Serial.println("FAST FORWARD"); break;
case 0xFFE01F: Serial.println("DOWN"); break;
case 0xFFA857: Serial.println("VOL-"); break;
case 0xFF906F: Serial.println("UP"); break;
case 0xFF9867: Serial.println("EQ"); break;
case 0xFFB04F: Serial.println("ST/REPT"); break;
case 0xFF6897:
codeInputted = codeInputted + "0";
break;
case 0xFF30CF:
codeInputted = codeInputted + "1";
break;
case 0xFF18E7:
codeInputted = codeInputted + "2";
break;
case 0xFF7A85:
codeInputted = codeInputted + "3";
break;
case 0xFF10EF:
codeInputted = codeInputted + "4";
break;
case 0xFF38C7:
codeInputted = codeInputted + "5";
break;
case 0xFF5AA5:
codeInputted = codeInputted + "6";
break;
case 0xFF42BD:
codeInputted = codeInputted + "7";
break;
case 0xFF4AB5:
codeInputted = codeInputted + "8";
break;
case 0xFF52AD:
codeInputted = codeInputted + "9";
break;
case 0xFFFFFFFF:
Serial.println(" REPEAT");
break;
default:
Serial.println("other button");
break;
}
Serial.println("codeInputted");
Serial.println(codeInputted);
Serial.println("codeDigitCount");
Serial.println(codeDigitCount);
if (isPowerButtonPressed && isLedOn) {
PowerOff();
} else if (isPowerButtonPressed && !isLedOn) {
PowerOn();
} else {
if (!attemptsRemaining) {
TooManyIncorrectAttempts();
} else {
if (codeDigitCount >= 7) {
if (codeInputted == "01020304") {
CodeAccepted();
} else {
IncorrectCode();
}
codeDigitCount = 0;
codeInputted = "";
} else {
codeDigitCount = codeDigitCount + 1;
switch (codeDigitCount) {
case 1:
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("*");
break;
case 2:
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("**");
break;
case 3:
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("***");
break;
case 4:
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("****");
break;
case 5:
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("*****");
break;
case 6:
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("******");
break;
case 7:
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("*******");
break;
case 8:
ClearLcdScreen();
lcd.setCursor(0, 0);
lcd.print("********");
break;
}
}
}
}
}
else if (REPEAT == i)
{
results.value = tmpValue;
}
}
irrecv.resume();
}
}
void setup()
{
SetupRgbLed();
SetupIrReceiever();
SetupLcdDisplay();
}
void loop()
{
LoopIrReceiever();
}
Comments