Помогите написать скетч с использованием библиотеки IRremote.

android2202
Offline
Зарегистрирован: 16.07.2019

Moderator : пожалуйста, вставьте код правильно - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

android2202
Offline
Зарегистрирован: 16.07.2019

Каким-то образом, после нажатия определенных комбинаций на пульте, мне нужно чтоб микроконтроллер запомнил четыре кнопки нажатые после, нажатия этой комбинации.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Вставьте код согласно правилам форума. 

Переработайте логику работы скетча. Используйте два флага для определения комбинации нажатых кнопок, первый для первой комбинации, второй - для второй комбинации. Если комбинация не верна - сбросить флаг. Сейчас внутреннее условие у вас никогда не выполнится. 

android2202
Offline
Зарегистрирован: 16.07.2019
boolean ik_flag = false;
#include <IRremote.h>
IRrecv irrecv(2);
decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
 }

void loop() {

 if (irrecv.decode(&results)) {
  Serial.println(results.value,HEX);
   if (ik_flag == true && results.value == 0xFFB04F ) {   // с помощью этой конструкции, при комбинации нажатий определеных кнопок на пульте должна выполнятся задуманная мной программа 
    
 /*  Serial.println("начало работы программы");      // чтоб я видел что программа работает                                              
       int i=0;                                                                    //
       int aray[4];                                                            //
       while (i<4) {                                                         //         здесь должна быть программа которая запоминает четыре кнопки на пульте, нужных мне кнопки.
        if (irrecv.decode(&results)  {                             //  ------- второй раз эта конструкция не работает, я не знаю как записать эти кнопки (а точнее коды этих кнопок) в память микроконтроллера
           aray[i] = results.value;                                 // 
           irrecv.resume();                                          //
         }                                                                  //
       i++;                                                              //
      }                                                                  //
        */
       
      }
    else{ if( results.value == 0xFF6897 ) {ik_flag = true;} else {ik_flag = false;} } // вторая часть конструкции
  irrecv.resume();
 }
}

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

Arduino_Pro_Micro
Offline
Зарегистрирован: 08.03.2019

BOOM пишет:

Вставьте код согласно правилам форума. 

Переработайте логику работы скетча. Используйте два флага для определения комбинации нажатых кнопок, первый для первой комбинации, второй - для второй комбинации. Если комбинация не верна - сбросить флаг. Сейчас внутреннее условие у вас никогда не выполнится. 

не 2 а несколько (смотря сколько нажатий у него в комбинации)!!!!

а так ваще поддерживаю

android2202
Offline
Зарегистрирован: 16.07.2019

BOOM пишет:

Вставьте код согласно правилам форума. 

Переработайте логику работы скетча. Используйте два флага для определения комбинации нажатых кнопок, первый для первой комбинации, второй - для второй комбинации. Если комбинация не верна - сбросить флаг. Сейчас внутреннее условие у вас никогда не выполнится. 

boolean ik_flag = false;
boolean ik_flag2 = false;

 #include <IRremote.h>
 IRrecv irrecv(2);
 decode_results results;
 void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
 if (irrecv.decode(&results)) {
  Serial.println(results.value,HEX);

  if (results.value == 0xFF6897) {ik_flag = true; } 
    else { 
      if (ik_flag == true && results.value == 0xFFB04F ) {ik_flag2 = true;} 
       else {
         ik_flag = false;
         ik_flag2 = false;
           } 
          }
  
  irrecv.resume();
  
 }
}

написанно согласно вашим указанием, огромное спасибо за наставление, щяс осталось придумать как записать шифры кнопок в память мк, но я думаю, надеюсь, с этим проблем не возникнет! еще раз спасибо

 
android2202
Offline
Зарегистрирован: 16.07.2019

Друзья, у меня появилась новая проблемма. Я новичек в этом деле и возможно это вам покажется глупостью, но я никак не могу разобратся с этим.

Проблемма в том что в массив идет запись одних чисел, а при выводе значений ячеек массива оказывается что записаны совсем другие

вот скетч

