Arduino керування світлом з пульта дистанційного керування
Як керувати освітленням у кімнаті за допомогою пульта дистанційного керування, наприклад від телевізора.
Потрібен функціонал :
1) Можливість керувати вимикачем за допомогою побутового ІЧ пульта (38кГц, більшість такі, у мене від ТВ-тюнера Beholder M6). 2) Вмикати/вимикати світло, як від клавіші вимикача, так і з пульта, незалежно один від одного.
Для початку нам необхідно дізнатися коди кнопок пульта, які ми хочемо використовувати для управління освітленням.
Для цього заливаємо в пам'ять Arduino наступний скетч, підключаємо IR приймач TSOP1138 до нього (нижче на малюнку його розпинування) і при натисканні кнопок на пульті, в моніторі порту дивимося який код кнопки:
Примітка: Для компіляції коду потрібно додати бібліотеку IRRemote до Arduino IDE
Прошивка (працює у мене, під пульт від ТВ-тюнера Beholder M6):
Перед заливкою скетчу в Ардуїно, замінюємо код кнопки, що у рядку містить код кнопки (на той, який ви записали раніше):
if (results.value == 1641453671) //Код кнопки
Власне сам скетч
int RECV_PIN = 11; //пін підключення IR приймача int RELAY_PIN1 = 8; //пін підключення реле1 int BUTTON_PIN1 = A5; //пін вимикача1 int RELAY_PIN2 = 7; //пін підключення реле2 int BUTTON_PIN2 = A4; //пін вимикача2
IRrecv irrecv(RECV_PIN); decode_results results; bool LampState = false; unsigned long time = millis(); int lastButtonState; int lastButtonState2; bool LampState2 = false;
void setup() 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); >
void loop() if ((digitalRead(BUTTON_PIN1)==LOW) && (millis() - time > 500)) LampState = !LampState; якщо (LampState) digitalWrite(RELAY_PIN1,HIGH); > інакше digitalWrite(RELAY_PIN1,LOW); > time = millis(); lastButtonState=digitalRead(BUTTON_PIN1); >
if ((digitalRead(BUTTON_PIN2)==LOW) && (millis() - time > 500)) LampState2 = !LampState2; якщо (LampState2) digitalWrite(RELAY_PIN2,HIGH); > інакше digitalWrite(RELAY_PIN2,LOW); > time = millis(); lastButtonState2=digitalRead(BUTTON_PIN2); >
if (irrecv.decode(&results)) if (results.value == 1641453671) //Код 1 кнопки ИКпульта LampState = !LampState; якщо (LampState) digitalWrite(RELAY_PIN1,HIGH); > інакше digitalWrite(RELAY_PIN1,LOW); > > if (results.value == 1641465911) //Код 2 кнопки ИКпульта LampState2 = !LampState2; якщо (LampState2) digitalWrite(RELAY_PIN2,HIGH); > інакше digitalWrite(RELAY_PIN2,LOW); > > irrecv.resume(); // Получаємо наступне значення > >
Робота перевірялася з Arduino IDE v1.0.5
Примітка: Для компіляції коду потрібно додати бібліотеку IRRemote в Arduino IDE

Розпакуйте цей файл у каталозі з бібліотеками, наприклад, C:\electronics\arduino-1.0.5\libraries. Якщо ім’я бібліотеки вам здається надто довгим, ви можете переіменувати її, допустимо, в IR.
Додаємо бібліотеку до скетчу :
У новому скетчі виберіть Sketch->Імпорт бібліотеки->IR

Робота вимикача:
При включенні живлення лампи спочатку не горять. При кожному натисканні призначених кнопок на пульті вмикатиметься/вимикатиметься,
Принципова схема вимикача:

Відповідність висновків ATMEGA328P-PU до Arduino Uno R3: