Инструкции

» » Открытие и закрытие окна с помощью Arduino

Открытие и закрытие окна с помощью Arduino


Всем мы знаем, что когда наступает холодный сезон, то мы утром не чувствуем себя наполненными искрометной бодростью и не всегда ощущаем себя выспавшимися.
 Да в принципе даже днём нас назойливо мучает усталость, зевота, сонливость, настроение падает, вдруг беспричинно накатывает хандра, голова болит, да и вообще от такого букет можно приболеть ненароком. 
К счастью, мы знаем причину всех этих неприятных моментов, которые нам мешают жить поздней осень, зимой и совсем ранней весной это недостаток свежего воздуха. В летние месяцы, у нас почти каждый день открыты почти все окна, а вот с наступлением холодных пор, открываем окна значительно реже. 
Врачи в один голос трубят, что проветривание помещения очень полезно для нашего здоровья в любое время года, независимо от погоды и температуры за окном.
Но порой мы бываем очень заняты домашними делами по дому или уходим на работу, забывая при этом проветривать свое жилое помещение, таким образом, чтобы воздух в квартире всегда оставался чистым и полезным для дыхания. 
В этой статье мы рассмотрим конструкцию, которая умеет открывать и закрывать ваши окна в автоматическом режиме. Более того, вы даже сможете сами составить график и внедрить его в работу данной конструкции с помощью микроконтроллера Arduino.

Альтернативный и эстетичный способ, на наш взгляд - это встроить микроконтроллер в окно, чтобы он не бросался в глаза, если бы мы его например, просто бы закрепили на болтах к стене. 
На наш взгляд наилучшее решение – это вмонтировать наш микроконтроллер под подоконник, так как там достаточно места для его размещения, а также если вдруг плата Arduino сгорит в силу различных обстоятельств, то мы с легкостью сможем её заменить, так как подоконник легко можно снять, если есть надобность и также легко поставить его на место.
Микроконтроллер Arduino будет управлять сильным серводвигателем, который в последствии будет перемещать наше окно. Вся конструкция также будет иметь специальные датчики расстояния. Таким образом вся конструкция станет как бы, ориентироваться в пространстве и этой даст свой наилучший  положительный эффект при постоянных открытиях и закрытиях нашего окна.
Шаг 1: Список деталей и инструментов

Основные части для нашей конструкции: 
  • 1 шт. Адаптер питания для Arduino (входное напряжение 7-12 V); 
  • 1 шт. Микроконтроллер Arduino; 
  • 1 шт. Сильный серводвигатель для перемещения окна. В качестве примера:  Towerpro MG995 Metal Servo с Gears (крутящий момент 10 кг);
  • 2 шт. Несущая плата Pololu 1134 с Sharp GP2Y0D810Z0F; 
  • цифровой датчик расстояния 10 см; 
  • 1 шт. «Рычаг привода» для крепления датчиков  1 шт. 
Остальные детали конструкции: 
  • проводка для подключения всех деталей к Arduino, не со слишком большим сечением, чтобы вместительны для корпуса небольшого оконного шарнира;
  • некоторые металлические детали для крепления сервопривода к оконной раме, винты и т. д.; 
  • все необходимые инструменты для монтажа и т. д.; 
  • припой и паяльник;
  • компьютер и USB-кабель для программирования Arduino;
Шаг 2: Механика




Сначала мы сделаем держатель для сервопривода и прикрепим его к раме. Затем мы закрепим небольшую оконную петлю на самом окне. 
Делаем регулируемый рычаг из медной катанки. Не закрепляйте рычаг сервомеханизма винтом до тех пор, пока вы сначала не приведете сервопривод в нулевое (закрытое) положение с помощью управляющей программы. Хорошо, что механика легко регулируется. 
В качестве примера выбран сервопривод Towerpro с металлическими шестернями, чтобы продлить срок службы установки. Он достаточно легко перемещает окно. Скорость закрытия установлена очень медленная. 
Имеются файлы dfx кронштейна сервопривода и рычага привода. Можете рассмотреть в наглядности.
Скачать файл: fajly.rar [19,59 Kb] (cкачиваний: 116)
Шаг 3: Размещение датчика



Помещаем три датчика, два между окнами (они хорошо работают через стекло). Преимуществом является то, что в платах Pololu есть крошечные SMD-светодиоды. Вы видите цветовую индикацию непосредственно, когда датчик обнаруживает объект.
Шаг 4: Центр управления

