Прошу помощи в доработке скетча управления нагрузками с ПДУ.

tss
tss аватар
Offline
Зарегистрирован: 24.02.2014

Попробывал в работе  скетч Программируемый выключатель света с дистанционным управлением.













#include <IRremote.h>   
#include <avr/delay.h> 
#include <EEPROM.h> 
#define button 7 
#define speaker 11 
#define lamp 6 

IRrecv irrecv(2);  //вход для ик приемника 
decode_results results;   
unsigned long ir_command; 
uint8_t swt, count, state = 0;  //статус лампочки 
    
void setup()   
{   
  pinMode(speaker, OUTPUT);//громкоговоритель 
  pinMode(button, INPUT);//вход для кнопки 
  digitalWrite(button,HIGH);//включить подтяжку 
  pinMode(lamp, OUTPUT);//лампочка 
  irrecv.enableIRIn(); // включить приемник   
}   
    
void loop()  
{   
 swt=digitalRead(button); 
 count=0;  
 while(swt==0) 
   { 
    if(count>30) 
     {  
       beep(100,400); 
       for(unsigned long i=0; i<2000000; i++) 
       { 
         if (irrecv.decode(&results))   
          {   
            SaveEEPROM(results.value);   
            irrecv.resume();            
            break;             
          } 
        }  
       beep(30,900);   
       break;  
      } 
    count++;   
    swt=digitalRead(button);   
    _delay_ms(100);  
   } 
   
 ir_command=LoadEEPROM(); 
    if (irrecv.decode(&results)) 
    {     
      if(ir_command==results.value)  
        { 
          state=~state;  
          digitalWrite(lamp, state); 
          beep(10,300);  
          _delay_ms(700);  
        }             
     irrecv.resume();          
    } else  if(count>1)       
             {  
               state=~state; 
               digitalWrite(lamp, state);  
               beep(10,500); 
               _delay_ms(100); 
             }         
} 

void SaveEEPROM(unsigned long ir_code) 
{ 
  EEPROM.write(0, ir_code & 0xFF); 
  EEPROM.write(1, (ir_code & 0xFF00) >> 8); 
  EEPROM.write(2, (ir_code & 0xFF0000) >> 16); 
  EEPROM.write(3, (ir_code & 0xFF000000) >> 24); 
} 

unsigned long LoadEEPROM()  
{ 
  byte val = EEPROM.read(3);  
  unsigned long ir_code=val; 
      val = EEPROM.read(2); 
                ir_code= (ir_code << 8) | val; 
      val = EEPROM.read(1); 
                ir_code= (ir_code << 8) | val; 
      val = EEPROM.read(0); 
                ir_code= (ir_code << 8) | val; 
  return ir_code; 
} 

void beep(byte dur, word frq) 
{ 
  dur=(1000/frq)*dur; 
  for(byte i=0; i<dur; i++) 
  { 
   digitalWrite(speaker, HIGH);  
   _delay_us(frq);  
   digitalWrite(speaker, LOW); 
   _delay_us(frq); 
  }  
} 

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











#include <IRremote.h>   
#include <avr/delay.h> 
#include <EEPROM.h> 
#define button_A 8 
#define button_B 9 
#define speaker 11 
#define lamp_A 6 
#define lamp_B 7 

IRrecv irrecv(2);  //вход для ик приемника 
decode_results results;   
unsigned long ir_command; 
uint8_t swt, count, state = 0;  //статус лампочки 
    
void setup()   
{   
  pinMode(speaker, OUTPUT);//громкоговоритель 
  pinMode(button_A, INPUT);//вход для кнопки A
  pinMode(button_B, INPUT);//вход для кнопки B
  pinMode(lamp_A, OUTPUT);//лампочка A
  pinMode(lamp_B, OUTPUT);//лампочка B
  digitalWrite(button_A,HIGH);//включить подтяжку
  digitalWrite(button_B,HIGH); 
   
  irrecv.enableIRIn(); // включить приемник  
  irrecv.blink13(true);  // включить мигание светодиода при приеме 
}   
    
Какие операторы и типы данных добавлять или менять дальше в коде не могу сообразить  


















































































 

tss
tss аватар
Offline
Зарегистрирован: 24.02.2014

После не продолжительных "танцев с бубном"и чтением лит-ры получился ниже приведенный  скетч. протестировал , на железе , работает. Думаю что можно как кто оптимизировать код, да и ошибки наверняка присутствуют. В дальнейшем работа устройства покажет, собираюсь расширить до 4 каналов управления. 

#include <IRremote.h>   
#include <avr/delay.h> 
#include <EEPROM.h> 
#define button_a 8 
#define button_b 9 
#define speaker 11 
#define lamp_a 6 
#define lamp_b 7 

IRrecv irrecv(2);  //вход для ик приемника 
decode_results results;   
unsigned long ir_push_a, ir_push_b;
uint8_t swt_a, count_a, state_a = 0;  //статус лампочки a
uint8_t swt_b, count_b, state_b = 0;  //статус лампочки b

