Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal_I2C.h>// подключаем библиотеку для i2с шины дисплея
- #include <IRremote.h> // подключаем библиотеку для IR приемника
- IRrecv irrecv(14); // указываем пин, к которому подключен IR приемник
- LiquidCrystal_I2C lcd(0x27, 16, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
- byte relN = 1;
- bool a[] = {true, true, true, true, true, true, true, true};
- String r = "Relay ";
- bool topStr = true;
- decode_results results;
- void setup() {
- pinMode(14, INPUT);
- pinMode(15, OUTPUT);
- pinMode(16, OUTPUT);
- digitalWrite(15, LOW);
- digitalWrite(16, HIGH);
- for (int i = 2; i <= 9; i++) {
- pinMode(i, OUTPUT);
- digitalWrite(i, HIGH);
- }
- irrecv.enableIRIn(); // запускаем прием
- Serial.begin(9600); // подключаем монитор порта
- lcd.init(); // initialize the lcd
- lcd.backlight();
- lcd.setCursor(0, 0);
- lcd.print(">");
- lcd.setCursor(1, 0);
- lcd.print(r + relN);
- lcd.setCursor(1, 1);
- lcd.print(r + (relN + 1));
- lcd.setCursor(13, 0);
- lcd.print(digRead(a[relN - 1]));
- lcd.setCursor(13, 1);
- lcd.print(digRead(a[relN]));
- }
- void loop() {
- if (irrecv.decode(&results)) { // если данные пришли выполняем команды
- Serial.println(results.value, HEX); // отправляем полученные данные на порт
- shiftCursor(); //Проверяем, являются ли нажатые кнопки стрелками. Если да, то курсор меняет строку, а номер реле меняется.
- if (results.value == 0xFF38C7)switchR(relN, topStr);
- Serial.println(relN);
- //Serial.println(topStr);
- delay(200);
- irrecv.resume();
- }
- }
- void shiftCursor() { //метод, изменяющий строку курсора принажатии клавиш пульта "вверх" и "вниз", а так же номер выбранного реле
- if (results.value == 0xFF4AB5 | results.value == 0xFF18E7) {
- if (topStr) {
- lcd.setCursor(0, 0);
- lcd.print(" ");
- lcd.setCursor(0, 1);
- lcd.print(">");
- topStr = !topStr;
- } else {
- lcd.setCursor(0, 1);
- lcd.print(" ");
- lcd.setCursor(0, 0);
- lcd.print(">");
- topStr = !topStr;
- }
- }
- if (results.value == 0xFF4AB5) {
- shiftNum(relN++);
- relN = shiftNum(relN);
- if (topStr) {
- printStrD(relN);
- }
- }
- if (results.value == 0xFF18E7) {
- shiftNum(relN--);
- relN = shiftNum(relN);
- if (!topStr) {
- printStrU(relN);
- }
- }
- }
- void printStrD(byte c) { //метод, меняющий название и номер реле при нажатии кнопки "вниз"
- c = shiftNum(c);
- lcd.setCursor(1, 0);
- lcd.print(r + c + " " + digRead(a[c - 1]));
- lcd.setCursor(1, 1);
- lcd.print(r + (c + 1) + " " + digRead(a[c]));
- }
- void printStrU(byte c) { //метод, меняющий название и номер реле при нажатии кнопки "вверх"
- c = shiftNum(c);
- lcd.setCursor(1, 0);
- lcd.print(r + (c - 1) + " " + digRead(a[c - 2]));
- lcd.setCursor(1, 1);
- lcd.print(r + (c) + " " + digRead(a[c - 1]));
- }
- byte shiftNum(byte n) { //метод, организующий циклическое пролистывание номеров реле
- if (n >= 9) {
- return 1;
- }
- if (n <= 0) {
- return 8;
- }
- else {
- return n;
- }
- }
- String digRead(bool b) { //метод, возвращающий статус работы реле в строковом виде
- if (b) {
- return "OFF";
- } else {
- return " ON";
- }
- }
- void switchR(byte s, bool t) { //метод, выводящий статус работы реле на дисплей в формате "он-офф" и изменяющий состояние реле при нажатии кнопки "ок"
- a[s - 1] = !a[s - 1];
- digitalWrite(s+1, a[s-1]);
- Serial.println(a[s - 1]);
- if (t) {
- lcd.setCursor(13, 0);
- lcd.print(digRead(a[relN - 1]));
- } else {
- lcd.setCursor(13, 1);
- lcd.print(digRead(a[relN - 1]));
- }
- }
- //FF18E7 вверх
- //FF4AB5 вниз
- //FF38C7 ок
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement