Управление электроприводом дверей с ик пультов (открывание дверей IR remote)

xzeus
Offline
Зарегистрирован: 15.07.2015

Создал и работает у меня проектик для въезда на небольшое предприятие машин.

Электропривод был к ниму завтра подставлю на контакт открытия ардуино 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
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

xzeus пишет:

delay (250); // для экономии батарейки и чтоб ардуинку зря не гонять 4 раза в секунду выполнять loop 

Вы добрый человек. )))

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

удали папку RobotIRremote 

Radjah
Offline
Зарегистрирован: 06.08.2014
xzeus
Offline
Зарегистрирован: 15.07.2015

Клапауций 999 пишет:

удали папку RobotIRremote 

Да она конфликтует с подгруженной и  не компилится. Но не работает с подруженной библиотекой irRemote функция tone() и это печалит. (наверное по прерываниям где-то)

Хотел мелодию в гостях у сказки поставить на открывание воротин :)

Жаль RobotIRremote ошибку выдает при подключении... может с ней тоне и заработал
 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

они же вроде один таймер используют. не будут одновременно работать в таком виде изза этого

 

AlexKooper
Offline
Зарегистрирован: 26.10.2015

Да, таймер 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
 

 

меняем закомменитрованный/раскомментированный таймер (там несколько мест, для разных плат/контроллеров, я все поменял, не нашёл какой именно у меня)

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

>xzeus

подскажите, а какие у вас приводы по характеристикам?

и каким реле коммутировать собрались?