IoT-солнечный трекер на Arduino: умное управление энергией с мониторингом через Cayenne
Компоненты и материалы
- Arduino Mega 2560 — 1 шт.
- Ethernet Shield (Wiznet W5100) для Arduino — 1 шт.
- Сервоприводы SG90 (микро) — 2 шт. (по вертикали и горизонтали)
- Фоторезисторы (LDR) 5 МОм — 4 шт. (определение позиции солнца)
- Датчик температуры и влажности DHT22 — 1 шт.
- Мини-солнечная панель (115×85 мм, 1,6 Вт, до 6 В) — 1 шт.
- Резисторы: 330 Ом (4 шт.), 10 Ом (2 шт.), 220 Ом (1 шт.)
- Светодиод красный 5 мм — 1 шт. (индикатор режима работы)
Программное обеспечение и сервисы
- Arduino IDE — среда разработки
- myDevices Cayenne — IoT-платформа для мониторинга и управления (MQTT)
О проекте
Проект представляет собой дешёвое IoT-решение для мониторинга и управления двухосевым солнечным трекером. Система автоматически поворачивает фотоэлектрическую панель за солнцем с помощью четырёх фоторезисторов (LDR) или вручную — через дашборд веб-приложения. Все параметры (освещённость, напряжение/ток панели, температура, влажность) передаются в облако через Ethernet Shield и отображаются в реальном времени. Настроены уведомления (Email/SMS) при превышении пороговых значений.
Аппаратная часть
Структура системы
Солнечный трекер состоит из:
- ФЭ-панели (1,6 Вт, до 6 В)
- Двух сервоприводов 180°: левый-правый (MG996R, пин 5) — вертикальная ось (восток/запад), верх-низ (SG90, пин 6) — горизонтальная ось (юг/север)
- Четырёх LDR-сенсоров (GL5528) в углах панели, подключённых к аналоговым входам A0–A3 через делители напряжения (R = 330 Ом)
- Датчика DHT22 (пин 2, цифровой)
- Делителя напряжения для измерения тока/напряжения панели (два резистора 10 Ом, выход на A4)
- Светодиода на пине 3 — индикатор режима (авто/ручной)
- Arduino Mega 2560 + Ethernet Shield (W5100) для подключения к интернету через RJ45
Принцип работы датчиков
- LDR: сопротивление падает при увеличении освещённости. Выход делителя АЦП (10 бит) даёт значения 0–1023.
- DHT22: температурный диапазон –40…+80 °C (точность ±0,5 °C), влажность 0–100 % (±2 %). Один сигнальный провод.
- Напряжение/ток панели: измеряются через делитель на двух 10-Омовых резисторах, действующих также как нагрузка.
Программная архитектура
Два режима работы
- Автоматический: алгоритм сравнивает средние показания пар LDR (верх/низ, лево/право). Если разница превышает порог (±10), соответствующий сервопривод поворачивает панель на 2° до выравнивания освещённости. Это стабилизирует систему и снижает потребление сервоприводов.
- Ручной: пользователь задаёт углы сервоприводов через слайдеры в дашборде Cayenne.
Переключение режимов — кнопкой (виртуальный канал 8) в веб-интерфейсе. Состояние отражается на светодиоде (пин 3).
Взаимодействие с Cayenne (MQTT)
- Библиотека
CayenneMQTTEthernetустанавливает связь с облаком по учётным данным (username, password, client ID). - Функция
Cayenne.loop()вloop()обрабатывает входящие команды (CAYENNE_IN) и отправляет данные сенсоров (CAYENNE_OUT). - Виртуальные каналы (0–31) привязаны к виджетам дашборда: «Value» для сенсоров, «Button» для режима, «Slider» для сервоприводов.
Настройка дашборда Cayenne
- Создайте аккаунт на cayenne.mydevices.com.
- Выберите «Bring Your Own Things» → скопируйте MQTT-учётные данные в скетч.
- После загрузки кода и подключения устройство появится онлайн.
- Добавьте виджеты: настройки канала должны совпадать с кодом (см. функции
CAYENNE_IN/OUT). - Настройте алерты (Triggers) — например, уведомление по email при превышении температуры.
Прототип и результаты
Собранный прототип включает панель, закреплённую на сервоприводе вертикали с опорой (подшипником) для плавного вращения, и сервопривод горизонтали. LDR-сенсоры помещены в полые цилиндры: когда панель не перпендикулярна солнцу, хотя бы один сенсор оказывается в тени, создавая разность сигналов. Идеальная ориентация — равная освещённость всех четырёх LDR.
Полные результаты экспериментов описаны в статье: Springer Link.
Код прошивки (основные фрагменты)
/***************************************************************
* IoT based solar tracker system - embedded software
* Aboubakr El Hammoumi / aboubakr.elhammoumi@usmba.ac.ma
***************************************************************/
#define CAYENNE_PRINT Serial
#include
#include
#include
#define DHTTYPE DHT22
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE);
// MQTT credentials (замените на свои из дашборда Cayenne)
char username[] = "498d2d00-afe2-11ea-883c-638d8ce4c23d";
char password[] = "ab4a8f92d94033c01f6e18ce1d8a84d8c304c9c4";
char clientID[] = "17798a40-b968-11ea-93bf-d33a96695544";
Servo servo_x; // up-down (пин 5)
Servo servo_z; // left-right (пин 6)
int servoh = 0, servov = 0;
int servohLimitHigh = 170, servohLimitLow = 10;
int servovLimitHigh = 170, servovLimitLow = 10;
int topl, topr, botl, botr;
int threshold_value = 10;
float Vout;
void setup() {
Serial.begin(9600);
Cayenne.begin(username, password, clientID);
servo_x.attach(5);
servo_z.attach(6);
dht.begin();
pinMode(3, OUTPUT);
digitalWrite(3, LOW); // старт в ручном режиме
}
void loop() {
// Чтение LDR (A2-A5 в коде соответствуют A0-A3 схемы)
topr = analogRead(A2);
topl = analogRead(A3);
botl = analogRead(A4);
botr = analogRead(A5);
Vout = (analogRead(A1) * 5.0) / 1023.0;
Cayenne.loop(); // обработка MQTT
if (digitalRead(3) == HIGH) { // Автоматический режим
servoh = servo_x.read();
servov = servo_z.read();
int avgtop = (topr + topl) / 2;
int avgbot = (botr + botl) / 2;
int avgright = (topr + botr) / 2;
int avgleft = (topl + botl) / 2;
int diffhori = avgtop - avgbot; // вертикальная ось
int diffverti = avgleft - avgright; // горизонтальная ось
// Вертикальное слежение (servo_x, пин 5)
if (abs(diffhori) <= threshold_value) {
servo_x.write(servoh);
} else if (diffhori > threshold_value) {
servo_x.write(servoh - 2); // CW
if (servoh > servohLimitHigh) servoh = servohLimitHigh;
delay(10);
} else {
servo_x.write(servoh + 2); // CCW
if (servoh < servohLimitLow) servoh = servohLimitLow;
delay(10);
}
// Горизонтальное слежение (servo_z, пин 6)
if (abs(diffverti) <= threshold_value) {
servo_z.write(servov);
} else if (diffverti > threshold_value) {
servo_z.write(servov - 2); // CW
if (servov > servovLimitHigh) servov = servovLimitHigh;
delay(10);
} else {
servo_z.write(servov + 2); // CCW
if (servov < servovLimitLow) servov = servovLimitLow;
delay(10);
}
}
// В ручном режиме Cayenne.loop() просто обновляет виджеты
}
// --- Cayenne Callback Functions ---
// Переключатель режима (канал 8, пин 3)
CAYENNE_IN(8) {
int value = getValue.asInt();
digitalWrite(3, value);
}
// Сервопривод up-down (канал 7)
CAYENNE_IN(7) {
if (digitalRead(3) == LOW) { // только в ручном
servo_x.write(getValue.asDouble() * 180);
}
}
// Сервопривод left-right (канал 6)
CAYENNE_IN(6) {
if (digitalRead(3) == LOW) {
servo_z.write(getValue.asDouble() * 180);
}
}
// Отправка данных сенсоров в облако
CAYENNE_OUT(0) { Cayenne.virtualWrite(0, Vout / 10.0); } // Ток
CAYENNE_OUT(1) { Cayenne.virtualWrite(1, Vout * 2); } // Напряжение
CAYENNE_OUT(2) { Cayenne.virtualWrite(2, topr); } // LDR Top-Right
CAYENNE_OUT(3) { Cayenne.virtualWrite(3, topl); } // LDR Top-Left
CAYENNE_OUT(4) { Cayenne.virtualWrite(4, botl); } // LDR Bot-Left
CAYENNE_OUT(5) { Cayenne.virtualWrite(5, botr); } // LDR Bot-Right
CAYENNE_OUT(10) { Cayenne.virtualWrite(10, (Vout * 2 * Vout) / 10); } // Мощность
CAYENNE_OUT(11) { Cayenne.virtualWrite(11, dht.readTemperature(), TYPE_TEMPERATURE, UNIT_CELSIUS); }
CAYENNE_OUT(12) { Cayenne.virtualWrite(12, dht.readHumidity()); }
Схема подключения
Полная схема в формате PNG доступна в разделе Schematics проекта. Она отражает все соединения: LDR делители, DHT22, делитель напряжения панели, сервоприводы, Ethernet Shield и индикатор режима.
Заключение
Проект демонстрирует доступный способ внедрения IoT в возобновляемую энергетику. Двухосевой трекер с удалённым мониторингом и управлением через Cayenne позволяет повысить эффективность фотоэлектрической панели на 20–40 % по сравнению с неподвижной установкой, а система алертов обеспечивает оперативный контроль критических параметров.
Производственный процесс
- Что драйвит IoT практиков? Инсайты от индустриальных лидеров
- Блокчейн для Интернета вещей: разблокировка безопасного децентрализованного обмена данными
- Защита IoT-ландшафта: Ключевые угрозы и стратегические решения — Часть 2
- Будущее IoT-безопасности: экспертные стратегии для более безопасного подключенного мира
- Инвестиции в Интернет вещей: раскрытие роста и ценности
- Прослеживание истинной эволюции Интернета вещей
- IoT: освоение потока данных для бизнес-трансформации
- 5 ключевых вызовов, стоящих перед Интернетом вещей сегодня
- Индустриальный IoT для роста: выходя за рамки экономии затрат
- Солнечный трекер v2.0 — продвинутая DIY система слежения за солнцем