Ик приемник

ardunit
Offline
Зарегистрирован: 27.03.2019

Начал разбираться с ик приемником.Пытаюсь выполнить небольшой проект по зажиганию ламп с пульта.Вроде работает, но возникает одна проблема.При зажатии кнопки появляется число, которое мешает выполнению запуска реле модуля.И я к сожалению не знаю как сделать так что бы она перестало выводиться или хотя бы выполняло такую же функцию как число предшествующие перед ним.Незнаю вообще возможно ли это или может есть какие-то лазейки.Код внизу

#include "IRremote.h"
int nr = 0;
int r = 0;
IRrecv irrecv(A0); 
decode_results results;
void setup() {
 // Serial.begin(9600); 
  irrecv.enableIRIn(); 
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
}

void loop() {

  if ( irrecv.decode( &results )){ 
  //   Serial.println( results.value/10000,DEC);
     r=results.value/10000;
     irrecv.resume();
 
if (r == 1671) {
     digitalWrite(5, LOW);
irrecv.resume();  
if ((r == 1671)and(nr==1671)) {
     digitalWrite(5, HIGH);
irrecv.resume();
r=332471435;
}}
if (r == 1674) {
     digitalWrite(4, LOW);
irrecv.resume();    
if ((r == 1674)and(nr==1674)) {
     digitalWrite(4, HIGH);
irrecv.resume();  
r=32471435;
}}
nr = r;
  }
}

 

NikShel
Offline
Зарегистрирован: 21.01.2018

По-моему, Вы пошли не тем путём!

Есть такой скетч:

#include "IRLremote.h"
#define pinIR 2 // only D2
CHashIR IRLremote;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Startup"));
  if (!IRLremote.begin(pinIR))
    Serial.println(F("You did not choose a valid pin."));
}

void loop() {
 //    Serial.println("0x");
  if (IRLremote.available()) {
    auto data = IRLremote.read();
    if (data.command != 292984781) {
      Serial.print("0x");
      Serial.println(data.command, HEX);
    }
  }
}

Работает только с входом D2 !! проверял.

Можно считать значения кнопок своего пульта примерно в таком виде:

// ----- КНОПКИ СВОЕГО ПУЛЬТА -----
#if REMOTE_TYPE == 3
#define BUTT_UP     0xF39EEBAD //
#define BUTT_DOWN   0x297C76AD //
#define BUTT_LEFT   0xF352BCAD
#define BUTT_RIGHT  0x65CF91AD
#define BUTT_OK     0xD53818AD
#define BUTT_1      0x4AABDFAD
#define BUTT_2      0xB3EADCAD
#define BUTT_3      0xBD28B4AD
#define BUTT_4      0x38379AD  // 0-??
#define BUTT_5      0x6CC276AD
#define BUTT_6      0x76004EAD
#define BUTT_7      0x14CE54AD
#define BUTT_8      0x7E0D51AD
#define BUTT_9      0x874B29AD
#define BUTT_0      0xA2A001AD
#define BUTT_STAR   0x396104AD
#define BUTT_HASH   0xABDDD9AD  // #
#endif

Собирабаюсь сделать такой 3-х канальный автомат.

Логика будет примерно такая: кнопки 1, 2, 3 - вкл. и откл. соответствующий канал. Кнопка: 0 - выключает сразу все каналы. После реализации отпишусь.

NikShel
Offline
Зарегистрирован: 21.01.2018

int занимает 2 байта памяти, и может хранить числа от -32 768 до 32 767

А у Вас:

36 r=32471435;

Изучайте мат.часть!

Тему предлагаю перенести в песочницу!! 

 

 

ardunit
Offline
Зарегистрирован: 27.03.2019

Спасибо.Попробовал все заработало.

 

ardunit
Offline
Зарегистрирован: 27.03.2019

Очень хороший способ мусора не выводит,но как же тогда сделать так что бы если значение пришло дважды, то выключалось.Даже способа придумать не могу. 

