Скетч был написан еще в 2010г. Все ни как не мог собраться с духом что бы выложить
Если бы писал его сейчас, то я бы его немного сократил и добавил бы библиотеку CyberLib.h , но рольставни стабильно работают и вмешиваться в их жизнь нет желания
В кратце:
ИК приемник подключен к 10 контакту
ардуины
Кнопка подключена к 3 контакту ардуины , а вторым выводом к GND
Пассивный зумер на 11 пине
Твердотельные реле подключаются к выходам 2 и 9
Принцип работы такой:
Для входа в режим программирования нажимаем кнопку и удерживаем несколько сек. до звукового сигнала
После звукового оповещения программируем любые три кнопки пульта. Условно их назовем "Вверх", "Вниз" и "Стоп"
После каждого нажатия кнопки пульта, бипер будет предупреждать звуковым сигналом
Запрограммированные коды кнопок сохраняются в в EEPROM, так что после сброса и перезагрузки контроллера, управление остается таким же как Вы его настроили
Подробное описание будет позже
PHP код:
#include <IRremote.h>
#include <avr/delay.h>
#include <EEPROM.h>
#include "TimerOne.h"
#include <avr/wdt.h>
#define button 3
#define speaker 11
#define RolUp 2
#define RolDown 9
IRrecv irrecv(10); //вход для ик приемника
decode_results results;
unsigned long ir_command0, ir_command1, ir_command2, ir_code;
uint8_t swt, count; //статус
volatile uint8_t timr;
void RollerStop()
{
if(timr>30)
{
digitalWrite(RolUp, LOW);
digitalWrite(RolDown, LOW);
timr=0;
}
timr++;
}
void setup()
{
pinMode(speaker, OUTPUT); //пищалкка
pinMode(button, INPUT); //вход кнопки
digitalWrite(button,HIGH); //включить подтяжку
pinMode(RolUp, OUTPUT); //Ставни вверх
digitalWrite(RolUp, LOW);
pinMode(RolDown, OUTPUT); //Ставни вниз
digitalWrite(RolDown, LOW);
irrecv.enableIRIn(); // включить приемник
irrecv.blink13(true); // включить мигание светодиода при приеме
Timer1.initialize(1000000); // Интервал срабатывания таймера в мкс
Timer1.attachInterrupt(RollerStop); //будет вызыватся каждый раз при отсчете заданого времени
ir_command0=LoadEEPROM(0);//прочитать команду из EEPROM
ir_command1=LoadEEPROM(1);//прочитать команду из EEPROM
ir_command2=LoadEEPROM(2);//прочитать команду из EEPROM
//wdt_enable (WDTO_8S); //Сторожевая собака 8сек.
}
void loop()
{
swt=digitalRead(button);//проверить сигнал с кнопки
count=0; //счетчик времени нажатия кнопки
while(swt==0)//если кнопка нажата
{
if(count>30) //если удердивали больше 3сек. то ждем в течении 10 сек нажатия с пульта
{
beep(30,800);
beep(30,900);
beep(30,1000);
SavePush(0); //сохранить первое кодовое значение пульта
beep(50,800);
SavePush(1);
beep(50,900);
SavePush(2);
beep(30,1000);
beep(30,900);
beep(30,800);
break; //прервать цикл
}
count++; //счетчик времени удержания кнопки
swt=digitalRead(button); //прочитать состояние кнопки
_delay_ms(100); //пауза от дребезга
}
if (irrecv.decode(&results)) //если был сигнал с пульта
{
if(ir_command0==results.value) //если принятый код равен коду который в памяти то вверх
{
timr=0; //обнулить счетчик
Timer1.restart();//обнулить счетчик
digitalWrite(RolDown, LOW);
beep(10,300);
_delay_ms(500);
digitalWrite(RolUp, HIGH);
_delay_ms(600);
}
if(ir_command1==results.value) //если принятый код равен коду который в памяти то вниз
{
timr=0; //обнулить счетчик
Timer1.restart(); //обнулить счетчик
digitalWrite(RolUp, LOW);
beep(10,400);
_delay_ms(500);
digitalWrite(RolDown, HIGH);
_delay_ms(600);
}
if(ir_command2==results.value) //если принятый код равен коду который в памяти то стоп
{
digitalWrite(RolUp, LOW);
digitalWrite(RolDown, LOW);
beep(10,300);
beep(10,400);
beep(10,300);
_delay_ms(700);
}
irrecv.resume(); //очистить входящий буфер
}
//wdt_reset(); //покормить собаку, что бы она не сбежала
}
//////////////////////////////////////////////////////////////////////////////////////////////
void SavePush(byte addr) //сохранить нажатие кнопки
{
_delay_ms(400); //задержка для корректной работы
addr=addr*4;
for(unsigned long i=0; i<2000000; i++)//ждем нажатия кнопки пульта
{
if (irrecv.decode(&results)) //если был сигнал с пульта
{ // то сохраняем результат в EEPROM
ir_code = results.value;
EEPROM.write(addr, ir_code & 0xFF);
EEPROM.write(addr+1, (ir_code & 0xFF00) >> 8);
EEPROM.write(addr+2, (ir_code & 0xFF0000) >> 16);
EEPROM.write(addr+3, (ir_code & 0xFF000000) >> 24);
break; //прервать цикл
}
// wdt_reset(); //покормить собаку
}
_delay_ms(100);
irrecv.resume(); //очистить входящий буфер
}
unsigned long LoadEEPROM(byte addr) // считываем значение из EEPROM
{
addr=addr*4;
byte val = EEPROM.read(addr+3);
unsigned long ir_code=val;
val = EEPROM.read(addr+2);
ir_code= (ir_code << 8) | val;
val = EEPROM.read(addr+1);
ir_code= (ir_code << 8) | val;
val = EEPROM.read(addr);
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);
}
}