Считывание двухзначных чисел с ИК пульта

Iskander97
Offline
Зарегистрирован: 06.11.2018

Как программно считывать двузначные цифры с ИК пульта?

Iskander97
Offline
Зарегистрирован: 06.11.2018

Есть у кого-нибудь готовый скетч?

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

Последний готовый скетч неделю назад ушёл. Новых не завозили еще.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Есть!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что такое

Iskander97 пишет:

двузначные цифры

и откуда они берутся на пульте?

Iskander97
Offline
Зарегистрирован: 06.11.2018

Как его найти?

Iskander97
Offline
Зарегистрирован: 06.11.2018

Скинешь может?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Iskander97 пишет:

Скинешь может?

Да легко! Читает почти все типы пультов.

//------------------------------------------------------------------------------
// Include the IRremote library header
//
#include <IRremote.h>

//------------------------------------------------------------------------------
// Tell IRremote which Arduino pin is connected to the IR Receiver (TSOP4838)
//
int recvPin = 11;
IRrecv irrecv(recvPin);

//+=============================================================================
// Configure the Arduino
//
void  setup ( )
{
  Serial.begin(9600);   // Status message will be sent to PC at 9600 baud
  irrecv.enableIRIn();  // Start the receiver
}

//+=============================================================================
// Display IR code
//
void  ircode (decode_results *results)
{
  // Panasonic has an Address
  if (results->decode_type == PANASONIC) {
    Serial.print(results->address, HEX);
    Serial.print(":");
  }

  // Print Code
  Serial.print(results->value, HEX);
}

//+=============================================================================
// Display encoding type
//
void  encoding (decode_results *results)
{
  switch (results->decode_type) {
    default:
    case UNKNOWN:      Serial.print("UNKNOWN");       break ;
    case NEC:          Serial.print("NEC");           break ;
    case SONY:         Serial.print("SONY");          break ;
    case RC5:          Serial.print("RC5");           break ;
    case RC6:          Serial.print("RC6");           break ;
    case DISH:         Serial.print("DISH");          break ;
    case SHARP:        Serial.print("SHARP");         break ;
    case JVC:          Serial.print("JVC");           break ;
    case SANYO:        Serial.print("SANYO");         break ;
    case MITSUBISHI:   Serial.print("MITSUBISHI");    break ;
    case SAMSUNG:      Serial.print("SAMSUNG");       break ;
    case LG:           Serial.print("LG");            break ;
    case WHYNTER:      Serial.print("WHYNTER");       break ;
    case AIWA_RC_T501: Serial.print("AIWA_RC_T501");  break ;
    case PANASONIC:    Serial.print("PANASONIC");     break ;
    case DENON:        Serial.print("Denon");         break ;
  }
}

//+=============================================================================
// Dump out the decode_results structure.
//
void  dumpInfo (decode_results *results)
{
  // Check if the buffer overflowed
  if (results->overflow) {
    Serial.println("IR code too long. Edit IRremoteInt.h and increase RAWBUF");
    return;
  }

  // Show Encoding standard
  Serial.print("Encoding  : ");
  encoding(results);
  Serial.println("");

  // Show Code & length
  Serial.print("Code      : ");
  ircode(results);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
}

//+=============================================================================
// Dump out the decode_results structure.
//
void  dumpRaw (decode_results *results)
{
  // Print Raw data
  Serial.print("Timing[");
  Serial.print(results->rawlen-1, DEC);
  Serial.println("]: ");

  for (int i = 1;  i < results->rawlen;  i++) {
    unsigned long  x = results->rawbuf[i] * USECPERTICK;
    if (!(i & 1)) {  // even
      Serial.print("-");
      if (x < 1000)  Serial.print(" ") ;
      if (x < 100)   Serial.print(" ") ;
      Serial.print(x, DEC);
    } else {  // odd
      Serial.print("     ");
      Serial.print("+");
      if (x < 1000)  Serial.print(" ") ;
      if (x < 100)   Serial.print(" ") ;
      Serial.print(x, DEC);
      if (i < results->rawlen-1) Serial.print(", "); //',' not needed for last one
    }
    if (!(i % 8))  Serial.println("");
  }
  Serial.println("");                    // Newline
}