Коробка с Arduino удобно расположена под подоконником. Там нет выключателя питания. Вы просто подключаете или отключаете разъем питания.
Шаг 5: Код
Вот программа. Он написан на программном обеспечении Arduino IDE. 
Скетч для нашей «оконной конструкции» довольно хорошо и упорядочено написан. Мы добавили в вашу пользу в код (скетч) некоторые задержки для обнаружения, потому что окно иногда само открывалось. 
Сам скетч:
#include <Servo.h> 
const int insidePin = 2;     // sensor inside
const int betweenPin = 4;     // sensor between
const int outsidePin = 6;      // sensor outside
const int ledPin =  13;       // the number of the LED pin
Servo servo1;  // create servo object to control a servo, a maximum of eight servo objects can be created 
int pos1 = 0;    // variable to store the servo1 position 
int windowState = HIGH;
int insideState = HIGH;
int outsideState = HIGH;
int betweenState = HIGH;
int helpState = HIGH;
void setup() 
{ 
   servo1.attach(10);  // attaches the servo1 on pin 10 to the servo object
   // initialize the LED pin as an output:
   pinMode(ledPin, OUTPUT);      
   // initialize the sensors pins as an input:
   pinMode(insidePin, INPUT);
   pinMode(outsidePin, INPUT);
   pinMode(betweenPin, INPUT);
   servo1.write(180);              // tell servo to go to position window closed, set state low 
   windowState = LOW;  
} 
void loop() 
{ 
   // read the state of the sensors:
   // First INSIDE sensor
   delay(500);
   helpState = insideState;
   insideState = digitalRead(insidePin);
   if (insideState != helpState)
  {
     delay(1000);
     insideState = digitalRead(insidePin);
     if (insideState != helpState)
     {
       helpState = insideState;
     }
     else
     {
       insideState = helpState; // state has to be at least 10ms in changed -state to be changed
     }
  }
   //   ********************* 
   // then OUTSIDE sensor
   delay(500);
   helpState = outsideState; // store current state
   outsideState = digitalRead(outsidePin);
   if (outsideState != helpState)
  {
     delay(1000);
     outsideState = digitalRead(outsidePin);
     if (outsideState != helpState)
     {
       helpState = outsideState;
     }
     else
     {
       outsideState = helpState; // state has to be at least 1s in changed -state to be changed NOT changed
     }
  }
  //    ********************* 
   // lastly BETWEEN sensor
   delay(500);
   helpState = betweenState; // store current state
   betweenState = digitalRead(betweenPin);
   if (betweenState != helpState)
  {
     delay(1000);
     betweenState = digitalRead(betweenPin);
     if (betweenState != helpState)
     {
       helpState = betweenState;
     }
     else
     {
       betweenState = helpState; // state has to be at least 1s in changed -state to be changed
     }
  }
   //   ********************* 
   // check if the cat wants inside or outside. If it is so, the state of one sensor is LOW:
   if (((insideState == LOW) or (outsideState == LOW) or (betweenState == LOW)) and (windowState == LOW)) 
     // cat at either windowsill or between windows and window closed
    // open sesame!
  {
     for(pos1 = 180; pos1>=1; pos1-=1)      // goes from 180 degrees to 0 degrees 
     {                                
       servo1.write(pos1);               // tell servo to go to position in variable 'pos' 
       delay(15);                       // waits 15ms for the servo to reach each position 
     } 
     windowState = HIGH;    
     digitalWrite(ledPin, HIGH);     // turn LED on
     delay (10000);                  // wait at least 10 secs
  }
   // maybe the cat is doing the things cats do elsewhere
   // if so, we may as well close the window...
   if ((insideState == HIGH) and (outsideState == HIGH) and (betweenState == HIGH) and (windowState == HIGH))
  {
     // close it will!
     for(pos1 = 0; pos1 < 180; pos1 += 1)   // goes from 0 degrees to 180 degrees 
     {                                   // in steps of 1 degree 
       servo1.write(pos1);               // tell servo to go to position in variable 'pos' 
       delay(150);                        // waits 150ms for the servo to reach each position 
     }
     windowState = LOW;             // no delay here, be prepared to open immediately
     digitalWrite(ledPin, LOW);     // turn LED off
  }
} 

По умолчанию программа закрывается в начале. Если нет, он закрывает его первым. Рекомендуем вам убедится, что с сервоприводом все в порядке, прежде чем устанавливать его в нашу конструкцию, иначе ваша конструкция просто не заработает или будет работать некорректно! 
Шаг 6: Соединения
Плата Arduino включает все датчики и серводвигатель с +5 В и GND. 
Датчики подключены к следующим контактам Arduino: 
  • PIN 2 - датчик внутреннего вида, 
  • PIN 4 - датчик, расположенный в проеме окна, 
  • PIN 6 - датчик, выходящий наружу, 
  • PIN 10 провод управления серводвигателями, 
  • PIN 13 - светодиод, который горит, когда окно находится в движении. 
Мы также решили включить датчики температуры как внутри, так и снаружи. Это удобный способ получить интеллектуальную вентиляцию летом!
Шаг 7: Счастливый пользователь
Вы должны привыкнуть к автоматическому окну. Потому что поначалу вам может казаться что у вас дома завелся домовой, имя которому - Arduino. Но если без шуток, то вы получаете довольно интересный элемент умного дома. Ведь современные и дорогостоящие системы, выполняют практически те же функции, но потребители платят баснословные цены за эту инновацию. Зачем платить больше, если можно сделать самому?

Остались вопросы? Задавайте их в комментарии, и мы постараемся ответить на них.

  1. Алексей
    Можно ли настроить данную конструкцию на один тепловой датчик? чтоб при превышении порогового значения сервопривод открывал окно и закрывал при понижении температуры?
    есть ли видео открывания и закрывания окна? или фото конструкции в сборе? хотелось бы глянуть :)