Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.12.2015, 01:14   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Управление рольставнями при помощи бытового ИК пульта

Скетч был написан еще в 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_command0ir_command1ir_command2ir_code;
uint8_t swtcount;  //статус 
volatile uint8_t timr;

void RollerStop()
{
  if(
timr>30)
  {
    
digitalWrite(RolUpLOW);
   
digitalWrite(RolDownLOW);
   
timr=0;
   }  
 
timr++;
}

void setup()  
{  
  
pinMode(speakerOUTPUT); //пищалкка
  
pinMode(buttonINPUT);  //вход кнопки
  
digitalWrite(button,HIGH);  //включить подтяжку
  
pinMode(RolUpOUTPUT);  //Ставни вверх
  
digitalWrite(RolUpLOW);
  
pinMode(RolDownOUTPUT);  //Ставни вниз
  
digitalWrite(RolDownLOW);  
  
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(RolDownLOW);
          
beep(10,300);
          
_delay_ms(500);
          
digitalWrite(RolUpHIGH);           
          
_delay_ms(600);
        }   
      if(
ir_command1==results.value//если принятый код равен коду который в памяти то вниз
        
{
          
timr=0;        //обнулить счетчик
          
Timer1.restart();  //обнулить счетчик
          
digitalWrite(RolUpLOW);
          
beep(10,400);
          
_delay_ms(500);
          
digitalWrite(RolDownHIGH);      
          
_delay_ms(600); 
          
        } 
      if(
ir_command2==results.value//если принятый код равен коду который в памяти то стоп
        
{
          
digitalWrite(RolUpLOW);
          
digitalWrite(RolDownLOW);
          
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=0i<2000000i++)//ждем нажатия кнопки пульта
       
{
         if (
irrecv.decode(&results))   //если был сигнал с пульта
          
{                              // то сохраняем результат в EEPROM 
            
ir_code results.value;              
            
EEPROM.write(addrir_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 durword frq)
{
  
dur=(1000/frq)*dur;  //расчет длительности бипа
  
for(byte i=0i<duri++)
  {
   
digitalWrite(speakerHIGH); 
   
_delay_us(frq); 
   
digitalWrite(speakerLOW);
   
_delay_us(frq);
  } 

Admin вне форума   Ответить с цитированием
 


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 16:33. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика