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

Аватара
Автор темы
Дим M
Администратор
Администратор
Сообщения: 1150
Репутация: 74
С нами: 5 лет 4 месяца

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

Сообщение #1 Дим » 3 февраля 2018, 22:23

Управление пином Arduino через пульт ДУ и кнопкой.png
Управление пином Arduino через пульт ДУ и кнопкой
Управление пином Arduino через пульт ДУ и кнопкой.png (143.61 КБ) 144 просмотра


Нашёл на просторах инета древний код. С помощью его можно управлять например реле, для включения освещения. Для управления потребуется любой ИК пульт, который можно запрограммировать на лету - не используя загрузчик Ардуино. Данные о пульте сохраняться в энергонезависимую память контроллера - EEPROM. По мимо этого подключив кнопку, также можно переключать реле. У меня на схеме вместо реле указан светодиод, но разобраться как подключить реле, не составит труда.
Принцип данного девайса таков - длительно нажав на тактовую кнопку, услышим звуковой сигнал, это значит что контроллер готов к программированию пульта. Наводим ИК излучатель пульта на ИК приёмник, и нажимаем на требуемую кнопку. Всё! Программирование завешено. Если же на пульте не нажать кнопку, то контроллер через некоторое время, издав звуковой сигнал, выйдет из режима программирования.
КОД

Код: Выделить всё

#include <IRremote.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();           // включить IK приемник  
}  
   
void loop
() 
{  
  swt
=digitalRead(button);
  count=0; 
  while
(swt==0)
  {
    if(count>30)
    { 
      beep
(100,400);
      for(unsigned long i=0; i<500000; 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);
  } 
}  

void delay_us 
(int us)
{
  for (int i = 0; i <us; i ++)
  {
    _delay_us (1);
  }
}

Первоисточник
i love you mxIni Mysql

! ! !


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Программирование»

Кто сейчас на форуме

Сейчас этот раздел просматривают: 1 гость