Управление нагрузкой при помощи пульта ДУ

superaft
Offline
Зарегистрирован: 13.02.2015

Всем пивет! Решил переделать код из видео в более компактный:

#include <IRremote.h>

IRrecv irrecv(11);
decode_results results;

int leds [] {7, 6, 5, 4,};
int keys [] {0x926D22DD, 0x926DA25D, 0x926D629D, 0x926D609F, 0x926DE01F};

void setup()
{
  irrecv.enableIRIn();

  for (int i = 0; i <= 4; i++) {
    pinMode(leds[i], OUTPUT);
  }

}

void loop() {
  if (irrecv.decode(&results)) {
    for (int num = 0; num <= 5; num++) {

      if (results.value = keys[num]) {
        

        digitalWrite(leds[num], !digitalRead(leds[num]));
      }

    }

    irrecv.resume(); // Receive the next value
  }
  delay(250);
}

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

В Arduino новичек, по этому не судите строго.

Заранее спасибо! 

 

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

if (results.value = keys[num]) {

надо

if (results.value == keys[num]) {

superaft
Offline
Зарегистрирован: 13.02.2015

В таком случаее вообще ничего не работает, из-за этого и поставил = вместо == стало хоть как-то работать

bwn
Offline
Зарегистрирован: 25.08.2014

superaft пишет:

В таком случаее вообще ничего не работает, из-за этого и поставил = вместо == стало хоть как-то работать

= это операция присваивания
== это оператор сравнения
if - управляющий оператор, принимающий решение на основании сравнения.

Вставляйте Serial.println и мониторьте переменную, которая вызывает сомнения. И для отладки задержку стоит побольше сделать.

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

Задержка в данном скетче никакой функции не несет, можно вообще убрать, пусть себе if (irrecv.decode(&results)) крутится.

bwn
Offline
Зарегистрирован: 25.08.2014

Araris пишет:

Задержка в данном скетче никакой функции не несет, можно вообще убрать, пусть себе if (irrecv.decode(&results)) крутится.

А в сериале не начнет слишком быстро гнать?

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

Я вижу Serial.println(results.value, HEX) после if (irrecv.decode(&results)) {, и срабатывать он будет только по "свежему" нажатию на пульте.

superaft
Offline
Зарегистрирован: 13.02.2015

Araris пишет:

if (results.value = keys[num]) {

надо

if (results.value == keys[num]) {

Так будет работать правильней если сместо keys[num] прописать код конкретной кнопки, будет реагировать только на нее и зажитать светодиоды

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Готовая заготовка ( именно так ) к пультику с ебая:

// Final release  1.0

#include <IRremote.h>
#define ver 1.0

#define led_13_pin  13   //debug led

// IR connector
#define ir_gnd_pin 9           // gnd, power, xxx, output
#define ir_power_pin  8
#define ir_receiv_pin  6

//trembo IR codes of ebay remote

#define  IR_OK               0xFF02FD
#define  IR_UP               0xFF629D
#define  IR_DOWN             0xFFA857
#define  IR_LEFT             0xFF22DD
#define  IR_RIGHT            0xFFC23D
#define  IR_1                0xFF6897
#define  IR_2                0xFF9867
#define  IR_3                0xFFB04F
#define  IR_4                0xFF30CF
#define  IR_5                0xFF18E7
#define  IR_6                0xFF7A85
#define  IR_7                0xFF10EF
#define  IR_8                0xFF38C7
#define  IR_9                0xFF5AA5
#define  IR_0                0xFF4AB5
#define  IR_ASTERISK         0xFF42BD
#define  IR_NUMBER_SIGN      0xFF52AD
#define  CODE_REPEAT         0xFFFFFFFF

#define code_repeat_time 200

#define LED_ON        digitalWrite (led_13_pin, HIGH)
#define LED_OFF       digitalWrite (led_13_pin, LOW)

IRrecv irrecv(ir_receiv_pin);

decode_results results;

unsigned long last_time = millis();
unsigned long lastKey = 0;

void setup(){
  Serial.begin(115200);
  Serial.print(F("Version    "));
  Serial.println(ver);
  Serial.print(F(__DATE__));
  Serial.print("   ");
  Serial.print(F(__TIME__));
  Serial.print("   ");
  Serial.println(F(__FILE__));

  pinMode (ir_receiv_pin, INPUT_PULLUP);
  // Power from Arduino pins
  digitalWrite (ir_power_pin, HIGH);
  digitalWrite (ir_gnd_pin, LOW);
  pinMode ( ir_power_pin, OUTPUT);
  pinMode ( ir_gnd_pin, OUTPUT);

  // debug leds
   pinMode (led_13_pin, OUTPUT);
   LED_OFF;
  irrecv.enableIRIn(); // Start the receiver

}
void loop() {

  unsigned long current_time = millis();
  if (irrecv.decode(&results)) {
    // Serial.println(results.value, HEX);

    switch (results.value) {
    case CODE_REPEAT:
      results.value = lastKey;
      last_time = current_time;
      Serial.println (F("CODE_REPEAT"));
      break;
    case IR_UP :
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_UP"));
      break;
    case IR_DOWN:
      lastKey = results.value;
      last_time = current_time;   
      LED_ON;
      Serial.println(F("IR_DOWN"));
      break;
    case IR_LEFT:
      lastKey = results.value;
      last_time = current_time;
      Serial.println(F("IR_LEFT"));
      break;
    case IR_RIGHT:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_RIGHT"));
      break;
    case IR_OK:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_OK"));  
      break;
    case IR_1:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_1"));  
      break;
    case IR_2:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_2"));  
      break;
    case IR_3:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_3"));  
      break;
    case IR_4:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_4"));  
      break;
    case IR_5:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_5"));  
      break;
    case IR_6:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_6"));  
      break;
    case IR_7:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_7"));  
      break;
    case IR_8:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_8"));  
      break;
    case IR_9:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_9"));  
      break;
    case IR_0:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_0"));  
      break;
    case IR_ASTERISK:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_ASTERISK"));  
      break;
    case IR_NUMBER_SIGN:
      lastKey = results.value;
      last_time = current_time;
      LED_ON;
      Serial.println(F("IR_NUMBER_SIGN"));  
      break;


    default:
      Serial.print ( F("Invalid code   "));
      Serial.println(results.value, HEX);
      results.value = lastKey;
      // Handle invalid value.
    }

    lastKey = results.value;
    irrecv.resume(); // Receive the next value

  }

  if ((current_time - last_time) >code_repeat_time){
    lastKey = 0;
    LED_OFF;    
  }


}