boolean scikl_flag = false;
boolean ik_flag = false;
boolean ik_flag2 = false;
int i = -2;
int aray[4];
 #include <IRremote.h>
 IRrecv irrecv(2);
 decode_results results;
 void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
 if (irrecv.decode(&results)) {




//begin

// этот кусок кода дает возможность после нажатия комбинации двух клавишь на пульте, записывать четыре шифра кнопок
 // для дальнейшего самопрограммирования проэкта
 
  if (results.value == 0xFF6897) {ik_flag = true; }                              
    else {                                                                      
      if (ik_flag == true && results.value == 0xFFB04F ) {ik_flag2 = true;}      
       else {
         ik_flag = false;
         ik_flag2 = false;
           } 
          }

  if (ik_flag == true && ik_flag2 == true) {i=-1;}  
                        
  scikl_flag = true;
  while (i>=0 && i<4 && scikl_flag == true ) {

     Serial.print("записалось число "); 
     Serial.println(i); 
     Serial.println(results.value,HEX);   
     aray[i]=results.value;  
     Serial.println();
     if (i==4) {i=-1;}
     scikl_flag = false;
  }
  if (i!=-2) {i++;}
  

// end.

if (results.value == 0xFF02FD) {
  for (int k=0; k<4; k++) {
    Serial.print("Записанное число ");
    Serial.println(aray[k],HEX);
  }
}

вот входные/выходные данные

записалось число 0
FFA25D 
 
записалось число 1
FF629D
 
записалось число 2
FFE21D
 
записалось число 3
FF22DD
 
Записанное число FFFFA25D
Записанное число 629D
Записанное число FFFFE21D
Записанное число 22DD
 
Domosed
Offline
Зарегистрирован: 15.07.2019

По мотивам темы android2202 скетч для кодового замка, с вводом кода с IR пульта:

////////////////////////////////////////////////////////////////////
// Кодовый замок от кладовки где ардуинки лежат, на IR пульте от МТС
////////////////////////////////////////////////////////////////////
#include <IRremote.h>
IRrecv irrecv(3);
decode_results results;
unsigned long Kod[] = 
  { 0xA561A35C, 0xA561639C, 
    0xA561E31C, 0xA561916E, 0xA561FB04};  // секретный <код> [1234] + [ok]

void setup() 
{
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() 
{
  boolean fOk = false;      // флаг Ok
  int nkey = 0;
  do
  { 
    while(!irrecv.decode(&results));      // ждём посылки IR
    Serial.println(results.value, HEX);   // смотрим код в мониторе
    if ( results.value == 0xFFFFFFFF)     // длинное нажатие, повтор
    {
      irrecv.resume();                    
      continue;
    }
    if ( results.value == Kod[nkey++]) fOk = true;   // Ok
      else 
      {
        fOk = false;    // не Ok
        irrecv.resume();
        break;
      }
    irrecv.resume();
  } while ( nkey < (sizeof(Kod)/sizeof(Kod[0])));    // размер <кода>
  if (fOk)
  {
    Serial.println("<<< Ok >>>");   // Угадали код - бинго
  }
}

Тревожит большое число вызовов irrecv.resume();

 
 
 

 

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Видимо не лезет в int aray[4] числа типа FFA25D ...

В описании вижу:

class decode_results
{
	public:
		decode_type_t          decode_type;  // UNKNOWN, NEC, SONY, RC5, ...
		unsigned int           address;      // Used by Panasonic & Sharp [16-bits]
		unsigned long          value;        // Decoded value [max 32-bits]
		int                    bits;         // Number of bits in decoded value
		volatile unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
		int                    rawlen;       // Number of records in rawbuf
		int                    overflow;     // true iff IR raw code too long
};

 

android2202
Offline
Зарегистрирован: 16.07.2019

Komandir пишет:

Видимо не лезет в int aray[4] числа типа FFA25D ...

В описании вижу:

class decode_results
{
	public:
		decode_type_t          decode_type;  // UNKNOWN, NEC, SONY, RC5, ...
		unsigned int           address;      // Used by Panasonic & Sharp [16-bits]
		unsigned long          value;        // Decoded value [max 32-bits]
		int                    bits;         // Number of bits in decoded value
		volatile unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
		int                    rawlen;       // Number of records in rawbuf
		int                    overflow;     // true iff IR raw code too long
};

 

Огромное спасибо, поставил unsigned long все работает

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Arduino_Pro_Micro пишет:

не 2 а несколько (смотря сколько нажатий у него в комбинации)!!!!

а так ваще поддерживаю

Для данной задачи даже если усложнить комбинации двух флагов «за глаза».

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

android2202 пишет:

Огромное спасибо, поставил unsigned long все работает

это самый приятный момент на форумах - что вопрошающему помогли и он понял как именно помогли))) Удачи!