Прошу помощи в доработке скетча управления нагрузками с ПДУ.
- Войдите на сайт для отправки комментариев
Чт, 06/03/2014 - 17:06
Попробывал в работе скетч Программируемый выключатель света с дистанционным управлением.
#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); // включить мигание светодиода при приеме
}
Какие операторы и типы данных добавлять или менять дальше в коде не могу сообразить
После не продолжительных "танцев с бубном"и чтением лит-ры получился ниже приведенный скетч. протестировал , на железе , работает. Думаю что можно как кто оптимизировать код, да и ошибки наверняка присутствуют. В дальнейшем работа устройства покажет, собираюсь расширить до 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); } }