#include <IRremote.h>
//
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
#define IR_Button_1 0xBF40FF00
#define IR_Button_2 0xBE41FF00
#define IR_Button_3 0xBB44FF00
const int led1 = 6; //variable for LED pin
const int led2 = 11; //variable for LED pin
const byte outPin = 13;
int buzzer = 5;
int unit = 80; //variable for delay of 1 unit in milliseconds
int tonefreq = 100; //freq in Hertz
int ledState1 = HIGH;
int ledState2 = HIGH;
int brightness = 0; // how bright the LED is
int fadeAmount = 1;
const int fadeDuration = 1000; // Time duration for the fade (in milliseconds)
const int fadeStep = 5; // The step value to increase/decrease brightness in each iteration
unsigned long startTime; // Variable to store the start time of the fade
int currentBrightness = 0; // Variable to store the current brightness level
int blinkingState = 2;
// -------------------
int message[] = {6,4,4,4,5,4,1,1,1,3,2,2,2,3,1,1,1,4,
11,11,11,3,12,12,12,3,11,11,11,4,
51,51,51,3,51,52,3,51,51,51,52,3,
51,3,4,52,52,52,3,51,51,52,3,51,
52,51,3,4,51,51,51,3,2,2,2,3,
1,1,2,3,11,12,11,11,3,1,1,1,
3,4,100
}; // dot = 1, dash = 2, inter letter space = 3, inter word space = 4
int messageLength = 81;
int messagePointer = 0;
unsigned long interval = 80; // mS per morse unit time
unsigned long workingInterval = 0;
unsigned long stateTime = 0;
boolean generatingMessage = false;
void setup() {
pinMode(outPin, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(buzzer, OUTPUT);
irrecv.enableIRIn();
irrecv.blink13(true);
attachInterrupt(digitalPinToInterrupt(RECV_PIN), remote, CHANGE);
Serial.begin(9600);
}
void loop() {
message1();
remote();
}
void remote(){
if (irrecv.decode()){
Serial.print("IR Value: 0x");
Serial.println(irrecv.decodedIRData.decodedRawData, HEX);
switch(irrecv.decodedIRData.decodedRawData){
case IR_Button_1: //Keypad button "on"
blinkingState = 0;
break;
}
switch(irrecv.decodedIRData.decodedRawData){
case IR_Button_2: //Keypad button "off"
blinkingState = 1;
break;
//StopAll();
//messagePointer = 0;
}
switch(irrecv.decodedIRData.decodedRawData){
case IR_Button_3: //Keypad button "w"
blinkingState = 2;
break;
//StopAll();
//messagePointer = 0;
}
irrecv.resume();
}
}
void message1() {
switch (blinkingState) {
case 0: // Blink LEDs based on Morse code
if (millis() - stateTime > workingInterval) {
updateMessage();
}
break;
case 1: // Turn off LEDs and buzzer
StopAll();
messagePointer = 0;
break;
case 2: // Turn on LEDs and turn off the buzzer
FullOn();
messagePointer = 0;
break;
}
}
void FullOn(){
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
noTone(buzzer);
}
void StopAll(){
analogWrite(led1, 0);
analogWrite(led2, 0);
noTone(buzzer);
}
void updateMessage(){
// set up time to next call of this function
if(message[messagePointer] == 1) workingInterval = interval;
if(message[messagePointer] == 2) workingInterval = interval * 3;
if(message[messagePointer] == 3) workingInterval = interval * 3;
if(message[messagePointer] == 4) workingInterval = interval * 7;
if(message[messagePointer] == 5) workingInterval = interval * 100;
if(message[messagePointer] == 6) workingInterval = interval * 100;
if(message[messagePointer] == 100) workingInterval = interval * 2000;
if(message[messagePointer] == 11) workingInterval = interval;
if(message[messagePointer] == 12) workingInterval = interval * 3;
if(message[messagePointer] == 51) workingInterval = interval;
if(message[messagePointer] == 52) workingInterval = interval * 3;
stateTime = millis();
// toggle output
if(message[messagePointer] == 1 || message[messagePointer] == 2){
if(digitalRead(led1) == HIGH) {
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
tone(buzzer, tonefreq);
}
else {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
noTone(buzzer);
updatePointer();
}
}
else if(message[messagePointer] == 11 || message[messagePointer] == 12){
if(digitalRead(led2) == HIGH) {
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
tone(buzzer, tonefreq);
}
else {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
noTone(buzzer);
updatePointer();
}
}
else if(message[messagePointer] == 51 || message[messagePointer] == 52){
if(digitalRead(led2) == HIGH) {
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
tone(buzzer, tonefreq);
}
else {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
noTone(buzzer);
updatePointer();
}
}
else if(message[messagePointer] == 100){
//noTone(buzzer);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
updatePointer();
}
else {
if(message[messagePointer] == 5){
//fadeIn1();
//updatePointer();
}
if(message[messagePointer] == 6){
//fadeOut1();
//updatePointer();
}
updatePointer();
}
}
void updatePointer(){
messagePointer++;
if(messagePointer >= messageLength){ // end of message
generatingMessage = false;
messagePointer = 0;
}
}