Умное уличное освещение IoT: энергоэффективная LED-система на Arduino
Компоненты и расходные материалы
| Компонент | Количество |
|---|---|
| Arduino UNO WiFi Rev.2 | 1 |
| Светодиод (любой) | 1 |
| Фоторезистор (LDR) 1 МОм | 1 |
| ИК-датчик приближенности (Digilent IR Proximity) | 1 |
| ESP8266 ESP-12E | 1 |
| Резистор 1 кОм | 1 |
Инструменты
- Макетная плата 170 пинов
Сервисы
- Arduino IDE
- ThingSpeak API
О проекте
Проблема
Уличное освещение — огромные расходы города. Натриевые лампы потребляют много энергии. Ручное включение/выключение ведёт к перерасходу (свет горит, когда не нужен). Автоматизация экономит энергию, деньги, снижает CO₂, световое загрязнение и потребность в персонале.
Недостатки текущей системы
- Ручное управление
- Высокое потребление
- Большие затраты
- Много ручного труда
Преимущества предложенной системы
- Автоматическое включение/выключение
- Снижение затрат на обслуживание
- Снижение выбросов CO₂
- Снижение светового загрязнения
- Беспроводная связь (IoT)
- Экономия энергии
- Снижение потребности в персонале
Принцип работы
А. Фоторезистор (LDR)
LDR меняет сопротивление в зависимости от освещённости. При свете — низкое сопротивление, ток открывает транзисторы. Настроечный резистор регулирует порог срабатывания. Сигнал на Arduino.
Б. ИК-датчик приближенности
Определяет наличие транспорта/прохожих. ИК-излучение отражается от объекта, детектируется приёмником. Сигнал на Arduino.
В. LED
Яркость пропорциональна темноте: темнее — ярче. PWM-управление.
Г. ESP8266
WiFi-модуль (SoC) для отправки данных на ThingSpeak. 2.4 ГГц, 802.11 b/g/n, 16 GPIO, I2C, SPI, UART, PWM, 10-битный ADC, 32-битный CPU 80/160 МГц. Управляется AT-командами по UART.
Распиновка ESP-01: 3V3, GND, RST, EN, TX, RX.
Исходный код
Основной скетч (Arduino UNO WiFi Rev.2)
int smooth, LDR;
int threshold = 40; // порог освещённости
int brightness = 0;
int ledState = 0;
int sensor1 = 11; // ИК-датчик 1
int sensor2 = 8; // ИК-датчик 2
int sensor3 = 9; // ИК-датчик 3
int led1 = 5; // LED 1 (PWM)
int led = 6; // LED 2 (PWM)
int led2 = 2; // LED 3
int carPresent = 0;
int carPresent1 = 0;
float beta = 0.65; // сглаживание LDR
void setup() {
Serial.begin(115200);
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(sensor3, INPUT);
pinMode(led, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
}
void loop() {
// Сглаживание показаний LDR (экспоненциальное скользящее среднее)
smooth = smooth - (beta * (smooth - analogRead(A0)));
delay(1);
LDR = round(((float)smooth / 1023) * 100);
if (LDR <= 40) brightness = 0;
else brightness = map(LDR, 40, 100, 0, 255);
checkSensors();
if (carPresent == 1) {
ledState = 1;
digitalWrite(led, HIGH);
digitalWrite(led1, HIGH);
analogWrite(led, brightness);
analogWrite(led1, brightness);
} else if (carPresent == 0) {
ledState = 0;
digitalWrite(led, HIGH);
analogWrite(led, ledState);
if (carPresent1 == 1) {
ledState = 1;
if (ledState == 1) {
analogWrite(led1, brightness);
analogWrite(led2, brightness);
}
} else if (carPresent1 == 0) {
ledState = 0;
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
analogWrite(led1, ledState);
analogWrite(led2, ledState);
}
}
// Отправка данных в Serial для ESP8266
String data = (String)ledState + "," + (String)brightness + ";";
Serial.print(data);
delay(100);
}
void checkSensors() {
// Логика детекции машины тремя ИК-датчиками по ходу движения
if (digitalRead(sensor1) == 0) { // машина на 1-м
if (digitalRead(sensor2) == 1) carPresent = 1; // ещё не на 2-м
} else if (digitalRead(sensor2) == 0) { // машина на 2-м
if (digitalRead(sensor1) == 1) { carPresent = 0; carPresent1 = 1; }
else { /* машины вслед за первой */ }
} else if (digitalRead(sensor3) == 0) { // машина на 3-м
if (digitalRead(sensor2) == 1) { carPresent = 0; carPresent1 = 0; }
else { carPresent = 0; carPresent1 = 1; }
}
}
Скетч для ESP8266 (отправка в ThingSpeak)
#include <ESP8266WiFi.h>
const char* ssid = "ardent";
const char* password = "12345678";
String ledState = "";
String brightness = "";
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "NUEBLW9OA58DLL4N"; // ваш Write API Key
WiFiClient client;
void setup() {
Serial.begin(115200);
connectWifi();
}
void loop() {
filterData();
HTTPPost();
delay(15000); // не чаще 15 сек (лимит ThingSpeak)
}
int connectWifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(2500);
}
void HTTPPost() {
if (client.connect(thingSpeakAddress, 80)) {
String PostData = "api_key=" + writeAPIKey;
PostData += "&field1=" + ledState;
PostData += "&field2=" + brightness;
client.println("POST /update HTTP/1.1");
client.println("Host: api.thingspeak.com");
client.println("Connection: close");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Content-Length: " + String(PostData.length()));
client.println();
client.println(PostData);
client.stop();
}
}
void filterData() {
if (Serial.available()) {
String buffer = Serial.readStringUntil(';');
int i1 = buffer.indexOf(',');
ledState = buffer.substring(0, i1);
brightness = buffer.substring(i1 + 1);
}
}
Схемы
- Принципиальная схема (PNG)
- Файл для Fritzing (прилагается)
Производственный процесс
- Умный светофор: адаптивное уличное освещение на базе IoT
- Многопозиционная система датчиков температуры для интеграции в умный дом
- MotionSense: умная система обнаружения проникновения на Arduino и ESP8266
- Пожарная безопасность 3D-принтера: умная система обнаружения дыма
- Умная система автополива растений на Arduino Nano
- Магнитная левитация на отталкивании с Arduino: Простая схема и DIY-руководство
- Продвинутый дистанционно управляемый манипулятор-робот для точной работы
- Продвинутая лаборатория микроконтроллеров: ESP32, Arduino, PIC и сенсорные модули
- DIY POV-сфера: LED-световизуализация на Arduino Mega
- CoroFence: термический детектор на GridEye + PIR с IoT