void setup()   
{   
  pinMode(speaker, OUTPUT);//громкоговоритель 
  pinMode(button_a, INPUT);//вход для кнопки a
  pinMode(button_b, INPUT);//вход для кнопки b
  digitalWrite(button_a,HIGH);//включить подтяжку
  digitalWrite(button_b,HIGH); 
  pinMode(lamp_a, OUTPUT);//лампочка a
  pinMode(lamp_b, OUTPUT);//лампочка b
  irrecv.enableIRIn(); // включить приемник  
  irrecv.blink13(true);  // включить мигание светодиода при приеме 


}   

void loop()  
{   
  swt_a=digitalRead(button_a);
  count_a=0;  
  while(swt_a==0)
  { 
    if(count_a>30) 
    {  
      beep(200,300); 
      for(unsigned long i=0; i<2000000; i++) 
      { 
        if (irrecv.decode(&results))   
        {   
          SavePush_a(results.value);   
          irrecv.resume();            
          break;             
        } 
      }  
      beep(200,300);   
      break;  
    } 
    count_a++;   
    swt_a=digitalRead(button_a);
    _delay_ms(100);  
  } 

  ir_push_a=LoadPush_a(); 
  if (irrecv.decode(&results)) 
  {     
    if(ir_push_a==results.value)      //включение лампы от кнопки с пульта
    { 
      state_a=~state_a;  
      digitalWrite(lamp_a, state_a); 
      beep(100,500);  
      _delay_ms(700);  
    }             
    irrecv.resume();           //очистить входящий буфер 
  } 
  else  if(count_a>1)       //включение лампы от button
  {  
    state_a=~state_a; //инвертируем статус
    digitalWrite(lamp_a, state_a);
    beep(20,500); 
    _delay_ms(100); 
  }   
  swt_b=digitalRead(button_b);
  count_b=0;  
  while(swt_b==0)
  { 
    if(count_b>30) 
    {  
      beep(200,300); 
      for(unsigned long i=0; i<2000000; i++) 
      { 
        if (irrecv.decode(&results))   
        {   
          SavePush_b(results.value);   
          irrecv.resume();            
          break;             
        } 
      }  
      beep(200,300);   
      break;  
    } 
    count_b++;   
    swt_b=digitalRead(button_b);
    _delay_ms(100);  
  }         
  ir_push_b=LoadPush_b();
  if (irrecv.decode(&results)) 
  {     
    if(ir_push_b==results.value)        //включение лампы от кнопки с пульта
    { 
      state_b=~state_b;  
      digitalWrite(lamp_b, state_b); 
      beep(100,500);  
      _delay_ms(700);  
    }             
    irrecv.resume();          
  } 
  else  if(count_b>1)       //включение лампы от button
  {  
    state_b=~state_b; 
    digitalWrite(lamp_b, state_b);
    beep(20,500); 
    _delay_ms(100); 
  }        
} 

void SavePush_a(unsigned long ir_code) 
{ 
  EEPROM.write(0, ir_code & 0xFF); 
  EEPROM.write(1, (ir_code & 0xFF00) >> 8); 
  EEPROM.write(2, (ir_code & 0xFF0000) >> 16); 
  EEPROM.write(3, (ir_code & 0xFF000000) >> 24); 
} 

void SavePush_b(unsigned long ir_code) 
{ 
  EEPROM.write(4, ir_code & 0xFF); 
  EEPROM.write(5, (ir_code & 0xFF00) >> 8); 
  EEPROM.write(6, (ir_code & 0xFF0000) >> 16); 
  EEPROM.write(7, (ir_code & 0xFF000000) >> 24); 
} 
unsigned long LoadPush_a()  
{ 
  byte val = EEPROM.read(3);  
  unsigned long ir_code=val; 
  val = EEPROM.read(2); 
  ir_code= (ir_code << 8) | val; 
  val = EEPROM.read(1); 
  ir_code= (ir_code << 8) | val; 
  val = EEPROM.read(0); 
  ir_code= (ir_code << 8) | val; 
  return ir_code; 
} 
unsigned long LoadPush_b()  
{ 
  byte val = EEPROM.read(7);  
  unsigned long ir_code=val; 
  val = EEPROM.read(6); 
  ir_code= (ir_code << 8) | val; 
  val = EEPROM.read(5); 
  ir_code= (ir_code << 8) | val; 
  val = EEPROM.read(4); 
  ir_code= (ir_code << 8) | val; 
  return ir_code; 
} 
void beep(byte dur, word frq) 
{ 
  dur=(1000/frq)*dur; 
  for(byte i=0; i<dur; i++) 
  { 
    digitalWrite(speaker, HIGH);  
    _delay_us(frq);  
    digitalWrite(speaker, LOW); 
    _delay_us(frq); 
  }  
}