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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.05.2012, 12:03   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,379
Вес репутации: 9578
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
По умолчанию Управление выключателем света любым пультом от бытовой техники

Нажмите на изображение для увеличения
Название: pultom-du.png
Просмотров: 294047
Размер:	123.5 Кб
ID:	406

Схема выключателя
Нажмите на изображение для увеличения
Название: NANO_IR_SWITCH.png
Просмотров: 70975
Размер:	8.7 Кб
ID:	375


Используемые компоненты
Arduino Nano V.7 - 1шт.
Relay Module - 1шт.
ИК приемник TSOP - 1шт. приемник можно использовать любой работающий на частоте 38 кГц
Излучатель звука - 1шт.
Макетная плата - 1шт.

Нажмите на изображение для увеличения
Название: pdu_ir.jpg
Просмотров: 71382
Размер:	24.8 Кб
ID:	374


Видео демонстрирующее работу выключателя


Код для Arduino Nano V.7
PHP код:
#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 swtcountstate 0;  //статус лампочки
   
void setup()  
{  
  
pinMode(speakerOUTPUT);//громкоговоритель
  
pinMode(buttonINPUT);//вход для кнопки
  
digitalWrite(button,HIGH);//включить подтяжку
  
pinMode(lampOUTPUT);//лампочка
  
irrecv.enableIRIn(); // включить приемник  
}  
   
void loop() 
{  
 
swt=digitalRead(button);
 
count=0
 while(
swt==0)
   {
    if(
count>30)
     { 
       
beep(100,400);
       for(
unsigned long i=0i<2000000i++)
       {
         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(lampstate);
          
beep(10,300); 
          
_delay_ms(700); 
        }            
     
irrecv.resume();            //очистить входящий буфер 
    
} else  if(count>1)        //если было нажатие кнопки выключателя
             

               
state=~state//инвертируем статус
               
digitalWrite(lampstate); 
               
beep(10,500);
               
_delay_ms(100);
             }        
}