NikShel
Offline
Зарегистрирован: 21.01.2018

А я придумал (вернее переделал цветомузыкальный счетч одного известного Ардуинщика):

#include "IRLremote.h" // бибилиотека
#define pinIR 2 // only D2 - пин ИК приёмника
CHashIR IRLremote;
uint32_t IRdata;
#define MODE 0                    // режим при запуске

// ----- настройка ИК пульта
#define REMOTE_TYPE 3   // 0 - без пульта, 1 - пульт от WAVGAT, 2 - пульт от KEYES, 3 - кастомный пульт
// ----- КНОПКИ meanta ПУЛЬТА -----
#if REMOTE_TYPE == 3
#define BUTT_UP    0xF39EEBAD // not worked
#define BUTT_DOWN  0x297C76AD // not worked
#define BUTT_LEFT  0xF352BCAD // not worked
#define BUTT_RIGHT 0x65CF91AD // not worked
#define BUTT_OK    0xD53818AD // not worked
#define BUTT_1   0xF56DE0E1
#define BUTT_2   0x8C2EE3E1
#define BUTT_3   0x891A1EE1
#define BUTT_4      0x2E6030E1
#define BUTT_5      0x2B4B6BE1
#define BUTT_6      0xC20C6EE1
#define BUTT_7      0xBEF7A9E1
#define BUTT_8      0x4CC703E1
#define BUTT_9      0x49B23EE1
#define BUTT_0   0xF882A5E1
#define BUTT_EPG   0x396104AD // not worked
#define BUTT_INFO   0xB0C193E1  // #
#endif
// ----- КНОПКИ ПУЛЬТА WAVGAT -----
#if REMOTE_TYPE == 1
#define BUTT_UP     0xF39EEBAD
#define BUTT_DOWN   0xC089F6AD
#define BUTT_LEFT   0xE25410AD
#define BUTT_RIGHT  0x14CE54AD
#define BUTT_OK     0x297C76AD
#define BUTT_1      0x4E5BA3AD
#define BUTT_2      0xE51CA6AD
#define BUTT_3      0xE207E1AD
#define BUTT_4      0x517068AD
#define BUTT_5      0x1B92DDAD
#define BUTT_6      0xAC2A56AD
#define BUTT_7      0x5484B6AD
#define BUTT_8      0xD22353AD
#define BUTT_9      0xDF3F4BAD
#define BUTT_0      0xF08A26AD
#define BUTT_STAR   0x68E456AD
#define BUTT_HASH   0x151CD6AD
#endif

// ----- КНОПКИ ПУЛЬТА KEYES -----
#if REMOTE_TYPE == 2
#define BUTT_UP     0xE51CA6AD
#define BUTT_DOWN   0xD22353AD
#define BUTT_LEFT   0x517068AD
#define BUTT_RIGHT  0xAC2A56AD
#define BUTT_OK     0x1B92DDAD
#define BUTT_1      0x68E456AD
#define BUTT_2      0xF08A26AD
#define BUTT_3      0x151CD6AD
#define BUTT_4      0x18319BAD
#define BUTT_5      0xF39EEBAD
#define BUTT_6      0x4AABDFAD
#define BUTT_7      0xE25410AD
#define BUTT_8      0x297C76AD
#define BUTT_9      0x14CE54AD
#define BUTT_0      0xC089F6AD
#define BUTT_STAR   0xAF3F1BAD
#define BUTT_HASH   0x38379AD
#endif
#define MODE_AMOUNT 3      // количество каналов
boolean Flag_C1, Flag_C2, Flag_C3;
byte C1 = 4; //пин канала №1
byte C2 = 5; //пин канала №2
byte C3 = 6; //пин канала №3
volatile boolean ir_flag;
byte this_mode = MODE;

void setup() {
  pinMode(C1, OUTPUT);
  pinMode(C2, OUTPUT);
  pinMode(C3, OUTPUT);
  Serial.begin(9600);
  Serial.println(F("Startup"));
  IRLremote.begin(pinIR);
}

