В этой статье мы рассмотрим проектирование системы автоматизации дома на основе персонального компьютера и платы Arduino, с помощью которой мы сможем включать и выключать различные электронные устройства. Для демонстрации возможностей нашего устройства мы использовали 3 электрические лампочки, которые будут обозначать свет в комнате, вентилятор и телевизор. Управлять работой устройства будет плата Arduino Uno. Для включения и выключения цепей лампочек мы будем использовать реле на 5 В.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Драйвер двигателей ULN2003 (купить на AliExpress).
- Электрические лампочки с держателями.
- Кабель для последовательной связи.
- Реле на 5 Вольт.
- Соединительные провода.
- Макетная плата.
- Компьютер (ноутбук).
- Источник питания.
Используемые реле
Реле используются для управления устройствами с напряжением питания большим, чем используемое напряжение управления. К таким устройствам можно отнести электрические лампочки, телевизоры, вентиляторы и т.д. Реле является переключателем и содержит катушку и несколько переключаемых контактов. Существуют различные типы реле, такие как:
- Однополюсные и на одно направление (SPST).
- Однополюсные на два направления (SPDT).
- Двухполюсные на одно направление (DPST).
- Двухполюсные на два направления (DPDT).
В нашем проекте мы использовали однополюсные реле на два направления (SPDT). Эти реле включают в себя 5 контактов, из которых 2 отведено под катушку, один под полюс (переключающий контакт, pole), а остальные два называются «Normally Connected» (NC, нормально замкнутые) и «Normally Open» (NO, нормально разомкнутые).
Работа схемы
Схема устройства представлена на следующем рисунке.
Последовательный порт связи используется для управления контролируемыми устройствами. Мы передаем команды типа LIGHT ON, LIGHT OFF, FAN ON, FAN OFF, TV ON AND TV OFF для управления домашними электронными устройствами. После приема этих команд плата Arduino передает сигнал на соответствующие реле, которые отвечают за включение/выключение подключенных к ним устройств.
Когда мы будем нажимать ENTER после набора команды в гипер терминале (hyper terminal) или последовательном терминале (serial terminal) Arduino будет выполнять соответствующую команду, например, включение вентилятора. Также соответствующее сообщение будет показываться на ЖК дисплее.
Исходный код программы
В программе первым делом нам необходимо подключить библиотеку для работы с ЖК дисплеем, инициализировать контакты для работы с ЖК дисплеем и домашними электронными устройствами.
#include <LiquidCrystal.h>
#include<string.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
#define light 3
#define fan 4
#define TV 5
После этого инициализируем последовательный порт для работы на скорости 9600 бод/с и задаем направление работы для инициализированных контактов.
lcd.begin(16, 2);
Serial.begin(9600);
pinMode(light, OUTPUT);
pinMode(fan, OUTPUT);
pinMode(TV, OUTPUT);
lcd.print(" Home Automation ");
lcd.setCursor(0,1);
Для приема команд по последовательному порту мы будем использовать две функции — Serial.available, которая будет проверять поступили ли какие-нибудь данные по последовательному порту или нет, и Serial.read, которая будет считывать данные на последовательном порту.
while(Serial.available())
{
char Inchar=Serial.read();
После приема данных по последовательному порту мы сохраняем эти данные в строке и затем ждем нажатия клавиши Enter (на компьютере).
str[i]=Inchar;
i++;
lcd.print(Inchar);
delay(50);
if(Inchar == 0x0d)
{
temp=1;
После нажатия enter мы в программе начнем сравнивать принятую строку с хранящимися в памяти шаблонами команд и если будет выявлено соответствие, то будет выполняться соответствующая команда.
else if(strncmp(str, "TV ON", 5)==0)
{
digitalWrite(TV, HIGH);
Для сравнения строк мы будем использовать библиотеку string.h, которая содержит полезные нам функции strcmp, strncmp, strcpy и т.д.
Далее приведен полный текст программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
#include <LiquidCrystal.h> #include<string.h> LiquidCrystal lcd(13, 12, 11, 10, 9, 8); #define light 3 #define fan 4 #define TV 5 char temp; char str[10]; char i=0; void setup() { lcd.begin(16, 2); Serial.begin(9600); pinMode(light, OUTPUT); pinMode(fan, OUTPUT); pinMode(TV, OUTPUT); lcd.print(" Home Automation "); lcd.setCursor(0,1); lcd.print(" Using PC "); delay(2000); lcd.clear(); lcd.print("Keywords For "); lcd.setCursor(0,1); lcd.print("Controlling"); delay(2000); lcd.clear(); lcd.print("1. LIGHT ON"); lcd.setCursor(0,1); lcd.print("2. LIGHT OFF"); delay(2000); lcd.clear(); lcd.print("3. FAN ON"); lcd.setCursor(0,1); lcd.print("4. FAN OFF"); delay(2000); lcd.clear(); lcd.print("5. TV ON"); lcd.setCursor(0,1); lcd.print("6. TV OFF"); delay(2000); defualt(); delay(1000); } void loop() { if(temp==1) { if((strncmp(str,"FAN ON", 6))==0) { lcd.clear(); digitalWrite(fan, HIGH); lcd.clear(); lcd.print("Fan Turned On"); delay(3000); defualt(); } else if(strncmp(str, "FAN OFF", 7)==0) { digitalWrite(fan, LOW); lcd.clear(); lcd.print("Fan Turned OFF"); delay(3000); defualt(); } else if(strncmp(str, "LIGHT ON", 8)==0) { digitalWrite(light, HIGH); lcd.clear(); lcd.print("Light Turned ON"); delay(3000); defualt(); } else if(strncmp(str, "LIGHT OFF", 9)==0) { digitalWrite(light, LOW); lcd.clear(); lcd.print("Light Turned OFF"); delay(3000); defualt(); } else if(strncmp(str, "TV ON", 5)==0) { digitalWrite(TV, HIGH); lcd.clear(); lcd.print("TV Turned ON"); delay(3000); defualt(); } else if(strncmp(str, "TV OFF", 6)==0) { digitalWrite(TV, LOW); lcd.clear(); lcd.print("TV Turned OFF"); delay(3000); defualt(); } else { lcd.clear(); lcd.print(" Invalid Input"); lcd.setCursor(0,1); lcd.print(" Try Again "); delay(3000); defualt(); } } } void serialEvent() { while(Serial.available()) { char Inchar=Serial.read(); str[i]=Inchar; i++; lcd.print(Inchar); delay(50); if(Inchar == 0x0d) { temp=1; //Inchar=0; } } } void defualt() { lcd.clear(); lcd.print("Enter UR Choise:"); lcd.setCursor(0,1); lcd.cursor(); i=0; temp=0; } |