Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

IoT-солнечный трекер на Arduino: умное управление энергией с мониторингом через Cayenne

Компоненты и материалы

Программное обеспечение и сервисы

О проекте

Проект представляет собой дешёвое IoT-решение для мониторинга и управления двухосевым солнечным трекером. Система автоматически поворачивает фотоэлектрическую панель за солнцем с помощью четырёх фоторезисторов (LDR) или вручную — через дашборд веб-приложения. Все параметры (освещённость, напряжение/ток панели, температура, влажность) передаются в облако через Ethernet Shield и отображаются в реальном времени. Настроены уведомления (Email/SMS) при превышении пороговых значений.

Аппаратная часть

Структура системы

Солнечный трекер состоит из:

Принцип работы датчиков

Программная архитектура

Два режима работы

  1. Автоматический: алгоритм сравнивает средние показания пар LDR (верх/низ, лево/право). Если разница превышает порог (±10), соответствующий сервопривод поворачивает панель на 2° до выравнивания освещённости. Это стабилизирует систему и снижает потребление сервоприводов.
  2. Ручной: пользователь задаёт углы сервоприводов через слайдеры в дашборде Cayenne.

Переключение режимов — кнопкой (виртуальный канал 8) в веб-интерфейсе. Состояние отражается на светодиоде (пин 3).

Взаимодействие с Cayenne (MQTT)

Настройка дашборда Cayenne

  1. Создайте аккаунт на cayenne.mydevices.com.
  2. Выберите «Bring Your Own Things» → скопируйте MQTT-учётные данные в скетч.
  3. После загрузки кода и подключения устройство появится онлайн.
  4. Добавьте виджеты: настройки канала должны совпадать с кодом (см. функции CAYENNE_IN/OUT).
  5. Настройте алерты (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 % по сравнению с неподвижной установкой, а система алертов обеспечивает оперативный контроль критических параметров.

Производственный процесс

  1. Что драйвит IoT практиков? Инсайты от индустриальных лидеров
  2. Блокчейн для Интернета вещей: разблокировка безопасного децентрализованного обмена данными
  3. Защита IoT-ландшафта: Ключевые угрозы и стратегические решения — Часть 2
  4. Будущее IoT-безопасности: экспертные стратегии для более безопасного подключенного мира
  5. Инвестиции в Интернет вещей: раскрытие роста и ценности
  6. Прослеживание истинной эволюции Интернета вещей
  7. IoT: освоение потока данных для бизнес-трансформации
  8. 5 ключевых вызовов, стоящих перед Интернетом вещей сегодня
  9. Индустриальный IoT для роста: выходя за рамки экономии затрат
  10. Солнечный трекер v2.0 — продвинутая DIY система слежения за солнцем