Суббота, 27.04.2024
TiM
Меню сайта
Категории раздела
Мои статьи [9]
1С Бухгалтерия [1]
Arduino / ATMEGA [10]
ESP8266 [1]
OrangePi PC и Raspberry Pi 2 Model B V1.1 [4]
Шаговые двигатели [1]
PHPProBid [0]
CMS DLE (DataLife Engine) [0]
CMS Joomla [13]
SugarCRM [5]
Базы данных [5]
PHP скрипты [16]
Bash и скрипты [27]
IP АТС Elastix / Asterisk [12]
CentOS [6]
Debian [8]
Lubuntu / LinuxMINT [29]
Windows [28]
Умный дом [1]
Сервера [16]
Natural Selection [1]
System Shock 2 [1]
Форма входа
Главная » Статьи » Arduino / ATMEGA

Arduino: Управление шторами с IR пульта/кнопками и открытие закрытие по времени, отображение температуры

проект еще не завершен:

Не решено: закрытие и открытие штор по заданному времени и отображение температуры

Работает: открытие и закрытие штор с пульта и с кнопок

 

Задача:

1) Открытие и закрытие штор с IR пульта (от телевизора, неиспользуемыми кнопками)

2) Открытие и закрытие штор вручную (кнопкой на стене, используется кнопка от стеклоподъемника)

3) Открытие и закрытие штор в заданное время (время задается кнопками)

4) Отображение времени (на LCD дисплее 16х2)

4) Отображение температуры в комнате или на улице (на LCD дисплее 16х2)

 

Используется:

1. Arduino UNO R3

2. 16X2 LCD дисплей (подключен к PIN 12,11,5,4,3,2 Arduino и с самопальными кнопками по аналогии с LCD шилдом)

3. Модуль времени DS1307 (подключен к А4, А5 Arduino и с впаянным DS18B20 - цифровым датчиком температуры. Датчик подключен к PIN 9 Arduino)

4. Модуль LN298N (используется для управления коллекторным двигателем привода штор, подключен к PIN 0, PIN 1 Arduino)

5. Два геркона (для детектирования крайних положений: геркон1 - подключен к А1 Arduino , геркон2 - подключен к А2 Arduino)

6. Кнопка от стеклоподъемника, подключенная по аналогии с кнопками "select","right" к PIN A3 Arduino

7. IR приемник TSOP1138 (data подключен к PIN 13 Arduino)

8. Пульт от ТВ тюнера Beholder M6 (можно любой на 38кГц, большинство такие, у меня от ТВ-тюнера Beholder M6 )

9. Механика штор, на основе коллекторного двигателя от принтера и привода от сканера (фото позже будет)

10. Блок питания (импульсный, от блока зарядки minidv видеокамеры Panasonic NV-GS11: 8вольт, 16ватт. Используется для питания всей логики, подключено к разъему внешнего питания Arduino Uno и коллекторного мотора привода штор, подключено к модулю LN298N)

11.Корпуса, коннекторы и всякая мелочь

 

Конструкция модуля управления:

Примечание: пины 6,7,8,10 Arduino - свободны

1) Подключение LCD дисплея 16х2 (WINSTAR WH1602A, пример подключения этого индикатора)

Подстроечный резистор, это регулировка контрастности дисплея (10кОм)

 

 

2) Подключение модуля часов DS1307

Примечание: вывод "DS" модуля часов DS1307 - это вывод цифрового датчика температуры DS18B20, который изначально не впаян в плату модуля. (в данном проекте подключен к PIN 9 Arduino)

 

3) Подключение кнопок (так же как и в LCD шилде, для настройки времени и т.п.)

Все 5 кнопок подсоединены к аналоговому входу A0 по следующей схеме

4) Подключение кнопки стеклоподъемника (по аналогии кнопок LCD шилда, для ручного открытия и закрытия штор)

 

 

5) Подключение IR приемника TSOP1138 к Arduino Uno (для инфракрасного пульта)

 

 

6) Подключение модуля LN298N и коллекторного мотора привода штор

 

Скетч для Arduino Uno R3

не завершен (использовал два разных скетча)

Не решено: закрытие и открытие штор по времени и отображение температуры

Работает: открытие и закрытие штор с пульта и с кнопок

 

 

    #include <EEPROM.h>
    #include <Wire.h>
    #include <LiquidCrystal.h>
///////////////////////////////////////////    
//////////////////////
#include <IRremote.h>
#include <IRremoteInt.h>
 
