От Код към Реалност: Интелигентната лампа с MLP невронна мрежа
В предишната ни публикация разгледахме математическата основа на многослойния перцептрон (MLP). Днес ще ви покажем как пренесохме тези формули директно върху силициевия чип, за да създадем лампа, която „мисли“ и реагира на околната среда.
Цел и задачи на проекта
Основната ни цел беше да създадем интелигентна система за управление на осветление, която регулира яркостта на LED диод не по твърди правила (if-else), а чрез елементарна невронна мрежа, работеща върху микроконтролер.
Какво изпълнихме:
- Свързване и управление на микроконтролер ATmega328P (работно напрежение 5V със софтуерна филтрация на шума; използване на 10-битов аналогово-цифров преобразувател за фоторезистора; конфигуриран цифров вход с прекъсване за PIR сензора; генериране на 8-битов PWM сигнал за управление на LED; автономно изпълнение на невронната мрежа чрез 32 KB Flash памет).
- Реализация на невронна мрежа (архитектура 2–3–1) директно в Arduino код (математическият модел на „изкуствения интелект“ е написан на езика C++, който Arduino използва и се изпълнява в реално време от самия микроконтролер, без нужда от връзка с компютър или интернет; Arduino е достъпна платформа с отворен код, която комбинира лесен за програмиране софтуер и хардуерна платка с микроконтролер; тя служи като „мозък“, който приема сигнали от заобикалящия го свят чрез различни сензори и взема решения как да задейства свързаните към него устройства; изключително популярна е в роботиката и автоматизацията, защото позволява бързо прототипиране на сложни идеи с минимални разходи; програмира се чрез компютър, но веднъж зареден, кодът работи напълно самостоятелно).
- Управление на LED чрез PWM (Pulse Width Modulation - технология, която имитира различно напрежение чрез много бързо включване и изключване на тока) с алгоритъм за плавно (експоненциално) гасене.
- Функционално тестване на системата с реални сензори.
Хардуерна архитектура: За реализацията на проекта използвахме специфични компоненти, които работят като ситемата и датчиците на нашата лампа:
1. ATmega328P
- Микроконтролер - ATmega328P
- Захранване: 5 V (USB).
- Платка: Nano Terminal Adapter V1.0.
- Методология: Конфигурацията и управлението на микроконтролера са базирани на изследванията, представени в научната публикация: „Управление на битови електроуреди чрез кабелна и Wi-Fi мрежа“ (Жейнов, Ж., Гелдиев, Е.), публикувана в сборника на IX International Scientific Conference "Industry 4.0" (Боровец, 2024, ISSN: 2535-0153).
2. Сетивата (Сензори):
- Фоторезистор (LDR - Light Dependent Resistor): Следи околната светлина (свързан към аналогов вход A0).
- PIR(Passive Infrared Sensor ; пасивен инфрачервен сензор за движение) сензор (HC-SR501): Засича движение чрез инфрачервена светлина (цифров вход D2).
3. Изпълнителят (Изход):
- LED диод: Управлява се чрез PWM сигнал от пин D9, което позволява плавна промяна на яркостта.
Фигура 1: Принципна схема на свързване на сензорите и светодиода към ATmega328P.

