Добрый день уважаемые читатели, продолжая тему внедрения контроллеров Arduino, хотел бы с вами поделиться своей версией проекта автоматического освещения комнаты. Статья предусмотрена скорее для таких же как я новичков, чем для опытных радиолюбителей. Возможно, для кого-то эта статья станет основой для своих собственных проектов, ну а мне будет приятно прочитать строгую критику, ваши варианты исполнения или просто поддержку в комментариях.
Цель проекта: смонтировать два контура освещения комнаты на втором этаже дома, при условии управления в ручном и автоматическом режиме, при минимальных затратах.
// Проект автоматики освещения.
// Настройка пинов.
#define Sensor_1 10 // Пин первого сенсора НС-SR501.
#define Sensor_2 11 // Пин второго сенсора НС-SR501.
#define D0 3 // Пин датчика освещенности.
int Relay[2] = {8, 9}; // Пины реле.
int Button[2] = {5, 6}; // Пины кнопок.
// Переменные.
boolean Start_Sensor = false; // Переменная отражающая факт срабатывания датчика.
boolean relayEnabled[2] = {true, true}; // Состояние реле.
boolean buttonWasUp[2] = {true, true}; // Состояние кнопок.
unsigned long previousMillis = 0; /* Переменнтая для хранения
предыдущего времени срабатывания датчика. */
unsigned long activateTime; // Переменная для хранения времени срабатывания реле.
int value = 0; // Временная переменная для таймера.
// Константы.
const int T_hold = 10000; // Время удержания реле при отсутствии движения.
const int T_motion = 200; // Время от начала фиксирования движения до срабатывания реле.
void setup()
{
// Настройка пинов и их начальное состояние.
pinMode(D0, INPUT); // Датчик освещенности - вход.
for (int i = 0; i < 2; ++i)
{
pinMode(Relay[i], OUTPUT); // Реле - выходы.
pinMode(Button[i], INPUT_PULLUP); // Кнопки - входы с подтягивающим резистором.
digitalWrite(Relay[i], relayEnabled[i]); /* Начальное состояние реле высокое,
чтобы реле включилось необходимо подать низкий сигнал или минус. */
}
}
void loop()
{
if(digitalRead(D0)) // Считываем значение с датчика освещенности "Достаточно ли темно для автоматики?"
{
Sensor_Work();
if (relayEnabled[0] == true && Start_Sensor == true)
// Если состояние 1го реле высокое (отключено) и сработал один из датчиков.
{
relayEnabled[0] = false; // Изменить состояние реле на низкое (включено).
digitalWrite(Relay[0], relayEnabled[0]); // Включить первое реле.
activateTime = millis(); // Зафиксировать время включения реле.
while((millis() - activateTime) < T_hold)
{
// Задержка.
}
relayEnabled[0] = true; // Изменить состояние реле на высокое (отключено).
digitalWrite(Relay[0], relayEnabled[0]); // Отключить реле.
}
}
// Для определения клика сначала понимаем, отпущена ли кнопка прямо сейчас.
for (int i = 0; i < 2; ++i)
{
boolean buttonIsUp = digitalRead(Button[i]);
// Если кнопка была отпущена и (&&) нажата сейчас...
if (buttonWasUp[i] && !buttonIsUp)
{
/* может это клик, а может и ложный сигнал (дребезг), возникающий в
момент замыкания размыкания пластин кнопки, поэтому даем кнопке полностью
успокоиться */
delay(10);
// И снова считываем сигнал.
buttonIsUp = digitalRead(Button[i]);
if (!buttonIsUp)
{
// Если она все еще нажата...
relayEnabled[i] = !relayEnabled[i]; // меняем состояние сигнала на противоположный.
digitalWrite(Relay[i], relayEnabled[i]); // Включаем то реле сквитированной кнопки.
}
}
// Запоминаем последнее состояние кнопки для новой итерации.
buttonWasUp[i] = buttonIsUp;
}
}
void Sensor_Work() // Процедура опроса сенсоров.
{
if (digitalRead(Sensor_1) == HIGH || digitalRead(Sensor_2) == HIGH) /* Если один из
датчиков зафиксировал движение. */
{
// Запустить таймер.
if (millis() - previousMillis > T_motion)
{
previousMillis = millis();
value++;
}
}
else
{
Start_Sensor = false; // Возвращение в исходное состояние факта срабатывания.
value = 0;
}
if(value >= 10)
{
Start_Sensor = true; // Факт срабатывания датчика.
value = 0;
}
}
Контроллер Arduino Pro Mini Atmega 328 5 В 16 МГц | 1 |
Пироэлектрический инфракрасный сенсор HC-SR501 | 2 |
Сенсор освещенности на микросхеме LM393 | 1 |
Стабилизатор напряжения L7805CV | 1 |
Конденсатор керамический 0,33 мкФ | 1 |
Конденсатор керамический 0,1 мкФ | 1 |
Гнездо на плату PBS 1?40 2.54 | 1 |
Переключатель SWD1-1 | 2 |
Клеммник винтовой двухконтактный | 9 |
Стеклотекстолит 61?46 мм | 1 |
Стеклотекстолит 40?20 мм | 1 |
Тактовая кнопка | 2 |
Текстолит | 1 |
Люминесцентный светильник Camelion WL-4002, 16 Вт | 12 |
Потолочный светильник с двумя лампами накаливания | 1 |
Распределительная коробка | 8 |
Кабель ПУНП 2?2.5 | |
Кабель телефонный ШТЛП-4 0,12?7 | |
Кабель канал (различных размеров) | |
Расходники (термоклей, клей Момент Кристалл, припой, канифоль, флюс ТАГС, наконечники) | |
Крепежные элементы (болты, гайки, саморезы, дюбеля, хомуты) |
К сожалению, не доступен сервер mySQL