За последние десятилетия запасы ископаемого топлива на нашей планете существенно сократились, поэтому его доступность неуклонно снижается. В связи с этим растет внимание к возобновляемым источникам энергии. Солнечная энергия является одним из наиболее надежных вариантов, поскольку солнечный свет доступен в течение всего дня. Солнечные панели поглощают солнечное излучение и преобразуют его в электрическую энергию. Интенсивность и угол падения солнечного света на панели определяют количество вырабатываемой энергии.
![]()
Традиционные солнечные панели не могут полностью использовать солнечный свет в течение дня, поскольку они неподвижны. Для этого мы сначала создали одноосевой солнечный трекер, который отслеживает положение солнца вдоль одной оси, но для максимальной энергоэффективности целесообразно использовать двухосевую систему слежения за солнцем на базе Arduino, которая позволяет солнечной панели изменять положение как в горизонтальном, так и в вертикальном направлениях в зависимости от положения солнца. Этот проект двухосевого солнечного трекера на основе Arduino с использованием фоторезистора и сервомоторов может увеличить выработку энергии до 40% по сравнению со стационарными солнечными установками.
Также на нашем сайте вы можете посмотреть проект системы мониторинга солнечной энергии на основе ESP32.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Сервомотор sg90 - 2 шт. (купить на AliExpress).
- Солнечная панель (3-25 В) (купить на AliExpress).
- Фоторезистор (4 шт.).
- Резистор 10 кОм (4 шт.).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Внешний вид компонентов, необходимых для сборки этого проекта солнечного трекера, показан на следующем рисунке.
![]()
Как работает наш солнечный трекер
Система слежения за солнцем с двумя осями, или регулируемая солнечная панель, представляет собой автоматизированную систему, которая регулирует ориентацию солнечной панели по двум осям вращения: азимуту (горизонтальной) и углу места (вертикальной), позволяя ей следовать за положением солнца в течение светового дня. Система слежения за солнцем с двумя осями на базе Arduino использует фоторезисторы (LDR) для измерения интенсивности солнечного света и сервомоторы для физической регулировки угла наклона солнечной панели таким образом, чтобы она улавливала максимальное количество солнечного света от восхода до заката.
Схема проекта
Схема двухосевой системы слежения за солнцем на основе Arduino представлена на следующем рисунке.
Архитектура схемы этой двухкоординатной системы слежения за солнечной энергией построена на базе микроконтроллера Arduino UNO, который управляет двумя сервомоторами для горизонтального (азимутального) и вертикального (угла возвышения) вращения. Четыре фоторезистора (LDR) расположены крест-накрест для определения интенсивности света сверху, снизу, слева и справа. Каждый фоторезистор соединен с резистором 10 кОм, образуя делитель напряжения, что обеспечивает точные аналоговые показания. На основе света, обнаруженного каждым датчиком, Arduino вычисляет, где солнечный свет наиболее сильный, и соответствующим образом регулирует сервомоторы. Это позволяет поддерживать положение панели в самой яркой точке в течение всего дня, что делает систему двухкоординатной системы слежения за солнечной энергией эффективной.
Основные схемные особенности двухкоординатного солнечного трекера на базе Arduino:
- Размещение фоторезистора: перекрестная конфигурация для обнаружения света под любым углом.
- Резисторы делителя напряжения: резисторы 10 кОм, подключенные к каждому фоторезистору, обеспечивают достоверные показания.
- Сервоприводы управляются раздельно: серводвигатели, управляющие осями X и Y, управляются отдельно.
- Аналоговые входные контакты: аналоговые входные каналы A0-A3 используются для считывания показаний датчика LDR.
Схема подключений основных компонентов приведена в следующей таблице.
| Компонент | Контакты Arduino | Функция |
| LDR в верхнем левом углу | А0 | Обнаружение света в верхнем левом углу |
| LDR в правом верхнем углу | А3 | Обнаружение света в правом верхнем углу |
| LDR в нижнем левом углу | А1 | Обнаружение света в левом нижнем углу |
| LDR в нижнем правом углу | А2 | Обнаружение света в правом нижнем углу |
| Горизонтальный сервопривод | Digital Pin 2 | Управляет движением влево-вправо |
| Вертикальный сервопривод | Digital Pin 13 | Управляет движением вверх-вниз |
Внешний вид собранной конструкции проекта показан на следующем рисунке.
![]()
Процесс сборки двухкоординатной системы слежения за солнцем
Все механические компоненты, использованные для сборки двухкоординатного солнечного трекера на базе Arduino, были напечатаны на 3D-принтере, что обеспечило точное выравнивание и стабильное движение. 3D-модели, использованные в этом проекте, взяты из статьи, опубликованной по адресу:
https://simplecircuitslol.blogspot.com/2024/12/solar-tracking-system.html
На изображении ниже представлена 3D-модель компонентов, используемых в двухосевой системе слежения за солнцем на основе Arduino.
![]()
3D-модели были напечатаны с помощью 3D-принтера.