void SaveEEPROM(unsigned long ir_code)
{
  
EEPROM.write(0ir_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 durword frq)
{
  
dur=(1000/frq)*dur;
  for(
byte i=0i<duri++)
  {
   
digitalWrite(speakerHIGH); 
   
_delay_us(frq); 
   
digitalWrite(speakerLOW);
   
_delay_us(frq);
  } 

Admin на форуме   Ответить с цитированием
Старый 07.06.2012, 14:32   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,379
Вес репутации: 9578
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
По умолчанию

Для переноса с макета на отдельную плату используйте следующую схему:
Название: atmega_switch_ir.png
Просмотров: 66509

Размер: 8.1 Кб

HEX фаил для прошивки микроконтроллера Atmega168
Вложения
Тип файла: rar switch.rar (7.1 Кб, 717 просмотров)
Admin на форуме   Ответить с цитированием
Старый 09.06.2012, 03:18   #3
Вадим
Junior Member
 
Аватар для Вадим
 
Регистрация: 27.05.2012
Адрес: Владивосток
Сообщений: 10
Вес репутации: 0
Вадим is an unknown quantity at this point
По умолчанию

А не будет мешать вывод на пищалку прошивке через ICSP ?
Может лучше выход звука на 15 или 16 ногу подцепить?
Вадим вне форума   Ответить с цитированием
Старый 09.06.2012, 06:05   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,379
Вес репутации: 9578
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
По умолчанию

Мешать не будет, я проверял.
Admin на форуме   Ответить с цитированием
Старый 09.06.2012, 07:33   #5
Вадим
Junior Member
 
Аватар для Вадим
 
Регистрация: 27.05.2012
Адрес: Владивосток
Сообщений: 10
Вес репутации: 0
Вадим is an unknown quantity at this point
По умолчанию

Я так понимаю при таком способе нужно использовать утилиту что-то типа avrdude для заливки HEX, а HEX получается из AVR Studio или поиском в TMP временного файла от arduino IDE ?
Или есть более "прямой" способ через arduino IDE?
Вадим вне форума   Ответить с цитированием
Старый 09.06.2012, 10:16   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,379
Вес репутации: 9578
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
По умолчанию

Можно прошивать любым программатором для AVR
Так же можно собрать ISP программатор из Arduino
Готовый фаил для прошивки
Admin на форуме   Ответить с цитированием
Старый 05.11.2012, 14:48   #7
alexval2007
Member
 
Регистрация: 05.11.2012
Сообщений: 63
Вес репутации: 0
alexval2007 is an unknown quantity at this point
По умолчанию

Пожалуйста выложите библиотеку #include <IRremote.h>
alexval2007 вне форума   Ответить с цитированием
Старый 06.11.2012, 14:24   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,379
Вес репутации: 9578
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
По умолчанию

Библиотека IRremote
Admin на форуме   Ответить с цитированием
Старый 25.11.2012, 05:26   #9
fot
Junior Member
 
Регистрация: 24.11.2012
Адрес: Новосибирск
Сообщений: 14
Вес репутации: 0
fot is an unknown quantity at this point
По умолчанию

Решил сделать автономное экономичное устройство на базе этой разработки.
Устройство рассчитано для использования в полевых или энерго недоступных местах.
Для экономии энергии задействовал режим sleep mode, точнее (SLEEP_MODE_PWR_DOWN).
Просыпаемся по INT0 – ir sensor (PD2 или ножка 4 ), и INT1 – button (PD3 или ножка 5).
Пришлось изворачиваться для приоритета прерывания кнопки и обработки нештатных ситуаций –
нажатия ошибочных кнопок на пульте и обрыв посылки в ходе передачи, при помощи програм-
много таймера ( библиотека SimpleTimer.h режим wdCallback ).
Правда, теперь в режим программирования нужной кнопки пульта входим через нажатую кнопку
button + подача питания.

Немного изменил схему.
Вход кнопки (button) перенёс с ножки 13 на ножку 5 микросхемы.
Увеличил резистор в цепи управления оптрона до ~10к, снизив ток потребления при включенной нагрузке.
Запитал от одного элемента Li-ion аккумулятора с Umin = 3v. Поставил 3х вольтовый ик-датчик TSOP38238.
Проверил, понижая питание схемы до 2,4 вольт – устойчиво работает с кварцем 16 мГц (контроллер АTmega328P-PU).

При напряжении питания 3,8 в, в ожидании,устройство потребляет ток 1,2 ма.
Срабатывание - 12,5 ма - 1,5 сек,
Сон плюс удержание включенной нагрузки (200мка через светодиод оптрона) - всего 1,4 ма.
От двух акк-ов Li-ion типа 18650 - 2700ма.ч. в параллель работать должно ~150 суток или около пяти месяцев.
Возможно, бесконечное функционирование устройства при подзарядке контроллером, например CN3083,
от небольшой солнечной панельки, расположенной на подоконнике или рядом с работающей лампой.
В этом случае ёмкость литиевого аккумулятора (и массогабариты всего устройства) можно значительно уменьшить.

Библиотека SimpleTimer - http://arduino.cc/playground/Code/SimpleTimer

Работающий код.
PHP код:
 #include <IRremote.h> 
 #include <avr/delay.h> 
 #include <EEPROM.h> 
 #include <avr/sleep.h>

 #include <SimpleTimer.h>

 #define button 3
 #define speaker 11 
 #define lamp 6 

 
SimpleTimer timer;

 
IRrecv irrecv(2); //вход для ик приемника 
 
decode_results results
 
unsigned long ir_command
 
uint8_t swtcountstate 0//статус лампочки 

 
void wdCallback() {
 
toSleep(); 
 }

 
void wakeupFunction(){
 } 
 
void toSleep(){
 
attachInterrupt(0,wakeupFunction,LOW);
 
sleep_mode();
 
detachInterrupt(0);
 
attachInterrupt(1,wakeupFunction,LOW);
 }

 
void setup() 
 { 
 
pinMode(speakerOUTPUT);//громкоговоритель 
 
pinMode(buttonINPUT);//вход для кнопки 
 
digitalWrite(button,HIGH);//включить подтяжку 
 
pinMode(lampOUTPUT);//лампочка 
 
irrecv.enableIRIn(); // включить приемник 

 
timer.setInterval(1000,wdCallback);
 
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
 
sleep_enable();

 } 

 
void loop() 
 { 
 
swt=digitalRead(button); 
 
count=0
 while(
swt==0
 { 
 if(
count>10
 { 
 
beep(100,400); 
 for(
unsigned long i=0i<2000000i++) 
 { 
 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(lampstate); 
 
beep(10,300); 
 
_delay_ms(700); 
 
toSleep(); 
 } 
 if(
ir_command!=results.value
 { 
 
_delay_ms(300);
 
toSleep(); 
 } 

 
irrecv.resume(); //очистить входящий буфер 
 
} else if(count>1//если было нажатие кнопки выключателя 
 

 
state=~state//инвертируем статус 
 
digitalWrite(lampstate); 
 
beep(10,500); 
 
_delay_ms(100); 
 
toSleep();

 } 
timer.run(); 
 }

 
void SaveEEPROM(unsigned long ir_code) { 
 
EEPROM.write(0ir_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 durword frq
 { 
 
dur=(1000/frq)*dur
 for(
byte i=0i<duri++) 
 { 
 
digitalWrite(speakerHIGH); 
 
_delay_us(frq); 
 
digitalWrite(speakerLOW); 
 
_delay_us(frq); 
 } 
 } 

Последний раз редактировалось fot; 08.12.2012 в 10:39.
fot вне форума   Ответить с цитированием
Старый 27.12.2012, 08:37   #10
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1599
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

А можно ли сделать такую функцию чтоб ардуино наоборот имитировал пульт.
т.е. я думаю нужен ик-приемник и передатчик.
Смысл таков:
Записали с пульта например включение телевизора, а затем ардуина сама может вкл. выкл. телевизор или др. аппаратуру.
andr128 вне форума   Ответить с цитированием
Ответ


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

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

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

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

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


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


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