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

Вернуться   Форум обсуждения оборудования "Умный дом" > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.12.2015, 01:14   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,272
Вес репутации: 9471
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 вне форума   Ответить с цитированием
Старый 23.01.2017, 21:07   #2
Сергей56
Junior Member
 
Регистрация: 18.01.2017
Сообщений: 11
Вес репутации: 0
Сергей56 is an unknown quantity at this point
По умолчанию Re: Управление рольставнями при помощи бытового ИК пульта

Объясните пожалуйста, с выключателем на IDE 0022 у меня всё получилось. С рольставнями какие-то другие требования для прошивки? При компиляции вылазят ошибки. Timer1.initialize(1000000); // Интервал срабатывания таймера в мкс
Сергей56 вне форума   Ответить с цитированием
Старый 24.01.2017, 12:27   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,272
Вес репутации: 9471
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
По умолчанию Re: Управление рольставнями при помощи бытового ИК пульта

библиотеку TimerOne.h нужно установить
Admin вне форума   Ответить с цитированием
Старый 25.01.2017, 12:21   #4
Сергей56
Junior Member
 
Регистрация: 18.01.2017
Сообщений: 11
Вес репутации: 0
Сергей56 is an unknown quantity at this point
По умолчанию Re: Управление рольставнями при помощи бытового ИК пульта

Можете TimerOne.h выложить здесь?
Сергей56 вне форума   Ответить с цитированием
Старый 25.01.2017, 14:11   #5
Сергей56
Junior Member
 
Регистрация: 18.01.2017
Сообщений: 11
Вес репутации: 0
Сергей56 is an unknown quantity at this point
По умолчанию Re: Управление рольставнями при помощи бытового ИК пульта

Нашёл библиотеку, установил, всё получилось. Пока правда с программированием кнопок не получается, можно по подробнее?
Сергей56 вне форума   Ответить с цитированием
Старый 25.01.2017, 18:54   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,272
Вес репутации: 9471
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
По умолчанию Re: Управление рольставнями при помощи бытового ИК пульта

что именно не получается, можно по подробней?
Admin вне форума   Ответить с цитированием
Старый 26.01.2017, 08:56   #7
Сергей56
Junior Member
 
Регистрация: 18.01.2017
Сообщений: 11
Вес репутации: 0
Сергей56 is an unknown quantity at this point
По умолчанию Re: Управление рольставнями при помощи бытового ИК пульта

Программируются только 2 кнопки, и потом включается непонятно что, то одно реле, то два реле от одной кнопки(по очереди) Программировать надо после звукового оповещения, при нажатой кнопке или при отжатой? Пробовал по разному.
Сергей56 вне форума   Ответить с цитированием
Старый 26.01.2017, 11:43   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,272
Вес репутации: 9471
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
По умолчанию Re: Управление рольставнями при помощи бытового ИК пульта

Нажали кнопку , дождались оповещения и отпустили кнопку, потом программируете пульт
У меня такой же скетч и все работает безупречно, уже много лет
У Вас возможно китайская ардуинка, тогда закоментируйте все строки связанный с wdt

P.S.
я уже закоментировал
Admin вне форума   Ответить с цитированием
Старый 26.01.2017, 17:20   #9
Сергей56
Junior Member
 
Регистрация: 18.01.2017
Сообщений: 11
Вес репутации: 0
Сергей56 is an unknown quantity at this point
По умолчанию Re: Управление рольставнями при помощи бытового ИК пульта

Не помогло. Скетч с выключателем работает исключительно, а с рольставнями не хочет. ардуинка китайская.
Сергей56 вне форума   Ответить с цитированием
Старый 27.01.2017, 10:11   #10
Сергей56
Junior Member
 
Регистрация: 18.01.2017
Сообщений: 11
Вес репутации: 0
Сергей56 is an unknown quantity at this point
По умолчанию Re: Управление рольставнями при помощи бытового ИК пульта

Спасибо большое за ваши советы и рекомендации. Всё заработало! Взял другой пульт. Был samsung старый, заменил его на erisson(китайский) и всё OK.
Сергей56 вне форума   Ответить с цитированием
Ответ


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

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

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

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

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


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


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