void loop() {

#if REMOTE_TYPE != 0

  if (IRLremote.available())  {
    auto data = IRLremote.read();
    IRdata = data.command;
    ir_flag = true;
    Serial.print("0x"); Serial.println(data.command, HEX);
  }
  if (ir_flag) { // если данные пришли

    switch (IRdata) {
      // режимы
      case BUTT_1: this_mode = 1;
        Flag_C1 = ! Flag_C1;
        chan_01();
        break;
      case BUTT_2: this_mode = 2;
        Flag_C2 = ! Flag_C2;
        chan_02();
        break;
      case BUTT_3: this_mode = 3;
        Flag_C3 = ! Flag_C3;
        chan_03();
        break;
      case BUTT_4: this_mode = 4;
        break;
      case BUTT_5: this_mode = 5;
        break;
      case BUTT_6: this_mode = 6;
        break;
      case BUTT_7: this_mode = 7;
        break;
      case BUTT_8: this_mode = 8;
        break;
      case BUTT_9: this_mode = 9;
        break;
      case BUTT_0: {
          this_mode = 0;
          Flag_C1 = LOW;
          chan_01();
          Flag_C2 = LOW;
          chan_02();
          Flag_C3 = LOW;
          chan_03();
        }
        break;
    }
    IRdata = 0; // для ожидания следующего нажатия !!!
#endif
    // Serial.println(this_mode);
    delay(10);
  }
  ir_flag != true;
}

void chan_01() {   // переключение кан.1
  digitalWrite(C1, Flag_C1);
  Serial.print(C1); Serial.println(Flag_C1);
}

void chan_02() {    // переключение кан.2
  digitalWrite(C2, Flag_C2);
  Serial.print(C2); Serial.println(Flag_C2);
}

void chan_03() {    // переключение кан.3
  digitalWrite(C3, Flag_C3);
  Serial.print(C3); Serial.println(Flag_C3);
}
// Sketch uses 3768 bytes (12%) of program storage space. Maximum is 30720 bytes.
// Global variables use 218 bytes (10%) of dynamic memory, leaving 1830 bytes for local variables. Maximum is 2048 bytes.

Есть возможность использовать другие пульты и легко добавлять новые каналы.

Потом сюда может быть и цветомузыку вставлю дополнительно

ardunit
Offline
Зарегистрирован: 27.03.2019

Да еще есть маленький вопрос может кто-нибудь знает как конвернтировать переменную типа auto в переменную типа intger?Буда рад если кто-нибудь ответит.

 

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

NikShel пишет:

Есть такой скетч:

#include "IRLremote.h"
#define pinIR 2 // only D2
CHashIR IRLremote;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Startup"));
  if (!IRLremote.begin(pinIR))
    Serial.println(F("You did not choose a valid pin."));
}

void loop() {
 //    Serial.println("0x");
  if (IRLremote.available()) {
    auto data = IRLremote.read();
    if (data.command != 292984781) {
      Serial.print("0x");
      Serial.println(data.command, HEX);
    }
  }
}

Работает только с входом D2 !! проверял.

адрес библиотеки можно, которые нашёл не работают.

что за число 292984781 - ? в строке 16.

 

ardunit
Offline
Зарегистрирован: 27.03.2019

Я вроде сделал свой проект с лампами если кому интресно скетч внизу.

#include "IRLremote.h"
#define pinIR 2
bool i = true;
bool j = false;
bool g = true;
bool h = false;
CHashIR IRLremote;
void setup() {
  Serial.begin(9600);
  pinMode(5,OUTPUT);
  pinMode(4,OUTPUT);
 IRLremote.begin(pinIR);
 digitalWrite(5,HIGH);
 digitalWrite(4,HIGH);
}
void loop() {
  if (IRLremote.available()) {
     auto data = IRLremote.read();
    if (data.command != 292984781)
    {Serial.print("0x");
     Serial.println(data.command, HEX);}
//-----------------------------------------------------------------------
    if((data.command == 0xF39EEBAD)and(i==true))
    { digitalWrite(5, LOW);   
     i = false;
     j = true;
     data.command = 0;   }
     
if((data.command == 0xF39EEBAD)and(j==true))
{digitalWrite(5, HIGH);
 i = true;
 j = false;           }

//-----------------------------------------------------------------------  
if((data.command == 0x18319BAD)and(h==true))
    { digitalWrite(4, LOW);   
     h = false;
     g = true;
     data.command = 0; }
     
if((data.command == 0x18319BAD)and(g==true))
{digitalWrite(4, HIGH);
 h = true;
 g = false;            }
//-----------------------------------------------------------------------     
         if(data.command == 0x4AABDFAD)
         { digitalWrite(5, HIGH);
         digitalWrite(4, HIGH);}  
     }//1 иф  
}//loop

Логика такова 1 нажатие включение 2 нажатие выклюение.Кнопка 3 выключение всех ламп.Работает на 2 реле 

NikShel
Offline
Зарегистрирован: 21.01.2018

oleg_kazakof пишет:

адрес библиотеки можно, которые нашёл не работают.

я скачивал здесь. Зелёная кнопка "Скачать архив".

NikShel
Offline
Зарегистрирован: 21.01.2018

ardunit пишет:

Да еще есть маленький вопрос может кто-нибудь знает как конвернтировать переменную типа auto в переменную типа intger?Буда рад если кто-нибудь ответит.

 Полистал книжку "C++ 3а 21 день" - нет таких типов!

ardunit
Offline
Зарегистрирован: 27.03.2019

NikShel пишет:

ardunit пишет:

Да еще есть маленький вопрос может кто-нибудь знает как конвернтировать переменную типа auto в переменную типа intger?Буда рад если кто-нибудь ответит.

 Полистал книжку "C++ 3а 21 день" - нет таких типов!

Жаль.А книжка хорошая?

 

Logik
Offline
Зарегистрирован: 05.08.2014

Хорошая или нет не знаю, но явно старинная. auto  из свежего.

NikShel
Offline
Зарегистрирован: 21.01.2018

Logik пишет:

Хорошая или нет не знаю, но явно старинная. auto  из свежего.

Книжка толстая:

Здешний сервер не даёт мне закачать фотки!


 

 

strarbit
Offline
Зарегистрирован: 12.06.2016
ardunit
Offline
Зарегистрирован: 27.03.2019

Спасибо! Про auto стало все ясно.

 

ardunit
Offline
Зарегистрирован: 27.03.2019

oleg_kazakof пишет:

NikShel пишет:

Есть такой скетч:

#include "IRLremote.h"
#define pinIR 2 // only D2
CHashIR IRLremote;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Startup"));
  if (!IRLremote.begin(pinIR))
    Serial.println(F("You did not choose a valid pin."));
}

void loop() {
 //    Serial.println("0x");
  if (IRLremote.available()) {
    auto data = IRLremote.read();
    if (data.command != 292984781) {
      Serial.print("0x");
      Serial.println(data.command, HEX);
    }
  }
}

Работает только с входом D2 !! проверял.

адрес библиотеки можно, которые нашёл не работают.

что за число 292984781 - ? в строке 16.

 

Хороший вопрос.Так чсе таки что это за число

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Переведите его в HEX и погуглите.

strarbit
Offline
Зарегистрирован: 12.06.2016

ardunit пишет:

Хороший вопрос.Так чсе таки что это за число

neimeet znacenia B sketch ot Bac prosto knopka znacenia ir kontrol.

NikShel
Offline
Зарегистрирован: 21.01.2018

ardunit пишет:

что за число 292984781 - ? в строке 16.

Хороший вопрос.Так чсе таки что это за число

Занялся опять пультами и вот теперь могу ответить!

Это число выдаёт китайский WAVGAT пульт, вместе с полезной информацией, при нажатии на любую кнопку. Часто мешает. Снижает быстродействие программы!