//+=============================================================================
// Dump out the decode_results structure.
//
void  dumpCode (decode_results *results)
{
  // Start declaration
  Serial.print("unsigned int  ");          // variable type
  Serial.print("rawData[");                // array name
  Serial.print(results->rawlen - 1, DEC);  // array size
  Serial.print("] = {");                   // Start declaration

  // Dump data
  for (int i = 1;  i < results->rawlen;  i++) {
    Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
    if ( i < results->rawlen-1 ) Serial.print(","); // ',' not needed on last one
    if (!(i & 1))  Serial.print(" ");
  }

  // End declaration
  Serial.print("};");  // 

  // Comment
  Serial.print("  // ");
  encoding(results);
  Serial.print(" ");
  ircode(results);

  // Newline
  Serial.println("");

  // Now dump "known" codes
  if (results->decode_type != UNKNOWN) {

    // Some protocols have an address
    if (results->decode_type == PANASONIC) {
      Serial.print("unsigned int  addr = 0x");
      Serial.print(results->address, HEX);
      Serial.println(";");
    }

    // All protocols have data
    Serial.print("unsigned int  data = 0x");
    Serial.print(results->value, HEX);
    Serial.println(";");
  }
}

//+=============================================================================
// The repeating section of the code
//
void  loop ( )
{
  decode_results  results;        // Somewhere to store the results

  if (irrecv.decode(&results)) {  // Grab an IR code
    dumpInfo(&results);           // Output the results
    dumpRaw(&results);            // Output the results in RAW format
    dumpCode(&results);           // Output the results as source code
    Serial.println("");           // Blank line between entries
    irrecv.resume();              // Prepare for the next value
  }
}

 

Iskander97
Offline
Зарегистрирован: 06.11.2018

А нет ничего попроще?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Да легко! Читает почти все типы пультов.

Тема "двузначных цифр" не раскрыта!

Iskander97
Offline
Зарегистрирован: 06.11.2018

Кстати да

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

Да легко! Читает почти все типы пультов.

Тема "двузначных цифр" не раскрыта!

а каких именно?
73,88 или 99?

b707
Offline
Зарегистрирован: 26.05.2017

Iskander97 пишет:

Кстати да

что "да" то?

перевожу - вы несете сплошную пургу. поэтому вас тролят.

Двухзначных цифр не бывает, если вы это в школе не усвоили.

А готовых скетчей тут не подают, не ждите.

Iskander97
Offline
Зарегистрирован: 06.11.2018

Пофиг, что тролят) суть то все поняли

Есть кто сможет объяснить, как считывать последовательность цифр, и сделать его двухзначным числом?

b707 пишет:

Iskander97 пишет:

Кстати да

что "да" то?

перевожу - вы несете сплошную пургу. поэтому вас тролят.

Двухзначных цифр не бывает, если вы это в школе не усвоили.

А готовых скетчей тут не подают, не ждите.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Iskander97 пишет:

Пофиг, что тролят) суть то все поняли

Есть кто сможет объяснить, как считывать последовательность цифр, и сделать его двухзначным числом?

Вы такие сложные вопросы задаете. Вот есть последовательность цифр "1234567890" и как из них сделать двухзначное. Надо наверное все сложить.

Iskander97
Offline
Зарегистрирован: 06.11.2018

как Заставить ардуино принимать комбинацию цифр вводимую с пульта, например 12 

Нажал кнопку 1 он прочитал, ожидание следующего сигнала, нажали кнопку 2

вот как сделать так чтобы он ждал какое-то время ещё одну цифру а только потом выполнял прогу?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Так ИК дрянь еще та. И Вы тоже плаваете в программировании как батискаф. Так что начинайте с основ и не беритесь за такие задачи. Вам даже объянения не по зубам.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Iskander97 пишет:

как Заставить ардуино принимать комбинацию цифр вводимую с пульта, например 12 

Нажал кнопку 1 он прочитал, ожидание следующего сигнала, нажали кнопку 2

вот как сделать так чтобы он ждал какое-то время ещё одну цифру а только потом выполнял прогу?

