Управление электроприводом дверей с ик пультов (открывание дверей IR remote)
- Войдите на сайт для отправки комментариев
Создал и работает у меня проектик для въезда на небольшое предприятие машин.
Электропривод был к ниму завтра подставлю на контакт открытия ардуино uno.
На постоянку забиты 2 пульта один от телевизора диспетчера чтоб двери открывать, а второй мастер пульт с кнопками: считать кнопку с пультика водилы, записать все считанные коды пультиков в EEPROM, сбросить коды прочитанных пультов(после этого в EEPROM надо записать)
кроме этого пищит в динамик и моргает светодиодом
Понимает только пульты которые декадируются библиотекой IRREMOTE
Начало было взято здесь http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html
ик приемнички со старой техники выпаял, направлю внутрь и наружу от дверей.
вопрос к ГУРУ почему не компилируется если применяю команеду tone в строке 45? с подгруженной библиотекой IRremote не работает? Почему библиотека IRremote встоенная в папке RobotIRremote ошибку выдает?
вот код:
/* библиотеку <IRremote.h> брал тут https://github.com/shirriff/Arduino-IRremote встроенная RobotIRremote выдает ошибку разбираться не стал. открывание дверей пультами ик с мастер пультом для добавления новых пультов Анатолий Гладких 2015 */ #include <IRremote.h> #include <EEPROM.h> #define RECV_PIN 9 // сюда подключен ик датчик #define LED_PIN 13 //светодиод моргает‚ #define SPEAK_PIN 8 //динамик трещит‚ #define DOOR_PIN 7 //двери отворяются‚ IRrecv irrecv(RECV_PIN); decode_results results; #define key_read 0x100F4 //0x01FED02F //код кнопки мастер пульта считать код #define key_rec 0x10000 //0x01FEE01F //код кнопки мастер пульта записать код пульта в епром #define key_clear 0x100F3 //0x01FE609F //код кнопки мастер пульта сбросить счетчик пультов #define key_open 0x10008 //0x01FEC03F //код кнопки мастер пульта открыть дверь #define key_open1 0x20DFEA15 //открыть дверь пультом диспетчера #define max_ir 10 //максимальное количество запоминаемых пультов смотрите чтоб не переполнить епроm, 8байт на пульт #define adrir 81 //=max_ir*8+1; //адрес в епром с количеством пультов unsigned long code_ir[max_ir]; //массив с кодами по которым открывать двери byte kol_ir; //количество запрограммированных пультов 0,1,2,3... byte epromir; //количество запрограммированных пультов последний раз записанных в епром чтоб чтение и запись с епром лишний раз не делать - дублер епрома //unsigned long last_ir=0; //последний записанный пульт перед записью в епром void blinkbeep (byte count,unsigned int timu,String ttext ) { //с новой строки вывести текст пикнуть и моргнуть led Serial.print('\n'); Serial.print(ttext); for (byte s=count; s>0; s--) { digitalWrite(LED_PIN, HIGH); for (int tt=timu; tt!=0; tt--) { digitalWrite(SPEAK_PIN, HIGH); delay (1); digitalWrite(SPEAK_PIN, LOW); delay (1); } // tone(SPEAK_PIN,5000); //так не работает ошибку выдает компилятор хз почему // delay(timu); // noTone(SPEAK_PIN); digitalWrite(LED_PIN, LOW); delay(timu); } } unsigned long epromread(byte addr) //тут извращаюсь и читаю и записываю в епром 8байт сразу из унсигнет лонг { unsigned long temp; temp=(EEPROM.read(addr*8)); *((byte*) ((void*) &temp+1))=EEPROM.read(addr*8+1); *((byte*) ((void*) &temp+2))=EEPROM.read(addr*8+2); *((byte*) ((void*) &temp+3))=EEPROM.read(addr*8+3); *((byte*) ((void*) &temp+4))=EEPROM.read(addr*8+4); *((byte*) ((void*) &temp+5))=EEPROM.read(addr*8+5); *((byte*) ((void*) &temp+6))=EEPROM.read(addr*8+6); *((byte*) ((void*) &temp+7))=EEPROM.read(addr*8+7); return temp; } void epromwrite(byte addr, unsigned long vollue) { if (addr==adrir && epromir!=vollue) { EEPROM.write(adrir,vollue); //без лишних записей с епром epromir=vollue; } else { EEPROM.write(addr*8,vollue); EEPROM.write(addr*8+1,*((byte*) ((void*) &vollue+1))); EEPROM.write(addr*8+2,*((byte*) ((void*) &vollue+2))); EEPROM.write(addr*8+3,*((byte*) ((void*) &vollue+3))); EEPROM.write(addr*8+4,*((byte*) ((void*) &vollue+4))); EEPROM.write(addr*8+5,*((byte*) ((void*) &vollue+5))); EEPROM.write(addr*8+6,*((byte*) ((void*) &vollue+6))); EEPROM.write(addr*8+7,*((byte*) ((void*) &vollue+7))); } } void setup() { pinMode(LED_PIN, OUTPUT); pinMode(SPEAK_PIN, OUTPUT); pinMode(DOOR_PIN, OUTPUT); digitalWrite(LED_PIN, LOW); digitalWrite(SPEAK_PIN, LOW); digitalWrite(DOOR_PIN, LOW); Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver kol_ir=EEPROM.read(adrir); epromir=kol_ir; if (kol_ir>max_ir) { //Не более max_ir пультов для см размер епром для своей ардуинки kol_ir=max_ir; epromwrite(adrir,max_ir); } blinkbeep (kol_ir,200,"Ir Remote loaded eprom pieces - "); //пищать столько раз какой по счету пульт Serial.println(kol_ir, DEC); for (byte tt=0; tt<kol_ir; tt++) { //читаем коды пультов из епром code_ir[tt]=epromread(tt); //в 0 адресе хранится колво пультов поэтому +1 Serial.print(tt, DEC); Serial.print(" #ir have code- "); Serial.println(code_ir[tt], HEX); } } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); switch (results.value) { case key_read: blinkbeep (2,200,"wait pressed key on new ir \n"); for (byte tt=0; tt<5; tt++) { // 5 секунд для ввода нового кода пульта irrecv.resume(); // Receive the next value delay (1000); if (irrecv.decode(&results)){ //получили код нового пульта if (results.value>0xff && results.value!=0xffffffff && results.value!=key_read && results.value!=key_rec && results.value!=key_clear) { //отфильтровать мусор и забитые кнопки мастер пульта code_ir[kol_ir]=results.value; Serial.print(kol_ir, DEC); Serial.print("have code"); Serial.print(results.value, HEX); code_ir[kol_ir]=results.value; if (kol_ir<max_ir){ kol_ir++; blinkbeep (kol_ir,200,"# "); //пищать столько раз какой по счету пульт } else blinkbeep (1,500,"# "); //пищать столько раз какой по счету пульт tt=6; //break; //больше не сканировать пульта кнопки } } } delay (1000); //ждать еще 1 секунду после ввода for (byte tt=0; tt<kol_ir; tt++) { //тут сравнение с уже вбитыми кодами чтоб не повторятся if (code_ir[kol_ir]==code_ir[tt]) { kol_ir--; blinkbeep (kol_ir,100,"This code ir present on memories"); } //если был уже такой то убавляем } break; case key_rec: //запись в епром вбитых пультов (или сброс таковых если была нажата кнопка очистки ) чтоб после перегрузки все вбитые пульты работали blinkbeep (kol_ir,200,"Record Ir remote to eprom peces - "); Serial.print(kol_ir, DEC); for(byte tt=epromir; tt<kol_ir; tt++) { epromwrite(tt,code_ir[tt]); blinkbeep (1,50,"# "); Serial.print(tt, DEC); Serial.print(" write code "); Serial.print(code_ir[tt], HEX); } if (epromir<kol_ir || kol_ir==0) epromwrite(adrir,kol_ir); break; case key_clear: // сбросить счетчик пультов незаписывая blinkbeep (1,400, "Clear quantity remote"); kol_ir=0; break; case key_open: case key_open1: digitalWrite(DOOR_PIN, HIGH); blinkbeep (1,500,"Door open with master irRemote"); digitalWrite(DOOR_PIN, LOW); break; default: for(byte tt=0; tt<kol_ir; tt++) { // проверка на открывание двери if ( code_ir[tt]==results.value) { digitalWrite(DOOR_PIN, HIGH); blinkbeep (1,500,"Door open #"); Serial.print(tt, DEC); Serial.print(" ir with code"); Serial.print(code_ir[tt], HEX); digitalWrite(DOOR_PIN, HIGH); break; } } } irrecv.resume(); // Receive the next value } delay (250); // для экономии батарейки и чтоб ардуинку зря не гонять 4 раза в секунду выполнять loop }
delay (250); // для экономии батарейки и чтоб ардуинку зря не гонять 4 раза в секунду выполнять loop
Вы добрый человек. )))
удали папку RobotIRremote
56-63 и 74-81
https://www.arduino.cc/en/Reference/For
удали папку RobotIRremote
Да она конфликтует с подгруженной и не компилится. Но не работает с подруженной библиотекой irRemote функция tone() и это печалит. (наверное по прерываниям где-то)
Хотел мелодию в гостях у сказки поставить на открывание воротин :)
Жаль RobotIRremote ошибку выдает при подключении... может с ней тоне и заработал
они же вроде один таймер используют. не будут одновременно работать в таком виде изза этого
Да, таймер 2 используют. Я изменил библиотеку RobotIRremote - в файле IRremoteInt.h поправил таймеры , ещё в IRremoteTools.cpp пришлось явно приписать вывод, куда ик-датчик подключен. И заработало. Как в других библиотеках IRremote менять таймер - не разобрался, поэтому роботирремоте и крутил. Теперь ик-приём и функция (тоне) вместе работают.
Там подсказка есть
// define which timer to use
вот тут меняем комментариями
#define IR_USE_TIMER1 // tx = pin 11
// #define IR_USE_TIMER2 // tx = pin 9
меняем закомменитрованный/раскомментированный таймер (там несколько мест, для разных плат/контроллеров, я все поменял, не нашёл какой именно у меня)
>xzeus
подскажите, а какие у вас приводы по характеристикам?
и каким реле коммутировать собрались?