#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MD_REncoder.h>
#include <EEPROM.h>
#include <EasyButton.h>
#define ROTARY_PIN1 2
#define ROTARY_PIN2 3
#define PIN_SW1 4
#define ROTARY_PIN3 5
#define ROTARY_PIN4 6
#define PIN_SW2 7
LiquidCrystal_I2C lcd(0x27, 20, 4);
MD_REncoder R1 = MD_REncoder(ROTARY_PIN1, ROTARY_PIN2);
EasyButton button1(PIN_SW1);
MD_REncoder R2 = MD_REncoder(ROTARY_PIN3, ROTARY_PIN4);
EasyButton button2(PIN_SW2);
int count;
int numfreq;
int count_EEPROM;
int numvol;
float frequency;
boolean mode_1;
boolean mode_2;
int duration = 1000;
//===============================================================
byte CHR_ANTENNA[8] = {
B10101, B10101, B01010, B00100, B00100, B00100, B00100, B00100
};
byte CHR_STRENGTH[8][8] = {
{
B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111
}, {
B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111
}, {
B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111
}, {
B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111
}, {
B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111
}, {
B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111
}, {
B00000, B11111, B11111, B11111, B11111, B11111, B11111, B11111
}, {
B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111
}
};
byte CHR_VOLUME[8][8] = {
{
B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111
}, {
B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111
}, {
B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111
}, {
B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111
}, {
B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111
}, {
B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111
}, {
B00000, B11111, B11111, B11111, B11111, B11111, B11111, B11111
}, {
B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111
}
};
byte CHR_SPEKER[8] = {
B00001, B00011, B00101, B11001, B11001, B00101, B00011, B00001
};
//================================================================
void setup()
{
Serial.begin(9600);
Wire.begin();
pinMode(PIN_SW1, INPUT);
pinMode(PIN_SW2, INPUT);
button1.begin();
button2.begin();
button1.onPressed(onPressed1);
button2.onPressed(onPressed2);
button1.onPressedFor(duration, onPressedForDuration1);
button2.onPressedFor(duration, onPressedForDuration2);
R1.begin();
R2.begin();
lcd.init();
lcd.backlight();
//================================================
lcd.createChar(0, CHR_ANTENNA);
lcd.createChar(1, CHR_STRENGTH[7]);
lcd.createChar(2, CHR_VOLUME[7]);
lcd.createChar(7, CHR_SPEKER);
lcd.setCursor(1, 0);
lcd.write(0);
lcd.setCursor(14, 0);
lcd.write(7);
//=================================================
mode_1 = false; //close mode_1 Savefreq read true or false
mode_2 = false; //close mode_2 EEProm read true or false
numfreq = 0;
frequency = 87.00;
displayFrequency();
displayVolume();
displayprogram();
displaySTRENGTH();
}
void loop()
{
button1.read();
button2.read();
uint8_t x = R1.read();
if (x)
{
if (x == DIR_CW ) {
if (mode_1) {
count += 1;
if (count > 16)
count = 16;
} else {
numfreq += 1;
if (numfreq > 84)
numfreq = 0;
}
}
else {
if (mode_1) {
count -= 1;
if (count < 1)
count = 1;
} else {
numfreq -= 1;
if (numfreq < 0)
numfreq = 84;
}
}
if (mode_1) {
displaysave();
} else {
frequency = ((numfreq * 25) + 8700) * 0.01;
displayFrequency();
displayprogram();
setFrequency();
}
}
uint8_t y = R2.read();
if (y)
{
if (y == DIR_CW ) {
if (mode_2) {
count_EEPROM += 1;
if (count_EEPROM > 16)
count_EEPROM = 16;
} else {
numvol += 1;
if (numvol > 15)
numvol = 15;
}
} else {
if (mode_2) {
count_EEPROM -= 1;
if (count_EEPROM < 1)
count_EEPROM = 1;
} else {
numvol -= 1;
if (numvol < 0)
numvol = 0;
}
}
if (mode_2) {
displayEEPROM();
} else {
displayVolume();
}
}
}
void displayFrequency()
{
if (mode_1) {
lcd.setCursor(3, 0);
if (frequency < 100) {
lcd.print(" ");
lcd.setCursor(4, 0);
}
lcd.print(frequency);
lcd.print(" MHz ");
} else {
lcd.setCursor(3, 0);
if (frequency < 100) {
lcd.print(" ");
lcd.setCursor(4, 0);
}
lcd.print(frequency);
lcd.print(" MHz ");
}
}
void setFrequency()
{
unsigned int frequencyB = 4 * (frequency * 1000000 + 225000) / 32768;
byte frequencyH = frequencyB >> 8;
byte frequencyL = frequencyB & 0XFF;
Wire.beginTransmission(0x60);
Wire.write(frequencyH);
Wire.write(frequencyL);
Wire.write(0xB0);
Wire.write(0x10);
Wire.write(0x00);
Wire.endTransmission();
}
void onPressed1()
{
if (!mode_1) {
mode_1 = true;
displaysave();
} else {
mode_1 = false;
displaysave();
}
}
void onPressedForDuration1()
{
if (mode_1) {
numfreq = ((frequency * 100) - 8700) / 25;
EEPROM.write(count, numfreq);
lcd.setCursor(0, 1);
lcd.print(" SAVE to ");
if (count < 10)
lcd.print('0');
lcd.print(count);
lcd.print(" ");
delay(2000);
mode_1 = false;
displayprogram();
displayFrequency();
}
}
void onPressed2()
{
if (!mode_2) {
mode_2 = true;
displayEEPROM();
} else {
mode_2 = false;
displayVolume();
}
}
void onPressedForDuration2()
{
if (mode_2) {
for (int i = 0 ; i < EEPROM.length() ; i++) {
EEPROM.write(i, 0);
}
lcd.setCursor(0, 0);
lcd.print(" Clear Program ");
lcd.setCursor(0, 1);
lcd.print(" Finish!! ");
delay(1000);
setup();
}
}
void displaysave()
{
if (mode_1) {
lcd.setCursor(0, 1);
lcd.print(">> Program ");
lcd.setCursor(11, 1);
if (count < 10)
lcd.print('0');
lcd.print(count);
lcd.print(" <<");
} else {
lcd.setCursor(0, 1);
displayprogram();
}
}
void displayprogram()
{
lcd.setCursor(0, 1);
if (numfreq == EEPROM.read(1)) {
lcd.print(" Program 01 ");
count = 1;
}
else if (numfreq == EEPROM.read(2)) {
lcd.print(" Program 02 ");
count = 2;
}
else if (numfreq == EEPROM.read(3)) {
lcd.print(" Program 03 ");
count = 3;
}
else if (numfreq == EEPROM.read(4)) {
lcd.print(" Program 04 ");
count = 4;
}
else if (numfreq == EEPROM.read(5)) {
lcd.print(" Program 05 ");
count = 5;
}
else if (numfreq == EEPROM.read(6)) {
lcd.print(" Program 06 ");
count = 6;
}
else if (numfreq == EEPROM.read(7)) {
lcd.print(" Program 07 ");
count = 7;
}
else if (numfreq == EEPROM.read(8)) {
lcd.print(" Program 08 ");
count = 8;
}
else if (numfreq == EEPROM.read(9)) {
lcd.print(" Program 09 ");
count = 9;
}
else if (numfreq == EEPROM.read(10)) {
lcd.print(" Program 10 ");
count = 10;
}
else if (numfreq == EEPROM.read(11)) {
lcd.print(" Program 11 ");
count = 11;
}
else if (numfreq == EEPROM.read(12)) {
lcd.print(" Program 12 ");
count = 12;
}
else if (numfreq == EEPROM.read(13)) {
lcd.print(" Program 13 ");
count = 13;
}
else if (numfreq == EEPROM.read(14)) {
lcd.print(" Program 14 ");
count = 14;
}
else if (numfreq == EEPROM.read(15)) {
lcd.print(" Program 15 ");
count = 15;
}
else if (numfreq == EEPROM.read(16)) {
lcd.print(" Program 16 ");
count = 16;
}
else {
lcd.print(" Program -- ");
count = 1;
}
}
void displayVolume()
{
lcd.setCursor(3, 1);
lcd.print("Volumn ");
if (numvol < 10)
lcd.print('0');
lcd.print(numvol);
lcd.setCursor(15, 0);
lcd.write(byte(2));
switch (numvol) {
case 0 ... 2:
lcd.createChar(2, CHR_VOLUME[0]);
break;
case 3 ... 4:
lcd.createChar(2, CHR_VOLUME[1]);
break;
case 5 ... 6:
lcd.createChar(2, CHR_VOLUME[2]);
break;
case 7 ... 8:
lcd.createChar(2, CHR_VOLUME[3]);
break;
case 9 ... 10:
lcd.createChar(2, CHR_VOLUME[4]);
break;
case 11 ... 12:
lcd.createChar(2, CHR_VOLUME[5]);
break;
case 13 ... 14:
lcd.createChar(2, CHR_VOLUME[6]);
break;
case 15:
lcd.createChar(2, CHR_VOLUME[7]);
break;
}
}
void displayEEPROM()
{
numfreq = EEPROM.read(count_EEPROM);
frequency = ((numfreq * 25) + 8700) * 0.01;
/*
//=========================================
lcd.setCursor(0, 1);
lcd.print(" Program ");
if (count_EEPROM < 10)
lcd.print('0');
lcd.print(count_EEPROM);
lcd.print(" ");
//=========================================
*/
displayFrequency();
displayprogram();
setFrequency();
}
void displaySTRENGTH()
{
int STRENGTH = 8;
lcd.setCursor(0, 0);
lcd.write(byte(1));
switch (STRENGTH) {
case 0 ... 2:
lcd.createChar(1, CHR_STRENGTH[0]);
break;
case 3 ... 4:
lcd.createChar(1, CHR_STRENGTH[1]);
break;
case 5 ... 6:
lcd.createChar(1, CHR_STRENGTH[2]);
break;
case 7 ... 8:
lcd.createChar(1, CHR_STRENGTH[3]);
break;
case 9 ... 10:
lcd.createChar(1, CHR_STRENGTH[4]);
break;
case 11 ... 12:
lcd.createChar(1, CHR_STRENGTH[5]);
break;
case 13 ... 14:
lcd.createChar(1, CHR_STRENGTH[6]);
break;
case 15:
lcd.createChar(1, CHR_STRENGTH[7]);
break;
}
}