Я вижу только один простой способ разрешения вашей задачи, берёте пульт с нужным количеством кнопок и будет вам счастье

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

 Вы тоже плаваете в программировании как батискаф

Скорее, как топор :)

Iskander97
Offline
Зарегистрирован: 06.11.2018

Спасибо, что так четко объяснили 

нет чтобы помочь 

nik182
Offline
Зарегистрирован: 04.05.2015

С приёмом одной цифры всё в порядке?
Тогда бери блинк без делей, выкидывай диод или добавь к нему переменную, где будешь считать тики. Например пришла цифра, прошло 5 тиков а второй нет - значит однозначно число. Пришла вторая за 10 тиков, а за 15 тиков больше ничего не пришло - число двухзначное. Набиваешь чарами стринг и toint.

Iskander97
Offline
Зарегистрирован: 06.11.2018

для одной цифры все норм работает

nik182 пишет:
С приёмом одной цифры всё в порядке? Тогда бери блинк без делей, выкидывай диод или добавь к нему переменную, где будешь считать тики. Например пришла цифра, прошло 5 тиков а второй нет - значит однозначно число. Пришла вторая за 10 тиков, а за 15 тиков больше ничего не пришло - число двухзначное. Набиваешь чарами стринг и toint.

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

Зачем чарами махать, если достаточно кастануть на число *=10?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Iskander97 пишет:

Спасибо, что так четко объяснили 

нет чтобы помочь 


 А какую помощь вы хотите?
Разные пульты передают разную кодовую последовательность, к примеру пульт от RTL-SDR:

1 FF906F
2 FFB847
3 FFF807
4 FFB04F
5 FF9867
6 FFD827
7 FF8877
8 FFA857
9 FFE817
0 FF48B7

Принимаете, присваиваете переменным значения, трудности возникнут с комбинациями 11-22-33 и т.д.

Iskander97
Offline
Зарегистрирован: 06.11.2018

проблема в том, что как только я принимаю какой то сигнал с пульта, прога начинает выполняться, ему пофиг что я нажму дальше на пульте. То есть прога воспринимает только первую нажатую кнопку, а дальше ей пофиг

ua6em пишет:

 

 А какую помощь вы хотите?
Разные пульты передают разную кодовую последовательность, к примеру пульт от RTL-SDR:

1 FF906F
2 FFB847
3 FFF807
4 FFB04F
5 FF9867
6 FFD827
7 FF8877
8 FFA857
9 FFE817
0 FF48B7

Принимаете, присваиваете переменным значения, трудности возникнут с комбинациями 11-22-33 и т.д.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

И где эта программа?

Iskander97
Offline
Зарегистрирован: 06.11.2018
#include "IRremote.h"
IRrecv irrecv(A0); // указываем вывод, к которому подключен приемник

decode_results results;

int bt = 0, p=0, b, s,a,old;
const int data_pin = 2;
const int sh_pin = 4;
const int st_pin = 3;

void setup() {
  Serial.begin(9600); // выставляем скорость COM порта
  irrecv.enableIRIn(); // запускаем прием
      pinMode(data_pin, OUTPUT);
    pinMode(sh_pin, OUTPUT);
    pinMode(st_pin, OUTPUT);
}

void shift(byte v){
    for(int i=0; i<8; i++){
        digitalWrite(sh_pin, LOW);
        digitalWrite(data_pin,  v & (1 << i ));
        digitalWrite(sh_pin, HIGH);
    }
    digitalWrite(st_pin, HIGH); 
    digitalWrite(st_pin, LOW);
}

int define( int z)
{
  switch ( z ) {
     case 0xC:
       bt=0b00000000;
       return -10;
        break;
    case 0x1:
       bt=0b10000000;
       return 1;
       break;
    case 0x2:
        bt=0b01000000;
        return 2;
       
        break;
         case 0x3:
        bt=0b00100000;
        return 3;
        
        break;
         case 0x4:
        bt=0b00010000;
        return 4;
        break;
         case 0x5:
        bt=0b00001000;
        return 5;
        break;
         case 0x6:
        bt=0b00000100;
        return 6;
        break;
         case 0x7:
        bt=0b00000010;
        return 7;
        break;
         case 0x8:
        bt=0b01000000;
        return 8;
        break;
         case 0x9:
        bt=0b01000000;
        return 9;
        break;
         case 0x0:
        bt=0b00000000;
        return 0;
        break;
  }
}