На следующем изображении показаны детали двухкоординатного солнечного трекера, напечатанные на 3D-принтере.
![]()
Объяснение кода программы
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Программа для этой двухкоординатной системы слежения за солнцем на базе Arduino управляет двумя сервомоторами, используя обратную связь от четырех фоторезисторов. Она непрерывно сравнивает уровни освещенности и вращает сервомоторы, чтобы направить панель в сторону наибольшей яркости. Когда уровень окружающего освещения становится слишком низким, например, ночью, система переходит в режим ожидания, чтобы предотвратить ненужные движения в этом двухкоординатном солнечном трекере на базе Arduino.
Инициализация сервопривода
Для управления горизонтальным и вертикальным движением вашего двухкоординатного солнечного трекера на базе Arduino определены два объекта сервоприводов. Их начальные углы и пределы перемещения установлены таким образом, чтобы предотвратить чрезмерное вращение.
|
1 2 |
Servo horizontal; Servo vertical; |
Датчики LDR
Четыре фоторезистора (LDR) расположены в верхнем левом, верхнем правом, нижнем левом и нижнем правом углах. Они определяют интенсивность света с каждого направления.
|
1 2 3 4 |
int ldrlt = A0; int ldrrt = A3; int ldrld = A1; int ldrrd = A2; |
Усреднение показаний датчиков
Эта функция считывает показания каждого фоторезистора несколько раз и усредняет результат. Это помогает уменьшить шум и колебания в показаниях датчика.
|
1 2 3 4 5 6 7 8 |
int readAverage(int pin) { long total = 0; for (int i = 0; i < 10; i++) { total += analogRead(pin); delay(2); } return total / 10; } |
Расчет разницы освещенности
Данный код вычисляет среднюю интенсивность света с верхней, нижней, левой и правой сторон, чтобы определить направление самого яркого источника света.
|
1 2 3 4 |
int avt = (lt + rt) / 2; int avd = (ld + rd) / 2; int avl = (lt + ld) / 2; int avr = (rt + rd) / 2; |
Логика регулировки сервопривода
Если разница между уровнями освещенности сверху и снизу или слева и справа превышает допустимый порог, сервоприводы слегка перемещаются, чтобы выровнять солнечную панель в сторону большей интенсивности света в двухкоординатной системе слежения за солнцем, использующей Arduino.
|
1 2 |
if (abs(dvert) > tol) { ... } if (abs(dhoriz) > tol) { ... } |
Ночной режим
При слишком низком уровне окружающего освещения (например, ночью) система приостанавливает отслеживание, чтобы сэкономить энергию и предотвратить ненужные движения.
|
1 2 3 |
if (avgLight < 200) { Serial.println("Low light detected — Tracker on standby..."); return;} |
Принцип работы двухосевой системы слежения за солнцем
Принцип работы двухосевой системы слежения за солнцем основан на постоянном сравнении интенсивности света от четырех фоторезисторов. Когда одна сторона получает больше солнечного света, чем другая, Arduino дает команду соответствующему сервомотору повернуть панель в этом направлении в данной двухосевой системе слежения за солнцем на базе Arduino. Горизонтальный сервомотор управляет позиционированием в направлении восток-запад, а вертикальный сервомотор регулирует наклон в направлении север-юг.
Эта непрерывная регулировка позволяет панели поддерживать наиболее благоприятное положение относительно солнца, значительно повышая эффективность сбора энергии по сравнению с фиксированными или одноосевыми системами. Процесс автоматизирован и корректируется в течение дня по мере изменения положения солнца.
Полная рабочая конфигурация системы слежения за солнцем с двумя осями на основе Arduino UNO представлена на следующем рисунке.
![]()
Алгоритм отслеживания для двухосевой системы слежения за солнцем с использованием Arduino:
∗ Измерение освещенности: все четыре датчика LDR одновременно измеряют интенсивность света.
∗ Обработка данных: Arduino усредняет показания и вычисляет разницу горизонтальной и вертикальной интенсивности света.
∗ Принятие решений: если разница интенсивностей света превышает допустимый предел, система определяет направление движения для оптимизации экспозиции.
∗ Сервопривод: горизонтальный сервопривод определяет относительное положение панели по направлению восток-запад, а вертикальный сервопривод изменяет наклон по направлению север-юг.
∗ Непрерывный мониторинг: этот процесс выполняется каждые несколько секунд в течение светового дня, чтобы солнечная панель всегда оптимально выравнивалась независимо от изменения интенсивности света.
Демонстрация работы проекта
Приведенная ниже анимация демонстрирует работу системы слежения за солнцем по двум осям в режиме реального времени. На рисунке ниже показано, как система слежения за солнцем по двум осям на базе Arduino реагирует на изменения направления света.
![]()
Система слежения за солнцем с двумя осями на основе Arduino активно реагирует на изменения направления света. Когда источник света перемещается влево, вправо, вверх или вниз, трекер мгновенно реагирует, поворачивая панель в соответствующем направлении, обеспечивая непрерывное выравнивание с самой яркой точкой.
Заключение
Система слежения за солнцем с двумя осями (Dual Axis Solar Tracking System) — это умное и эффективное достижение в области солнечных технологий, обеспечивающее постоянное положение солнечных панелей относительно солнца для оптимального поглощения энергии. По сравнению с фиксированными и одноосевыми трекерами, система значительно увеличивает выработку электроэнергии за счет интеллектуальной регулировки как по горизонтали, так и по вертикали с помощью сервоприводов и фоторезисторов, управляемых Arduino.
В данной статье мы рассмотрели как собрать систему слежения за солнцем с двумя осями на основе Arduino, которая автоматически отслеживает положение солнца в течение дня. Благодаря своей адаптивной конструкции, которая также повышает эффективность и способствует устойчивому использованию энергии, это полезный и креативный шаг к более чистому и надежному энергетическому будущему. Проект системы слежения за солнцем с двумя осями на базе Arduino с использованием фоторезисторов и сервомоторов демонстрирует, как доступные компоненты и интеллектуальные алгоритмы могут значительно повысить эффективность солнечных панелей.
Часто задаваемые вопросы о системе слежения за солнцем с двумя осями
⇥ 1. Почему двухосевой солнечный трекер лучше, чем стационарная панель?
Двухосевой трекер может следовать за солнцем как по горизонтали, так и по вертикали. Это позволяет панели оставаться обращенной к солнцу в течение всего дня, а значит, она улавливает больше солнечного света и генерирует больше энергии по сравнению со стационарной панелью или даже одноосевым трекером.
⇥ 2. Зачем в этом проекте используются четыре фоторезистора?
Использование четырех фоторезисторов позволяет системе определять солнечный свет со всех сторон — слева, справа, сверху и снизу. Затем Arduino использует эти показания для точной регулировки положения панели по обеим осям в режиме реального времени.
⇥ 3. Можно ли питать сервомоторы напрямую от Arduino?
Нет. Сервомоторам обычно требуется больший ток, чем может безопасно обеспечить Arduino. Использование отдельного источника питания 5 В обеспечивает бесперебойную работу сервомоторов и предотвращает повреждение платы.
⇥ 4. Что происходит при слабом солнечном свете или ночью?
Если света недостаточно, показания фоторезистора падают ниже определенного уровня, и трекер просто перестает двигаться. Это позволяет избежать лишнего потребления энергии и предотвратить износ сервоприводов.
⇥ 5. Нужен ли мне 3D-принтер для изготовления рамы?
Совсем нет. 3D-принтер может придать раме аккуратный вид, но это не обязательно. Вы можете использовать картон, ПВХ или акриловые листы — главное, чтобы рама была прочной и позволяла сервоприводам свободно перемещаться.
⇥ 6. Работает ли этот двухосевой солнечный трекер в облачную погоду?
Да, двухосевой солнечный трекер может отслеживать рассеянный солнечный свет в облачную погоду, если между двумя положениями датчиков существует достаточная разница в освещенности. Однако, если есть плотная, густая облачность, например, в день с равномерно низкой освещенностью, трекер может перейти в режим ожидания в ответ на крайне низкую освещенность и/или минимальную разницу в освещенности. Опять же, алгоритм усреднения учитывает колебания, которые могут возникнуть из-за облачности, и, таким образом, обеспечивает стабильную работу при отслеживании.
⇥ 7. Какие виды технического обслуживания требуются для двухосевого солнечного трекера?
К регулярным процедурам технического обслуживания двухосевого солнечного трекера относятся: очистка датчиков LDR (фоторезисторов) и поверхностей солнечных панелей, поскольку скопление пыли на датчиках и/или поверхности солнечных панелей может снижать точность определения освещенности; проверка соединений, установленных на палубе, на предмет отсутствия ослабленных контактов; контроль за обслуживанием сервомоторов; защита электронных компонентов от влаги с помощью влагозащищенных корпусов; а в некоторых случаях – повторная калибровка пороговых значений датчиков при снижении точности отслеживания.
Репозиторий GitHub
Посетите репозиторий GitHub, чтобы загрузить исходный код, внести изменения и без проблем развернуть проект.
Полный код проекта
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
#include <Servo.h> // ======== Servo Setup ======== Servo horizontal; // Horizontal Servo Motor Servo vertical; // Vertical Servo Motor int servohori = 180; // Initial horizontal angle int servovert = 45; // Initial vertical angle // Servo angle limits int servohoriLimitHigh = 175; int servohoriLimitLow = 5; int servovertLimitHigh = 100; int servovertLimitLow = 1; // ======== LDR Pins ======== int ldrlt = A0; // Top Left LDR int ldrrt = A3; // Top Right LDR int ldrld = A1; // Bottom Left LDR int ldrrd = A2; // Bottom Right LDR // ======== Function: Read Average LDR Value ======== int readAverage(int pin) { long total = 0; for (int i = 0; i < 10; i++) { total += analogRead(pin); delay(2); // small sampling delay for stable reading } return total / 10; } void setup() { Serial.begin(9600); Serial.println("====================================="); Serial.println("Dual Axis Solar Tracker System Started"); Serial.println("====================================="); horizontal.attach(2); // Horizontal servo pin vertical.attach(13); // Vertical servo pin horizontal.write(servohori); vertical.write(servovert); delay(2000); } void loop() { // ======== Read and Filter LDR Values ======== int lt = readAverage(ldrlt); // Top Left int rt = readAverage(ldrrt); // Top Right int ld = readAverage(ldrld); // Bottom Left int rd = readAverage(ldrrd); // Bottom Right // ======== Control Parameters ======== int tol = 40; // tolerance for movement (higher = less sensitive) int step = 2; // servo movement step int avgLight = (lt + rt + ld + rd) / 4; // ======== Ignore at Low Light (Night Mode) ======== if (avgLight < 200) { Serial.println("Low light detected — Tracker on standby..."); delay(500); return; } // ======== Compute Averages ======== int avt = (lt + rt) / 2; // average of top sensors int avd = (ld + rd) / 2; // average of bottom sensors int avl = (lt + ld) / 2; // average of left sensors int avr = (rt + rd) / 2; // average of right sensors // ======== Calculate Differences ======== int dvert = avt - avd; // vertical difference int dhoriz = avl - avr; // horizontal difference // ======== Vertical Adjustment ======== if (abs(dvert) > tol) { if (avt > avd) servovert += step; else servovert -= step; servovert = constrain(servovert, servovertLimitLow, servovertLimitHigh); vertical.write(servovert); } // ======== Horizontal Adjustment ======== if (abs(dhoriz) > tol) { if (avl > avr) servohori -= step; else servohori += step; servohori = constrain(servohori, servohoriLimitLow, servohoriLimitHigh); horizontal.write(servohori); } // ======== Debug Output ======== Serial.print("TL: "); Serial.print(lt); Serial.print(" TR: "); Serial.print(rt); Serial.print(" BL: "); Serial.print(ld); Serial.print(" BR: "); Serial.print(rd); Serial.print(" | dV: "); Serial.print(dvert); Serial.print(" dH: "); Serial.print(dhoriz); Serial.print(" | H: "); Serial.print(servohori); Serial.print("° V: "); Serial.println(servovert); // ======== Small Delay for Stability ======== delay(2); } |
46 просмотров



