#include <Servo.h>
#include <IRremote.h>
#include <LiquidCrystal.h>
#include "ir_remote_control.h"
const int PIN_RECEIVER = 2; // Вход для ИК приемника
IRrecv receiver(PIN_RECEIVER); // Приемник ИК
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); // LCD дисплей
Servo servo;
int array_angle[3] = {0, 0, 0};
int angle_size = 3;
int pos = 0;
void setup() {
// lcd
lcd.begin(20, 4);
lcd.clear();
lcd.print("Servo angle:");
lcd.setCursor(0, 1);
lcd.blink();
//irremote
// IrReceiver.begin(2, ENABLE_LED_FEEDBACK);
receiver.enableIRIn(); // Запуск ИК приемника
// servo
servo.attach(5);
servo.write(0);
}
Command TranslateIRCommand() {
switch (receiver.decodedIRData.command) {
case 194:
return Command::CLEAR_ALL;
case 168:
return Command::APPLY;
case 176:
return Command::CLEAR_SYM;
case 104:
return Command::NUM_0;
case 48:
return Command::NUM_1;
case 24:
return Command::NUM_2;
case 122:
return Command::NUM_3;
case 16:
return Command::NUM_4;
case 56:
return Command::NUM_5;
case 90:
return Command::NUM_6;
case 66:
return Command::NUM_7;
case 74:
return Command::NUM_8;
case 82:
return Command::NUM_9;
default:
return Command::UNKNOWN;
}
}
void HandleCommand(Command command) {
switch (command) {
case Command::UNKNOWN:
break;
case Command::CLEAR_ALL:
if (pos != 0) {
lcd.setCursor(0, 2);
ClearLineLcd();
lcd.setCursor(0, 1);
ClearLineLcd();
lcd.setCursor(0, 1);
pos = 0;
}
break;
case Command::CLEAR_SYM:
if (pos != 0) {
lcd.setCursor(--pos, 1);
lcd.write(' ');
lcd.setCursor(0, 2);
ClearLineLcd();
lcd.setCursor(pos, 1);
}
break;
case Command::APPLY:
SetAngle();
break;
default:
if (pos == angle_size) {
ShowErrorMesage();
return;
}
array_angle[pos] = static_cast<int>(command);
lcd.write('0' + array_angle[pos]);
++pos;
}
}
void SetAngle() {
int angle = GetAngle();
if (angle > 180) {
ShowErrorMesage();
return;
}
servo.write(angle);
}
void ShowErrorMesage() {
lcd.setCursor(0, 2);
lcd.print("Angle is in [0, 180]");
lcd.setCursor(pos, 1);
}
int GetAngle() {
int angle = 0;
for (int i = 0; i < pos; ++i) {
angle += array_angle[i] * pow(10, pos - i - 1);
}
return angle;
}
void ClearLineLcd() {
lcd.print(" ");
}
void loop() {
if (receiver.decode()) {//проверка новых данных
HandleCommand(TranslateIRCommand());
receiver.resume(); //запуск приема новой команды
}
}