void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
      Serial.println("Kod= ");
    Serial.println( results.value, DEC ); // печатаем данные
    p=define( results.value)*10;  
     Serial.println("P= ");
    Serial.println(p ); // печатаем данные
    irrecv.resume(); // принимаем следующую команду 
   }
    Serial.println(define( results.value) ); // печатаем данные
    s=p+define( results.value);
    
   // Serial.println("p= ");
    //Serial.println( p, BIN ); // печатаем данные
    //Serial.println("p*10= ");
   //Serial.println( p*10, BIN ); // печатаем данные
    //Serial.println("b= ");
   //Serial.println( b, BIN ); // печатаем данные
 
  
   Serial.println("s= ");
   Serial.println(s ); // печатаем данные
    Serial.println("________________________");
    switch ( s ) {
     case 0xC:
       bt=0b00000000;
        break;
    case 0x1:
       bt=0b10000000;
        break;
    case 0x2:
        bt=0b01000000;
        break;
    }    
    
    shift(bt);
  }
}

 

Iskander97
Offline
Зарегистрирован: 06.11.2018

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Iskander97 пишет:
тут уже я сам запутался,но  сначала логика в моих действиях была
Вот это первый признак того, что вы не знаете основ. Это как не знал , и бац забыл. Вот те крест -забыл. А знали что такое цифровой автомат и как его написать и не надо было искать пятый угол в четырех стенах.  Цифровой автомат с двумя состояниями- 1-ждем первую цифру, 2 ждем вторую цифру. Когда пришла вторая цифра запустили программу и ждем 1 цифру. Ели долго ждем 2 цифру переходим в состояние ждем 1 цифру.

enum state_t {wait1num = 0, wait2num};
state_t state = wait1num;

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Вопрос? А пульт то у Вас какой системы?

Iskander97
Offline
Зарегистрирован: 06.11.2018

 От телевизора lg вроде, это имеет какое то значение?

ua6em пишет:

Вопрос? А пульт то у Вас какой системы?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

Iskander97
Offline
Зарегистрирован: 06.11.2018

Я то понимаю это, но проблем с этим у меня нет 

ua6em пишет:

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Iskander97 пишет:

Я то понимаю это, но проблем с этим у меня нет 

ua6em пишет:

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

И какие именно коды кнопок гонит ваш пульт?

Iskander97
Offline
Зарегистрирован: 06.11.2018

Как и есть) 1 - 1, 2 - 2 и так далее. У меня в кейсаях прописано это 

ua6em пишет:

Iskander97 пишет:

Я то понимаю это, но проблем с этим у меня нет 

ua6em пишет:

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

И какие именно коды кнопок гонит ваш пульт?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Этого не может быть, потому, что не может быть никогда.

Залейте код, что я приводил и посмотрите, тогда станет понятно, что и как

Iskander97
Offline
Зарегистрирован: 06.11.2018

ua6em пишет:

Этого не может быть, потому, что не может быть никогда.

Залейте код, что я приводил и посмотрите, тогда станет понятно, что и как

скину позже скрин 

Iskander97
Offline
Зарегистрирован: 06.11.2018

ua6em пишет:

Этого не может быть, потому, что не может быть никогда.

Залейте код, что я приводил и посмотрите, тогда станет понятно, что и как

и да, я же сказал уже, что у меня работало с однозначными числами

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Почему-то вспомнилась шутка про "Поле чудес":

 - Угадал все буквы, но не смог назвать слово! (про милиционера, теперь - полисмена).

;) ;) ;)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

Почему-то вспомнилась шутка про "Поле чудес":

 - Угадал все буквы, но не смог назвать слово! (про милиционера, теперь - полисмена).

;) ;) ;)

Самое главное ТС в полнейшей уверенности в своей правоте )))

nik182
Offline
Зарегистрирован: 04.05.2015

Мне кажется что если ТС сможет себе объяснить что делают 83,89 и 92 строки то вопрос будет решён. Пока это для него загадка, можно только написать программу за него. Иначе никакие  советы не помогут.