int RECV_PIN = 13; //пин подключения IR приёмника TSOP1138
int RELAY_PIN1 = 0; //пин подключения LN298N модуля
int RELAY_PIN2 = 1; //пин подключения LN298N модуля
//int BUTTON_PIN1 = A3; //пин выключателя1
//int BUTTON_PIN2 = A2; //пин выключателя2
int BUTTON_GER1 = A1; //геркон1
int BUTTON_GER2 = A2; //геркон1

byte knop(){ //// для кнопок вверх-вниз, двойная кнопка без фиксации
  int val = analogRead(3);
    if (val < 100) return 1;
    else if (val < 800) return 2;
    else return 0;  
}
 
IRrecv irrecv(RECV_PIN);
decode_results results;
bool LampState = false;
unsigned long time = millis();
int lastButtonState;
int lastButtonState2;
bool LampState2 = false;
////////////////////////////////////////////
    #define DS1307_I2C_ADDRESS 0x68

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    const byte outPin = 10; // выход на реле (пока не используется, запасное)

    byte setMinClockOn; //
    byte setHorClockOn;
    byte setMinClockOff; //
    byte setHorClockOff;

    byte key(){ //// для кнопок ЛСДшилда
      int val = analogRead(0);
        if (val < 100) return 5;
        else if (val < 200) return 3;
        else if (val < 400) return 4;
        else if (val < 600) return 2;
        else if (val < 800) return 1;
        else return 0;  
    }

    /////////// часы ..
    byte decToBcd(byte val){
      return ( (val/10*16) + (val%10) );
    }

    byte bcdToDec(byte val){
      return ( (val/16*10) + (val%16) );
    }

    void setDateDs1307(byte second,        // 0-59
                       byte minute,        // 0-59
                       byte hour,          // 1-23
                       byte dayOfWeek,     // 1-7
                       byte dayOfMonth,    // 1-28/29/30/31
                       byte month,         // 1-12
                       byte year)          // 0-99
    {
       Wire.beginTransmission(DS1307_I2C_ADDRESS);
       Wire.write(0);
       Wire.write(decToBcd(second));    
       Wire.write(decToBcd(minute));
       Wire.write(decToBcd(hour));     
       Wire.write(decToBcd(dayOfWeek));
       Wire.write(decToBcd(dayOfMonth));
       Wire.write(decToBcd(month));
       Wire.write(decToBcd(year));
       Wire.endTransmission();
    }

    void getDateDs1307(byte *second,
              byte *minute,
              byte *hour,
              byte *dayOfWeek,
              byte *dayOfMonth,
              byte *month,
              byte *year)
    {

      Wire.beginTransmission(DS1307_I2C_ADDRESS);
      Wire.write(0);
      Wire.endTransmission();

      Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

      *second     = bcdToDec(Wire.read() & 0x7f);
      *minute     = bcdToDec(Wire.read());
      *hour       = bcdToDec(Wire.read() & 0x3f);
      *dayOfWeek  = bcdToDec(Wire.read());
      *dayOfMonth = bcdToDec(Wire.read());
      *month      = bcdToDec(Wire.read());
      *year       = bcdToDec(Wire.read());
    }
    ////
    void setClock(){ // установка часов
      byte pos = 1;
      byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
        getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
     
        lcd.clear();
        lcd.blink();

       while(key() != 1){ // крутим   цикл   
        byte KEY = key(); // читаем состояние кнопок
          delay(200);
        lcd.setCursor(1, 1);
        lcd.print("set to save");
        lcd.setCursor(0, 0);     // выводим инфу
         if (hour < 10) lcd.print("0");
        lcd.print(hour);
        lcd.print(":");
         if (minute < 10) lcd.print("0");
        lcd.print(minute);  
        lcd.print(" ");     
         if (dayOfMonth < 10) lcd.print("0");
        lcd.print(dayOfMonth);
        lcd.print("/");
         if (month < 10) lcd.print("0");
        lcd.print(month);
        lcd.print("/");
         if (year < 10) lcd.print("0");
        lcd.print(year);
        
        lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
        
        if (KEY == 5 && pos < 13) pos += 3; // крутим позицию
        else if (KEY == 2 && pos > 1) pos -= 3;
        
        else if (pos == 1 && KEY == 3) hour++; // крутим значения
        else if (pos == 1 && KEY == 4) hour--;
        else if (pos == 4 && KEY == 3) minute++;
        else if (pos == 4 && KEY == 4) minute--;    
        else if (pos == 7 && KEY == 3) dayOfMonth++;
        else if (pos == 7 && KEY == 4) dayOfMonth--;    
        else if (pos == 10 && KEY == 3) month++;
        else if (pos == 10 && KEY == 4) month--;    
        else if (pos == 13 && KEY == 3) year++;
        else if (pos == 13 && KEY == 4) year--;  
        
        if (hour > 23) hour = 0;
        else if (minute > 59) minute = 0;
        else if (dayOfMonth > 31) dayOfMonth = 0;
        else if (month > 12) month = 1;
        else if (year > 99) year = 0;
      }// конец цикла
     
     setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
       lcd.noBlink();
       lcd.clear();
       lcd.print("     Saved");
       delay(1500);
    }///

    void setOnOff(){    
      byte pos = 0;   
        lcd.clear();
        lcd.blink();

       while(key() != 1){ // крутим   цикл   
        byte KEY = key(); // читаем состояние кнопок
          delay(200);
        lcd.setCursor(1, 1);
        lcd.print("set to save");
        lcd.setCursor(0, 0);     // выводим инфу
         if (setHorClockOn < 10) lcd.print("0");
        lcd.print(setHorClockOn);
        lcd.print(":");
         if (setMinClockOn < 10) lcd.print("0");
        lcd.print(setMinClockOn);  
        lcd.print(" ");     
         if (setHorClockOff < 10) lcd.print("0");
        lcd.print(setHorClockOff);
        lcd.print(":");
         if (setMinClockOff < 10) lcd.print("0");
        lcd.print(setMinClockOff);
        
        lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
        
        if (KEY == 5 && pos < 9) pos += 3; // крутим позицию
        else if (KEY == 2 && pos > 1) pos -= 3;
        
        else if (pos == 0 && KEY == 3) setHorClockOn++; // крутим значения
        else if (pos == 0 && KEY == 4) setHorClockOn--;
        else if (pos == 3 && KEY == 3) setMinClockOn++;
        else if (pos == 3 && KEY == 4) setMinClockOn--;    
        else if (pos == 6 && KEY == 3) setHorClockOff++;
        else if (pos == 6 && KEY == 4) setHorClockOff--;    
        else if (pos == 9 && KEY == 3) setMinClockOff++;
        else if (pos == 9 && KEY == 4) setMinClockOff--;    
     
        
        if (setHorClockOn > 23) setHorClockOn = 0;
        else if (setMinClockOn > 59) setMinClockOn = 0;
        else if (setHorClockOff > 23) setHorClockOff = 0;
        else if (setMinClockOff > 59) setMinClockOff = 0;
        
      }// конец цикла
       lcd.noBlink();
       lcd.clear();

       EEPROM.write(0, setMinClockOn);
       EEPROM.write(1, setHorClockOn);
       EEPROM.write(3, setMinClockOff);
       EEPROM.write(4, setHorClockOff);

       lcd.print("     Saved");
       delay(1500);
    }///
     
    void menu(){
      lcd.clear();
      char menuTxt[2][14] = {"set ON/OFF >>", "set clock  >>"};
      byte pos = 0;
     
      while(1){  
        delay(200);  
        byte KEY = key();
        
        lcd.setCursor(0, 0);
        lcd.print(pos+1);
        lcd.print(".");
        lcd.print(menuTxt[pos]);
        
        if (KEY == 3 && pos != 0) pos--;
        else if (KEY == 4 && pos < 1) pos++;
        
        if (KEY == 5 && pos == 0) setOnOff();
        else if (KEY == 5 && pos == 1) setClock();
      }
    }  
     
    void setup(){
      Wire.begin();
/////////////////////////////////////////////////////
  pinMode(BUTTON_GER1, INPUT); //геркон1
  digitalWrite(BUTTON_GER1, HIGH); //геркон1
    pinMode(BUTTON_GER2, INPUT); //геркон2
  digitalWrite(BUTTON_GER2, HIGH); //геркон2
  pinMode(RELAY_PIN1, OUTPUT);
//  pinMode(BUTTON_PIN1, INPUT);
  digitalWrite(RELAY_PIN1, LOW);
//  digitalWrite(BUTTON_PIN1, HIGH);
  irrecv.enableIRIn(); // Включаем ресивер
//  lastButtonState = digitalRead(BUTTON_PIN1);
  pinMode(RELAY_PIN2, OUTPUT);
//  pinMode(BUTTON_PIN2, INPUT);
  digitalWrite(RELAY_PIN2, LOW);
//  digitalWrite(BUTTON_PIN2, HIGH);
//  lastButtonState2 = digitalRead(BUTTON_PIN2);
/////////////////////////////////////////////////////      
      lcd.begin(16, 2);
      lcd.clear();
     
      pinMode(outPin, OUTPUT);
      digitalWrite(outPin, LOW);
     
      setMinClockOn = EEPROM.read(0);
      setHorClockOn = EEPROM.read(1);
      setMinClockOff = EEPROM.read(3);
      setHorClockOff = EEPROM.read(4);
    }

    void loop()
    {
      byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  
      getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
     
      // обработка кнопок
      if (key() == 1) menu(); // если нажата селект
      else if (key() == 3) digitalWrite(outPin, HIGH);
      else if (key() == 4) digitalWrite(outPin, LOW);

      // сравниваем время и управляем выходом//
      if (setMinClockOff == minute && setHorClockOff == hour
          && second == 0) digitalWrite(outPin, LOW);
      if (setMinClockOn == minute && setHorClockOn == hour
          && second == 0) digitalWrite(outPin, HIGH);    
     
     
    //   lcd.clear();
        lcd.setCursor(0, 0);
         if (hour < 10) lcd.print("0");
        lcd.print(hour);
        lcd.print(":");
         if (minute < 10) lcd.print("0");
        lcd.print(minute);
    //  lcd.print(":");
    //   if (second < 10) lcd.print("0");
    //  lcd.print(second);
    //    lcd.setCursor(8, 0);
    //    lcd.print("    ");  
        lcd.setCursor(0, 1);
         if (dayOfMonth < 10) lcd.print("0");
        lcd.print(dayOfMonth);
        lcd.print("/");
         if (month < 10) lcd.print("0");
        lcd.print(month);
        lcd.print("/");
         if (year < 10) lcd.print("0");
        lcd.print(year);
         //
        lcd.setCursor(11, 0);
         if (setHorClockOn < 10) lcd.print("0");
        lcd.print(setHorClockOn);
        lcd.print(":");
         if (setMinClockOn < 10) lcd.print("0");
        lcd.print(setMinClockOn);
        
        lcd.setCursor(11, 1);
         if (setHorClockOff < 10) lcd.print("0");
        lcd.print(setHorClockOff);
        lcd.print(":");
         if (setMinClockOff < 10) lcd.print("0");
        lcd.print(setMinClockOff);      
       
        lcd.setCursor(7, 0);
        if (digitalRead(outPin)) lcd.print("ON ");
        else lcd.print("Off");
        
        delay(200); // нужно для нормальной работы кнопок
///////////////////////////////////////
  if ((knop() == 1) && (millis() - time > 500))
  {
    LampState = !LampState;
    if (LampState)
    {
      digitalWrite(RELAY_PIN1,HIGH);
      digitalWrite(RELAY_PIN2,LOW);
    }
    else
    {
      digitalWrite(RELAY_PIN1,LOW);
    }
    time = millis();
//    lastButtonState=digitalRead(BUTTON_PIN1);    
  }
 
  if ((knop() == 2) && (millis() - time > 500))
  {
    LampState2 = !LampState2;
    if (LampState2)
    {
      digitalWrite(RELAY_PIN1,LOW);
      digitalWrite(RELAY_PIN2,HIGH);
    }
    else
    {
      digitalWrite(RELAY_PIN2,LOW);
    }
    time = millis();
//    lastButtonState2=digitalRead(BUTTON_PIN2);    
  }
 
  if (irrecv.decode(&results))
  {
    if (results.value == 1641465911) //Код 1 кнопки ИКпульта
    {
      LampState = !LampState;
      if (LampState)
      {
      digitalWrite(RELAY_PIN1,HIGH);
      digitalWrite(RELAY_PIN2,LOW);
      }
      else
      {
        digitalWrite(RELAY_PIN1,LOW);
      }
    }
    if (results.value == 1641453671) //Код 2 кнопки ИКпульта
    {
      LampState2 = !LampState2;
      if (LampState2)
      {
      digitalWrite(RELAY_PIN1,LOW);
      digitalWrite(RELAY_PIN2,HIGH);
      }
      else
      {
        digitalWrite(RELAY_PIN2,LOW);
      }
    }
    irrecv.resume(); // Получаем следующее значение
  }
 
if (digitalRead(BUTTON_GER1)==LOW && digitalRead(RELAY_PIN1)==HIGH)
      {
        digitalWrite(RELAY_PIN1,LOW);
        digitalWrite(RELAY_PIN2,LOW);
      }
if (digitalRead(BUTTON_GER2)==LOW && digitalRead(RELAY_PIN2)==HIGH)
      {
        digitalWrite(RELAY_PIN1,LOW);
        digitalWrite(RELAY_PIN2,LOW);
      }
///////////////////////////////////////
///////////////////////////////////////
    }

 

Использованные материалы:

https://www.youtube.com/watch?v=V8ScYJGU00o

 

Категория: Arduino / ATMEGA | Добавил: Timur (21.03.2016)
Просмотров: 5138
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
YANDEX
Яндекс.Метрика
Сайты
  • Харьковский Юридический Альянс
  • Оцифровка кинопленки
  • TiM ©
    Харьков 2024