Малък речник за откриватели (Хардуер):PIR сензор (работи чрез засичане на невидимото инфрачервено лъчение, което всяко топло тяло излъчва; използва специална леща (Френелова леща), която разделя пространството на зони, за да може сензорът да „види“ движението, когато топъл обект преминава от една зона в друга; изпраща дискретен цифров сигнал към микроконтролера – „високо ниво“ (High) при движение и „ниско ниво“ (Low) при покой; разполага с вградени потенциометри за ръчно регулиране на чувствителността и времето, през което сигналът да остане активен след засичане; нарича се „пасивен“, защото не излъчва никаква енергия, а само наблюдава промените в топлинния фон на околната среда; идеален за енергоспестяващи системи, тъй като консумира пренебрежимо малко количество ток в режим на изчакване).: Представете си, че тялото ни е малка печка, която излъчва топлина. PIR сензорът е „око“, което вижда тази невидима топлина и разбира, че в стаята има човек.PWM / ШИМ (съкращение от Широчинно-импулсна модулация; представлява метод за управление на мощността чрез изключително бързо включване и изключване на електрическия ток хиляди пъти в секунда; физически имитира ниско напрежение, като променя продължителността на „включеното“ състояние спрямо „изключеното“ в рамките на един цикъл; позволява на лампата да свети с различна яркост, без да се губи енергия под формата на топлина, както би станало при обикновен резистор; осигурява 256 нива на контрол при 8-битовите микроконтролери, което прави прехода между пълна тъмнина и максимална светлина напълно незабележим за човешкото око; основен инструмент в роботиката и автоматизацията за прецизно управление на светодиоди, мотори и нагреватели).: Използваме го, за да не мига лампата рязко. То изпраща тока на много бързи порции, така че окото ни вижда просто по-слаба или по-силна светлина.
Софтуерна архитектура: Как „мисли“ лампата?
Програмата е написана в Arduino IDE и се записва във Flash паметта – тя е като „дългосрочната памет“ на лампата, която не се изтрива при изключване.
Невронната мрежа (MLP 2-3-1 ; Multi-Layer Perceptron):
- Входове: Светлина и Движение.
- Скрит слой: 3 неврона, които обработват информацията чрез Сигмоидна функция (за плавни решения).
- Тегла (Weights): Това са „записките“ на лампата, получени чрез обучение. Те казват кое е по-важно в момента.
Пълният програмен код:
C++
#define PIN_LIGHT A0 // фоторезистор
#define PIN_MOTION 2 // PIR OUT
#define PIN_LED 9 // PWM LED
// Тегла на мрежата
float w_in_h[2][3] = { { 4.29, -3.12, 5.07 }, { -2.15, 1.58, -2.56 } };
float w_h_out[3] = { -2.83, 6.82, -4.10 };
float sigmoid(float x) { return 1.0 / (1.0 + exp(-x)); }
float ai_predict(float light, float motion) {
float hidden[3];
for (int i = 0; i < 3; i++) {
float sum = light * w_in_h[0][i] + motion * w_in_h[1][i];
hidden[i] = sigmoid(sum);
}
float out = 0;
for (int i = 0; i < 3; i++) { out += hidden[i] * w_h_out[i]; }
return sigmoid(out);
}
float currentBrightness = 0.0;
const float fadeFactor = 0.98; // Коефициент на плавно гасене
void setup() {
pinMode(PIN_MOTION, INPUT);
pinMode(PIN_LED, OUTPUT);
}
void loop() {
int rawLight = analogRead(PIN_LIGHT);
int rawMotion = digitalRead(PIN_MOTION);
float light = 1.0 - (rawLight / 1023.0); // Нормализиране: тъмно = 1
float motion = (rawMotion == HIGH) ? 1.0 : 0.0;
if (motion > 0.5) {
currentBrightness = ai_predict(light, motion);
}
else {
currentBrightness *= fadeFactor; // Експоненциално "заспиване"
if (currentBrightness < 0.01) currentBrightness = 0.0;
}
analogWrite(PIN_LED, (int)(currentBrightness * 255.0));
delay(30);
}
Логика и Алгоритъм (Блок-схема)
Логиката на системата следва прост път: Сензори (Вход) ➔ ATmega328P (Обработка) ➔ Невронна мрежа (Интелект) ➔ PWM (Действие) ➔ LED (Резултат)
Какво се случва 30 пъти в секунда (в loop):
- Четене: Вземат се данни от сензорите.
- Нормализация: Данните се превръщат в числа между 0 и 1 (езикът на AI).
- Решение: Ако има движение, AI изчислява яркостта. Ако няма – стартира експоненциално затихване (лампата бавно „изстива“, вместо да угасне рязко).
- Изпълнение: Изпраща се сигнал към диода и цикълът започва отново.
Проектът в действие
Тук можете да видите реалната реализация на макета и видео демонстрация на интелигентното поведение:
„Благодарим на инж. Г. Гелдиев за предоставянето на пълната техническа документация, софтуерният код на C++, чертежи и мултимедийни материали от неговите опити, които направиха тази публикация възможна.“
Въпроси за дискусия
Можем ли да обучим теглата на мрежата директно върху Arduino-то в бъдеще?
Да, това е напълно възможно чрез внедряване на алгоритъма "Backpropagation" директно в C++ кода, което би позволило на лампата да се самообучава спрямо вашите навици. Основното ограничение е малкото RAM памет (2KB) на ATmega328P, която изисква изключително оптимизиран код при по-сложни мрежи.
Какъв нов сензор бихте добавили, за да стане лампата още по-полезна?
Добавянето на сензор за шум (микрофон) би позволило на лампата да реагира на глас или пляскане, или сензор за влажност и температура (DHT11), за да променя цвета или интензитета си спрямо микроклимата в стаята. Още по-интересно би било добавянето на ултразвуков сензор за разстояние, за да може яркостта да зависи от това колко близо до лампата се намира човекът.