Солнечный трекер на Arduino: две оси, 4 фоторезистора и сервоприводы
Собираем солнечный трекер на Arduino: одна или две оси, 4 фоторезистора для поиска света, управление сервоприводами, мёртвая зона против дрожания и сравнение с неподвижной солнечной панелью.
Солнечный трекер на Arduino — это автоматический механизм, который весь день держит солнечную панель направленной на солнце: датчики определяют, откуда идёт свет, а мотор поворачивает панель в ту сторону. Типичная конструкция на Arduino использует четыре фоторезистора (LDR, светозависимый резистор) и два сервопривода. Фоторезисторы сообщают плате, с какой стороны светлее, а сервоприводы поворачивают панель туда. Неподвижная панель утром и вечером видит солнце сбоку и упускает значительную часть доступной энергии, а следящая панель в любое время дня ловит свет почти под прямым углом.
В этом руководстве ты шаг за шагом разберёшься, чем отличается слежение по одной и по двум осям, как с помощью 4 фоторезисторов вычисляется разница освещённости, как работает мёртвая зона (допуск), которая не даёт сервоприводу зря дрожать, и какая механическая конструкция держит панель. Кроме готового к компиляции кода для Arduino Uno, ESP32 и Raspberry Pi Pico, здесь есть эксперимент, который по-настоящему измеряет выигрыш в энергии, сравнивая следящую панель с неподвижной, а также список деталей и советы, как представить проект на научной выставке.

Что такое солнечный трекер и почему он повышает выработку?
Мощность, которую вырабатывает панель, зависит от угла, под которым свет падает на её поверхность. Когда свет падает перпендикулярно поверхности, панель ловит больше всего света; чем более косо он приходит, тем на большую площадь распределяется тот же пучок, и интенсивность, которую видит панель, уменьшается пропорционально косинусу угла падения. Поэтому свет, отклонённый на 60° от перпендикуляра, даёт лишь половину мощности света, падающего на панель прямо. Таблица ниже показывает эти потери. Если присмотреться к ней, видно и то, что небольшие ошибки почти ничего не стоят: панель, которая промахивается мимо солнца на 5°, теряет всего 0,4% мощности. Этот факт пригодится позже, при выборе мёртвой зоны.
| Угол падения (отклонение от перпендикуляра) | cos(угол) | Мощность, которую получает панель |
|---|---|---|
| 0° | 1,000 | 100% |
| 5° | 0,996 | 99,6% |
| 10° | 0,985 | 98,5% |
| 20° | 0,940 | 94% |
| 30° | 0,866 | 87% |
| 45° | 0,707 | 71% |
| 60° | 0,500 | 50% |
| 75° | 0,259 | 26% |
Положение солнца на небе описывают два угла: азимут, который показывает, в какой стороне горизонта оно находится, и высота (угол возвышения), которая показывает, насколько высоко оно над горизонтом. Земля поворачивается на 15° в час, поэтому солнце смещается по небу в среднем примерно на 1° каждые 4 минуты, а его высота сильно меняется в зависимости от времени года. На широте около 39° с. ш. (примерно как у Вашингтона, Лиссабона или центральной Турции) значения такие:
| Дата | Высота в полдень | Направление восхода | Направление заката | Продолжительность дня |
|---|---|---|---|---|
| 21 июня | Около 74° | Около 59° (северо-восток) | Около 301° (северо-запад) | Около 15 часов |
| 21 марта и 23 сентября | Около 51° | 90° (точно на восток) | 270° (точно на запад) | Около 12 часов |
| 21 декабря | Около 28° | Около 121° (юго-восток) | Около 239° (юго-запад) | Около 9,5 часа |
Азимут отсчитывается от севера по часовой стрелке. Из таблицы следуют два важных вывода. Летом солнце встаёт на северо-востоке и садится на северо-западе, то есть за день проходит около 240°; сервопривод, который поворачивается на 180°, не сможет полностью развернуться к солнцу в первые и последние часы светового дня, но потери невелики, потому что в это время солнце стоит низко и светит слабо. Зимой солнце остаётся низко даже в полдень, поэтому неподвижной панели, обращённой на юг, нужен свой наклон для каждого времени года. Трекер сам решает обе проблемы.
Одна ось или две?
| Характеристика | Одна ось | Две оси |
|---|---|---|
| Движение | Только восток–запад | Восток–запад плюс наклон (вверх–вниз) |
| Количество фоторезисторов | 2 | 4 |
| Количество сервоприводов | 1 | 2 |
| Выигрыш по сравнению с неподвижной панелью (большие системы) | Около 15–35% | Около 30–45% |
| Механика | Простая и прочная | Поворотный кронштейн pan-tilt, больше деталей |
| Код | Одна разница, одно решение | Две разницы, две оси одновременно |
| Лучше всего подходит для | Первой сборки, средней школы | Старшей школы, научных выставок, сравнения эффективности |
Одноосевой трекер следит только за движением солнца с востока на запад; его наклон фиксирован и выставлен под угол, подходящий для текущего сезона. Именно эта ось даёт основную часть выигрыша, потому что за день солнце сильнее всего смещается с востока на запад. Одноосевое слежение — самый распространённый вариант и на больших солнечных электростанциях; двухосевые системы собирают немного больше энергии, но стоят дороже и требуют больше обслуживания. А вот для школьного проекта две оси дают более впечатляющую демонстрацию и становятся отличной задачей, которая учит управлять двумя осями одновременно.
Измеряем разницу освещённости: 4 фоторезистора и теневая перегородка
Один фоторезистор сообщает только, насколько светло вокруг; чтобы найти направление, нужно сравнивать как минимум два фоторезистора. В двухосевом трекере четыре фоторезистора размещают квадратом 2×2, а между ними ставят непрозрачную крестообразную (+) перегородку — теневую перегородку. Когда датчик смотрит прямо на солнце, перегородка не отбрасывает тень ни на один фоторезистор, и все четыре видят одинаковый свет. Когда солнце смещается в сторону, перегородка затеняет фоторезисторы с противоположной стороны, и их показания падают. Высота перегородки задаёт чувствительность: перегородка высотой 3 см при отклонении 5° отбрасывает тень шириной около 2,6 мм (3 см × tan 5°), а этого хватает, чтобы закрыть половину фоторезистора диаметром 5 мм. Высокая перегородка даёт более чувствительный, но узконаправленный датчик, низкая — более грубый, но с широким углом обзора. Подробно о том, как работает фоторезистор, читай в статье Фоторезистор LDR: датчик освещённости.
- Среднее сверху: (верхний левый + верхний правый) / 2
- Среднее снизу: (нижний левый + нижний правый) / 2
- Среднее слева: (верхний левый + нижний левый) / 2
- Среднее справа: (верхний правый + нижний правый) / 2
- Вертикальная разница (dV): верх − низ. Если она положительна, панель должна наклониться вверх, если отрицательна — вниз.
- Горизонтальная разница (dH): лево − право. Если она положительна, панель должна повернуться влево, если отрицательна — вправо.
Слежение по датчикам или по часам?
Слежение по фоторезисторам — не единственный способ. Положение солнца можно заранее рассчитать по дате, времени и месту, поэтому некоторые системы вообще обходятся без датчика освещённости. Сравним три подхода:
| Метод | Как работает? | Плюсы | Минусы |
|---|---|---|---|
| По датчикам (фоторезисторы, замкнутый контур) | Измеряет разницу освещённости и поворачивается к более светлой стороне | Просто; не нужны координаты и время; сам исправляет механические погрешности | Нестабилен при облачности; на него влияют отражения и загрязнение датчиков |
| По часам (астрономический, разомкнутый контур) | Рассчитывает положение солнца по дате, времени и месту | Смотрит в нужную сторону даже в облачность; движение планируется заранее | Время, координаты и направление установки нужно задать точно; механические погрешности не замечает |
| Гибридный | Грубо наводится по расчёту, точно доводится по фоторезисторам | Сочетает сильные стороны обоих методов | Более сложный код и дополнительный модуль RTC |
В этом руководстве собираем вариант с датчиками: ему не нужны координаты и время, его легко настроить, и он сам исправляет механические погрешности. Если захочется развить проект, позже можно добавить слежение по часам с модулем RTC и сравнить два метода — это очень сильный дополнительный эксперимент перед жюри.
Список деталей
| Деталь | Кол-во | Примечание |
|---|---|---|
| Arduino Uno (или Nano) | 1 | Подойдут и ESP32 или Raspberry Pi Pico |
| Фоторезистор LDR (GL5528, 5 мм) | 4 | 2 для одной оси |
| Резистор 10 kΩ | 6 | 4 для делителей фоторезисторов, 2 для делителей панелей; на улице для фоторезисторов 1–2,2 kΩ |
| Резистор 22 kΩ | 2 | Делитель напряжения панели |
| Керамический (цементный) резистор 33 Ω, 5 W | 2 | По одному нагрузочному резистору на панель |
| Сервопривод SG90 или MG90S | 2 | 1 для одной оси; MG90S, если место ветреное |
| Поворотный кронштейн pan-tilt для сервоприводов | 1 | Готовый пластиковый набор или 3D-печать |
| Мини-солнечная панель 6 V 1 W (110×60 мм) | 2 | Одна следит за солнцем, другая — неподвижный эталон |
| Конденсатор 470 µF 16 V | 1 | Параллельно питанию сервоприводов |
| Адаптер 5 V 2 A или 4×AA аккумулятора (NiMH) | 1 | Внешнее питание для сервоприводов |
| Макетная плата и провода-перемычки | 1 комплект | Перфоплата для постоянной сборки |
| Картон, чёрная изолента или перегородка, напечатанная на 3D-принтере | 1 | Крестообразная теневая перегородка |




Схема подключения: Arduino Uno, ESP32 и Pico
Одна ножка каждого фоторезистора подключается к питанию (5V на Uno, 3V3 на ESP32 и Pico), другая — к аналоговому пину; от того же аналогового пина на GND идёт постоянный резистор. Так показание растёт с ростом освещённости. Со стороны панели к двум выводам каждой панели подключается нагрузочный резистор (33 Ω). Перед подачей на аналоговый пин напряжение панели делится на 3,2 делителем из 22 kΩ и 10 kΩ: 22 kΩ от плюсового вывода панели к аналоговому пину, 10 kΩ от аналогового пина к GND. Минусовой вывод панели тоже должен идти на GND платы; без общей земли измерение бессмысленно.
| Подключение | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| Фоторезистор верхний левый | A0 | GPIO 32 | GP26 (восточный фоторезистор при одной оси) |
| Фоторезистор верхний правый | A1 | GPIO 33 | GP27 (западный фоторезистор при одной оси) |
| Фоторезистор нижний левый | A2 | GPIO 34 | Нет (нужен внешний АЦП) |
| Фоторезистор нижний правый | A3 | GPIO 35 | Нет (нужен внешний АЦП) |
| Следящая панель (средняя точка делителя) | A4 | GPIO 36 (VP) | GP28 |
| Неподвижная панель (средняя точка делителя) | A5 | GPIO 39 (VN) | Нет |
| Сигнал горизонтального сервопривода | D9 | GPIO 18 | GP15 |
| Сигнал вертикального сервопривода | D10 | GPIO 19 | Нет (одна ось) |
| Питание делителей фоторезисторов | 5V | 3V3 | 3V3 |
| Питание сервоприводов | Внешнее 5 V | Внешнее 5 V | Внешнее 5 V |
| Все GND (включая минусы панелей) | GND | GND | GND |
Механика: кронштейн pan-tilt и баланс панели
Самое простое механическое решение — готовый кронштейн pan-tilt, в котором два сервопривода SG90 стоят друг над другом: нижний поворачивает панель по горизонтали (восток–запад), верхний наклоняет её по вертикали. Закрепи блок датчиков на краю панели так, чтобы его лицевая сторона была строго параллельна поверхности панели. Если датчик смотрит не туда же, куда панель, система будет идеально следить за солнцем, а панель всё время будет смотреть на несколько градусов в сторону. Мини-панель 6 V 1 W размером 110×60 мм весит около 22 г; на расстоянии 3 см от оси это примерно 0,07 кг·см момента — гораздо меньше, чем 1,8 кг·см у SG90. Настоящая нагрузка — ветер: если испытания идут на улице, отцентруй панель относительно оси сервопривода, используй MG90S с металлическими шестернями, а для панелей побольше переходи на мощный сервопривод вроде MG996R. Оставь у кабелей свободную петлю для поворота: натянутый кабель нагружает сервопривод и вырывает соединения. Основы работы с сервоприводами — в статье Что такое сервопривод?
Пошаговая сборка
- Припаяй четыре фоторезистора к кусочку перфоплаты квадратом 2×2 и приклей между ними крестообразную перегородку высотой 2–3 см из картона или напечатанную на 3D-принтере; покрась её в матовый чёрный цвет или обклей чёрной изолентой.
- Собери делитель для каждого фоторезистора: фоторезистор от питания к аналоговому пину, постоянный резистор от аналогового пина к GND.
- Установи сервоприводы в кронштейн pan-tilt, выставь оба на 90° и прикрути качалки (horn) в среднем положении.
- Закрепи панель и блок датчиков на верхнем кронштейне так, чтобы их лицевые стороны были параллельны.
- Собери схему измерения панели: нагрузочный резистор между выводами панели, делитель между плюсовым выводом панели и GND, среднюю точку — на A4.
- Подай на сервоприводы питание от внешнего источника 5 V, объедини все GND и подключи конденсатор 470 µF параллельно питанию сервоприводов.
- Сначала загрузи код калибровки, затем код слежения и проверь систему фонариком.
Шаг 1: проверь и откалибруй фоторезисторы
Даже фоторезисторы из одного пакета при одинаковом освещении дают заметно разные показания; в даташите GL5528 указан разброс от 10 до 20 kΩ при 10 лк. Неоткалиброванный датчик даже при наведении прямо на солнце считает одну сторону светлее и поворачивает панель на несколько градусов не туда. Загрузи код ниже, открой в меню «Инструменты» (Tools) Плоттер по последовательному соединению (Serial Plotter) и равномерно освети блок датчиков; например, лист белой бумаги, натянутый перед лампой, рассеивает и выравнивает свет.
1// 4 LDR'yi okuyup Seri Çizici'ye yazar / reads 4 LDRs for the Serial Plotter
2const int LDR[4] = {A0, A1, A2, A3}; // sol üst, sağ üst, sol alt, sağ alt / TL, TR, BL, BR
3
4void setup() {
5 Serial.begin(9600);
6}
7
8void loop() {
9 for (int i = 0; i < 4; i++) {
10 Serial.print(analogRead(LDR[i]));
11 Serial.print(i < 3 ? '\t' : '\n'); // sekmeyle ayır / separate with tabs
12 }
13 delay(100);
14}При одинаковом освещении четыре линии должны идти на одном уровне. Допустим, показания равны 612, 640, 598 и 625; среднее — 619. Поправка каждого фоторезистора — это среднее минус его собственное значение: +7, −21, +21 и −6. Эти числа вписываются в массив OFFSET в коде шага 3. Сопротивление фоторезистора меняется с освещённостью нелинейно, поэтому самый точный результат даёт калибровка при уровне освещённости, близком к тому, при котором система будет работать на самом деле. Плоттер показывает и шум: запиши, на сколько единиц гуляют показания, когда ничего не трогаешь, — это число понадобится при выборе мёртвой зоны.
Шаг 2: код одноосевого солнечного трекера
Сначала разберём логику на одной оси. Два фоторезистора, разделённые вертикальной теневой перегородкой, смотрят на восточную и западную стороны: A0 — восточный фоторезистор, A1 — западный. Код вычитает одно показание из другого; если разница больше мёртвой зоны, сервопривод поворачивается на 1° к более светлой стороне, иначе остаётся на месте. Этот короткий скетч — полноценная одноосевая система. Если панель уходит от света, поменяй местами angle++ и angle-- в двух условиях.
1#include <Servo.h>
2
3Servo servo;
4const int LDR_EAST = A0; // doğu tarafındaki LDR / east-side LDR
5const int LDR_WEST = A1; // batı tarafındaki LDR / west-side LDR
6const int TOL = 30; // ölü bölge (ADC birimi) / dead band (ADC counts)
7int angle = 90; // başlangıç: tam güney / start: due south
8
9void setup() {
10 servo.attach(9);
11 servo.write(angle);
12}
13
14void loop() {
15 int diff = analogRead(LDR_EAST) - analogRead(LDR_WEST);
16 if (diff > TOL && angle < 180) angle++; // doğu daha aydınlık / east is brighter
17 if (diff < -TOL && angle > 0) angle--; // batı daha aydınlık / west is brighter
18 servo.write(angle);
19 delay(30); // servo yetişsin / let the servo settle
20}С delay(30) сервопривод поворачивается не больше чем на 1° каждые 30 мс, то есть примерно на 33° в секунду, поэтому на демонстрации панель легко следует за фонариком. Солнце движется гораздо медленнее, так что в реальной работе достаточно корректировать положение раз в несколько секунд.
Шаг 3: двухосевой код, мёртвая зона и запись данных
Полная версия вычисляет две разницы по четырём фоторезисторам, корректирует каждую ось отдельно, с наступлением ночи паркует панель в положение для утра и раз в минуту выводит в монитор порта в формате CSV напряжение, мощность и собранную энергию обеих панелей. Код использует millis() вместо delay(), поэтому слежение и запись работают, не дожидаясь друг друга. Подробности этого приёма — в статье millis и delay.
1#include <Servo.h>
2
3// Pinler / Pins
4const int LDR[4] = {A0, A1, A2, A3}; // sol üst, sağ üst, sol alt, sağ alt / TL, TR, BL, BR
5const int PANEL_TRACK = A4; // takip eden panelin bölücüsü / tracking panel divider
6const int PANEL_FIXED = A5; // sabit panelin bölücüsü / fixed panel divider
7
8// Ayarlar / Settings
9const int OFFSET[4] = {0, 0, 0, 0}; // Adım 1'deki düzeltmeler / corrections from step 1
10const int TOL_START = 40; // fark bunu aşınca dön / start turning above this
11const int TOL_STOP = 15; // fark bunun altına inince dur / stop below this
12const int DIR_H = 1, DIR_V = 1; // ters dönüyorsa -1 yap / set to -1 if it turns away
13const int H_MIN = 0, H_MAX = 180; // yatay sınırlar / horizontal limits
14const int V_MIN = 10, V_MAX = 90; // dikey sınırlar / vertical limits
15const int H_PARK = 180, V_PARK = 45; // gece konumu: doğu (batıda bekliyorsa H_PARK = 0) / night position: east (0 if it waits facing west)
16const int NIGHT = 60; // ortalama bunun altındaysa gece / below this average = night
17const float DIVIDER = 3.2; // (22k + 10k) / 10k
18const float LOAD_OHM = 33.0; // yük direnci / load resistor
19const unsigned long LOG_MS = 60000; // kayıt aralığı: 1 dk / log interval: 1 min
20
21Servo servoH, servoV; // yatay ve dikey eksen / horizontal and vertical axis
22int angleH = 90, angleV = 45;
23bool movingH = false, movingV = false;
24unsigned long lastStep = 0, lastLog = 0, darkSince = 0;
25float mWhTrack = 0, mWhFixed = 0; // toplanan enerji / collected energy
26
27int readAvg(int pin) { // 8 okumanın ortalaması / average of 8 readings
28 long sum = 0;
29 for (int i = 0; i < 8; i++) sum += analogRead(pin);
30 return sum / 8;
31}
32
33// Ölü bölge + histerezis / dead band + hysteresis
34int correct(int diff, bool &moving, int angle, int dir, int lo, int hi) {
35 if (abs(diff) > TOL_START) moving = true;
36 if (abs(diff) < TOL_STOP) moving = false;
37 if (moving) angle += (diff > 0 ? 1 : -1) * dir;
38 return constrain(angle, lo, hi);
39}
40
41float panelVolts(int pin) { // bölücüden panel gerilimi / panel voltage from divider
42 return readAvg(pin) * 5.0 / 1023.0 * DIVIDER;
43}
44
45void setup() {
46 Serial.begin(9600);
47 servoH.attach(9);
48 servoV.attach(10);
49 servoH.write(angleH);
50 servoV.write(angleV);
51 Serial.println("dk,V_takip,V_sabit,mW_takip,mW_sabit,mWh_takip,mWh_sabit");
52}
53
54void loop() {
55 unsigned long now = millis();
56
57 if (now - lastStep >= 40) { // saniyede 25 düzeltme / 25 corrections per second
58 lastStep = now;
59 int v[4];
60 for (int i = 0; i < 4; i++) v[i] = readAvg(LDR[i]) + OFFSET[i];
61 int avg = (v[0] + v[1] + v[2] + v[3]) / 4;
62 int dV = (v[0] + v[1]) / 2 - (v[2] + v[3]) / 2; // üst - alt / top - bottom
63 int dH = (v[0] + v[2]) / 2 - (v[1] + v[3]) / 2; // sol - sağ / left - right
64
65 if (avg > NIGHT) {
66 darkSince = now;
67 angleV = correct(dV, movingV, angleV, DIR_V, V_MIN, V_MAX);
68 angleH = correct(dH, movingH, angleH, DIR_H, H_MIN, H_MAX);
69 } else if (now - darkSince > 600000UL) { // 10 dk karanlık / 10 min of darkness
70 angleH = H_PARK;
71 angleV = V_PARK;
72 }
73 servoH.write(angleH);
74 servoV.write(angleV);
75 }
76
77 if (now - lastLog >= LOG_MS) { // dakikada bir CSV satırı / one CSV line per minute
78 lastLog = now;
79 float vt = panelVolts(PANEL_TRACK), vf = panelVolts(PANEL_FIXED);
80 float pt = vt * vt / LOAD_OHM * 1000.0; // P = V² / R (mW)
81 float pf = vf * vf / LOAD_OHM * 1000.0;
82 mWhTrack += pt * LOG_MS / 3600000.0; // enerji = güç × süre / energy = power × time
83 mWhFixed += pf * LOG_MS / 3600000.0;
84 Serial.print(now / 60000); Serial.print(',');
85 Serial.print(vt, 2); Serial.print(',');
86 Serial.print(vf, 2); Serial.print(',');
87 Serial.print(pt, 1); Serial.print(',');
88 Serial.print(pf, 1); Serial.print(',');
89 Serial.print(mWhTrack, 1); Serial.print(',');
90 Serial.println(mWhFixed, 1);
91 }
92}| Параметр | Значение | Назначение |
|---|---|---|
| OFFSET | Поправки из шага 1 | Убирает производственный разброс между фоторезисторами |
| TOL_START / TOL_STOP | 40 / 15 | Мёртвая зона с гистерезисом: поворот начинается, когда разница больше 40, и прекращается, когда она меньше 15 |
| DIR_H / DIR_V | 1 или -1 | Меняет направление вращения под твою установку |
| V_MIN / V_MAX | 10 / 90 | Пределы вертикального сервопривода; не дают панели удариться о кронштейн |
| NIGHT | 60 | Если среднее четырёх фоторезисторов ниже этого значения, считается, что наступила ночь |
| H_PARK / V_PARK | 180 / 45 | Положение лицом на восток, в котором панель ждёт утра после 10 минут темноты; если она ждёт лицом на запад, поставь H_PARK в 0 |
| DIVIDER / LOAD_OHM | 3.2 / 33 | Чтобы вычислить напряжение панели и мощность по формуле P = V² / R |
| LOG_MS | 60000 | Интервал записи: одна строка в минуту |
Как убрать дрожание мёртвой зоной (допуском)
Без мёртвой зоны система никогда не успокаивается. Даже когда она смотрит прямо на солнце, показания фоторезисторов гуляют на несколько единиц из-за шума, разница скачет между плюсом и минусом, и сервопривод без конца шагает на 1° вправо, на 1° влево. Такое дрожание изнашивает шестерни сервопривода и впустую тратит энергию. Решение — игнорировать небольшие разницы: если разница меньше определённого порога, ничего не происходит. Для выбора порога используй шум, который был виден при калибровке, и сделай мёртвую зону как минимум в 3–4 раза больше шума. Если на Uno шум около ±5 единиц, хорошая отправная точка — 20–40.
Метод в коде идёт на шаг дальше: гистерезис. Сервопривод начинает двигаться, когда разница превышает 40, но не останавливается, пока она не опустится ниже 15. При мёртвой зоне с одним порогом панель останавливается на самой границе, и небольшое облачко или порыв ветра снова заставляют её двигаться; система с двумя порогами каждый раз как следует наводит панель на солнце и после этого успокаивается. Влияние мёртвой зоны на энергию тоже пренебрежимо мало: как показала таблица косинусов, ошибка в несколько градусов означает потери меньше 1%. Другие приёмы фильтрации — в статье фильтрация данных с датчиков.
Эксперимент на эффективность: следящая панель против неподвижной
Единственный способ доказать, что трекер работает, — измерить. Частая ошибка здесь — измерять только напряжение холостого хода панели. Напряжение панели без нагрузки почти не зависит от освещённости: когда свет ослабевает вдвое, ток тоже падает примерно вдвое, а напряжение холостого хода снижается всего на 3–5%. Поэтому обе панели показывают около 7 V, и разница пропадает. Правильный метод — подключить к каждой панели одинаковый нагрузочный резистор и измерять напряжение на нём. Мощность находится по формуле P = V² / R, а энергия — суммированием мощности по времени. Нагрузочный резистор подбирай под точку максимальной мощности панели: панель 6 V 1 W отдаёт около 1 / 6 = 0,17 A, значит, подходящий резистор — 6 / 0,17 ≈ 36 Ω; стандартный 33 Ω — хороший выбор. Резистор рассеивает в виде тепла почти 1 W, поэтому бери керамический резистор мощностью не меньше 2 W, а лучше 5 W. Проверить числа можно в калькуляторе закона Ома.
- Возьми две одинаковые панели: одной модели, в идеале из одной партии. Подключи к обеим нагрузочный резистор 33 Ω и делитель 22 kΩ / 10 kΩ; следящую панель — к A4, неподвижную — к A5.
- Проведи предварительный тест: установи обе панели рядом с одинаковым направлением и наклоном и измеряй 30–60 минут. Запиши разницу (например, 2%) и поправь на неё результаты. А ещё лучше — на второй день поменять панели местами.
- Направь неподвижную панель точно на юг и выставь её наклон под полуденное солнце этого дня (см. предупреждение ниже).
- Размести панели достаточно далеко друг от друга, чтобы ни одна не затеняла другую или датчик, в месте без тени от деревьев и стен.
- Один раз измерь напряжение панели мультиметром и сравни с показанием Arduino; если они расходятся, поправь значение DIVIDER (как пользоваться мультиметром).
- Записывай данные раз в минуту от восхода до заката и отмечай погоду (ясно, переменная облачность, пасмурно).
- Повтори эксперимент как минимум в три ясных дня, отдельно запиши один пасмурный день и сравни среднюю дневную энергию.
| Столбец | Значение |
|---|---|
| dk | Минуты с момента запуска Arduino |
| V_takip / V_sabit | Напряжение на нагрузочном резисторе следящей / неподвижной панели (V) |
| mW_takip / mW_sabit | Мгновенная мощность: V² / R × 1000 |
| mWh_takip / mWh_sabit | Энергия, собранная с начала записи |
| Выигрыш (%) | (mWh_takip − mWh_sabit) / mWh_sabit × 100; рассчитывается вручную в электронной таблице |
Данные можно скопировать из монитора порта и сохранить как файл CSV или передавать прямо в Excel (передача данных из Arduino в Excel); если не хочется сидеть рядом с компьютером, добавь модуль SD-карты. На графике ясного дня линия следящей панели утром и вечером идёт заметно выше, а около полудня две линии почти совпадают. Для больших систем сообщают о выигрыше в энергии примерно 15–35% при одноосевом и 30–45% при двухосевом слежении; на мини-установке результат сильно зависит от погоды, сезона и того, насколько хорошо сориентирована неподвижная панель. Чётко напиши в отчёте, что измеряется не собственный КПД панели, а прирост энергии, которую собирает та же панель. Добавь и одно ограничение: при постоянном нагрузочном резисторе мощность меняется пропорционально квадрату тока, поэтому при ослаблении света мощность панели падает быстрее, чем сам свет; из-за этого измеренный процентный выигрыш может оказаться выше, чем в реальной системе с контроллером заряда. Если ещё и просуммировать и сравнить токи двух панелей (V / R), будет видно, насколько на самом деле различается свет, попадающий на них.
Энергетический баланс: обеспечивает ли система себя энергией?
Это любимый вопрос жюри. Трекер даёт выигрыш в энергии, но и потребляет её. Для мини-модели приблизительные цифры такие:
| Позиция | Приблизительное значение | Энергия за сутки |
|---|---|---|
| Arduino Uno (всегда включена) | 45–50 mA, около 0,25 W при 5 V | Около 6 Wh (24 часа) |
| 2 × SG90 (в покое) | От нескольких mA до 10 mA на сервопривод | Около 1–2,5 Wh (24 часа) |
| SG90 (в движении) | 100–250 mA, кратковременно | Зависит от частоты коррекций, обычно немного |
| ESP32 (Wi-Fi включён) | В среднем 80–150 mA | Около 10–18 Wh (24 часа) |
| Мини-панель 6 V 1 W (ясный день) | Не больше 1 W | Около 3–5 Wh выработки |
Таблица всё ясно показывает: мини-модель не может выработать достаточно энергии, чтобы питать собственную электронику. Дополнительные примерно 1–1,5 Wh, полученные за счёт слежения, малы рядом с примерно 6 Wh, которые Uno расходует за сутки. Это не провал, а честный и ценный результат. С ростом масштаба картина переворачивается: потребление мотора и контроллера, которые поворачивают панели мощностью в киловатты, становится малой долей выработки. Чтобы снизить потребление мини-системы, корректируй положение раз в минуту, отпускай сервоприводы через detach(), когда они не движутся, и вместо Uno выбери Pro Mini, уходящую в сон, или ESP32 с глубоким сном (deep sleep). Чтобы оценить время работы от батареи, воспользуйся калькулятором времени работы батареи и статьёй mAh и Wh.
Солнечный трекер на ESP32 и наблюдение с телефона

ESP32 выполняет ту же логику с более точным АЦП и Wi-Fi. Есть несколько отличий, на которые стоит обратить внимание. Аналоговые показания лежат в диапазоне от 0 до 4095, поэтому мёртвая зона примерно в 4 раза больше, чем на Uno. При включённом Wi-Fi надёжно работают только пины ADC1 (GPIO 32–39), потому что пины ADC2 заняты драйвером Wi-Fi. Для сервоприводов установи библиотеку ESP32Servo через «Менеджер библиотек» (Library Manager). Функция analogReadMilliVolts(), которая используется для измерения напряжения панели, исправляет нелинейность АЦП ESP32 с помощью заводской калибровки. Делители фоторезисторов обязательно питай от 3V3. После загрузки открой IP-адрес, который показан в мониторе порта, на телефоне, подключённом к той же сети, — и увидишь текущее напряжение обеих панелей, собранную энергию и выигрыш. Если ESP32 для тебя в новинку, начни со статьи Что такое ESP32?
1#include <WiFi.h>
2#include <WebServer.h>
3#include <ESP32Servo.h>
4
5const char* ssid = "AgAdi"; // Wi-Fi adın / your Wi-Fi name
6const char* password = "Sifre123"; // Wi-Fi şifren / your Wi-Fi password
7
8const int LDR[4] = {32, 33, 34, 35}; // sol üst, sağ üst, sol alt, sağ alt (ADC1) / TL, TR, BL, BR (ADC1)
9const int PANEL_TRACK = 36; // VP: takip eden panel / tracking panel
10const int PANEL_FIXED = 39; // VN: sabit panel / fixed panel
11const int TOL_START = 160, TOL_STOP = 60; // 12 bit ölçek: Uno'nun 4 katı / 12-bit scale: 4x the Uno
12const int DIR_H = 1, DIR_V = 1; // ters dönüyorsa -1 yap / set to -1 if it turns away
13const int NIGHT = 240; // gece eşiği / night threshold
14const float DIVIDER = 3.2, LOAD_OHM = 33.0;
15
16Servo servoH, servoV;
17WebServer server(80);
18int angleH = 90, angleV = 45;
19bool movingH = false, movingV = false;
20unsigned long lastStep = 0, lastLog = 0;
21float vt = 0, vf = 0, mWhTrack = 0, mWhFixed = 0;
22
23int readAvg(int pin) {
24 long sum = 0;
25 for (int i = 0; i < 8; i++) sum += analogRead(pin);
26 return sum / 8;
27}
28
29float panelVolts(int pin) { // kalibre edilmiş mV okuması / calibrated mV reading
30 long mv = 0;
31 for (int i = 0; i < 8; i++) mv += analogReadMilliVolts(pin);
32 return mv / 8 / 1000.0 * DIVIDER;
33}
34
35int correct(int diff, bool &moving, int angle, int dir, int lo, int hi) {
36 if (abs(diff) > TOL_START) moving = true;
37 if (abs(diff) < TOL_STOP) moving = false;
38 if (moving) angle += (diff > 0 ? 1 : -1) * dir;
39 return constrain(angle, lo, hi);
40}
41
42void handleRoot() { // telefondan izleme sayfası / page for your phone
43 float gain = mWhFixed > 0 ? (mWhTrack - mWhFixed) / mWhFixed * 100.0 : 0;
44 String s = "Takip / tracking: " + String(vt, 2) + " V, " + String(mWhTrack, 1) + " mWh\n";
45 s += "Sabit / fixed: " + String(vf, 2) + " V, " + String(mWhFixed, 1) + " mWh\n";
46 s += "Kazanc / gain: %" + String(gain, 1) + "\n";
47 s += "Aci / angle: H " + String(angleH) + ", V " + String(angleV) + "\n";
48 server.send(200, "text/plain", s);
49}
50
51void setup() {
52 Serial.begin(115200);
53 servoH.setPeriodHertz(50); // standart servo: 50 Hz / standard servo: 50 Hz
54 servoV.setPeriodHertz(50);
55 servoH.attach(18, 500, 2400); // 500–2400 µs darbe / pulse
56 servoV.attach(19, 500, 2400);
57 servoH.write(angleH);
58 servoV.write(angleV);
59 WiFi.begin(ssid, password);
60 for (int i = 0; i < 40 && WiFi.status() != WL_CONNECTED; i++) delay(500); // en fazla 20 s bekle; Wi-Fi yoksa da takip eder / wait up to 20 s; tracks even without Wi-Fi
61 Serial.println(WiFi.localIP()); // bu adresi telefonda aç / open this address on your phone
62 server.on("/", handleRoot);
63 server.begin();
64}
65
66void loop() {
67 server.handleClient();
68 unsigned long now = millis();
69
70 if (now - lastStep >= 40) {
71 lastStep = now;
72 int v[4];
73 for (int i = 0; i < 4; i++) v[i] = readAvg(LDR[i]);
74 int avg = (v[0] + v[1] + v[2] + v[3]) / 4;
75 int dV = (v[0] + v[1]) / 2 - (v[2] + v[3]) / 2; // üst - alt / top - bottom
76 int dH = (v[0] + v[2]) / 2 - (v[1] + v[3]) / 2; // sol - sağ / left - right
77 if (avg > NIGHT) { // gece hareket etme / do not move at night
78 angleV = correct(dV, movingV, angleV, DIR_V, 10, 90);
79 angleH = correct(dH, movingH, angleH, DIR_H, 0, 180);
80 servoV.write(angleV);
81 servoH.write(angleH);
82 }
83 }
84
85 if (now - lastLog >= 60000) { // dakikada bir ölç / measure once a minute
86 lastLog = now;
87 vt = panelVolts(PANEL_TRACK);
88 vf = panelVolts(PANEL_FIXED);
89 mWhTrack += vt * vt / LOAD_OHM * 1000.0 / 60.0; // 1 dakikalık enerji (mWh) / energy of one minute
90 mWhFixed += vf * vf / LOAD_OHM * 1000.0 / 60.0;
91 Serial.printf("%.2f,%.2f,%.1f,%.1f\n", vt, vf, mWhTrack, mWhFixed);
92 }
93}Если хочется хранить измерения много дней, те же значения можно отправлять в онлайн-таблицу; см. статью запись данных ESP32 в Google Таблицы. Подробнее о разрешении АЦП и опорном напряжении — в статье АЦП и аналого-цифровое преобразование.
Одноосевое слежение на Raspberry Pi Pico и MicroPython

На Pico выведено только три аналоговых входа (GP26, GP27, GP28), а этого мало для четырёх фоторезисторов и двух панелей. Поэтому самое аккуратное решение на Pico — одноосевой трекер: два фоторезистора находят направление, а третий аналоговый вход измеряет напряжение панели. Для двух осей можно добавить внешний АЦП с интерфейсом I2C, например 4-канальный ADS1115. Сервопривод управляется напрямую сигналом PWM 50 Hz: импульс 500 µs означает 0°, импульс 2400 µs — 180°. Поскольку read_u16() возвращает значения в шкале 0–65535, мёртвая зона — большое число, например 2000. Как установить MicroPython на Pico, описано в статье Что такое Raspberry Pi Pico?
1from machine import Pin, PWM, ADC
2import time
3
4east = ADC(26) # GP26: doğu LDR'si / east LDR
5west = ADC(27) # GP27: batı LDR'si / west LDR
6panel = ADC(28) # GP28: panel bölücüsü / panel divider
7
8servo = PWM(Pin(15)) # GP15: servo sinyali / servo signal
9servo.freq(50) # 50 Hz = 20 ms periyot / period
10
11TOL = 2000 # ölü bölge (0–65535 ölçeği) / dead band (0–65535 scale)
12DIVIDER = 3.2 # (22k + 10k) / 10k
13LOAD = 33.0 # yük direnci (ohm) / load resistor (ohm)
14
15def set_angle(a):
16 # 0° = 500 µs, 180° = 2400 µs darbe / pulse
17 servo.duty_ns(int((500 + a * 1900 / 180) * 1000))
18
19def read(adc, n=8):
20 return sum(adc.read_u16() for _ in range(n)) // n
21
22angle = 90
23set_angle(angle)
24energy = 0.0 # mWh
25last_log = time.ticks_ms()
26
27while True:
28 diff = read(east) - read(west)
29 if diff > TOL and angle < 180:
30 angle += 1 # doğuya dön / turn east
31 elif diff < -TOL and angle > 0:
32 angle -= 1 # batıya dön / turn west
33 set_angle(angle)
34
35 if time.ticks_diff(time.ticks_ms(), last_log) >= 60000:
36 last_log = time.ticks_ms()
37 v = read(panel) * 3.3 / 65535 * DIVIDER
38 p = v * v / LOAD * 1000 # mW
39 energy += p / 60 # 1 dakikalık enerji / energy of one minute
40 with open("log.csv", "a") as f: # Pico'nun kendi belleğine yaz / write to Pico's flash
41 f.write("{},{:.2f},{:.1f},{:.1f}\n".format(angle, v, p, energy))
42 time.sleep_ms(30)Код дописывает измерения в файл log.csv во флеш-памяти самой Pico. Одна строка в минуту даёт 30–40 КБ в день, так что файловой системы Pico объёмом около 1,4 МБ хватает на недели. Если сохранить файл под именем main.py, Pico запустит программу автоматически, как только получит питание от батареи или USB-адаптера, без подключения к компьютеру. В конце дня можно скачать log.csv на компьютер через Thonny и открыть его в Excel.
Советы для презентации на научной выставке
Солнечный трекер — частый проект на научных выставках и школьных конкурсах; выделит твой проект не сама модель, а измеренные данные и то, как ты их истолкуешь. Идеи проектов и структуру отчёта смотри также в статье идеи проектов на Arduino для научных выставок.
- Задай измеримый вопрос: на сколько процентов больше энергии собирает двухосевое слежение в ясный осенний день по сравнению с такой же панелью, неподвижно установленной под лучшим углом на юг?
- Сначала запиши гипотезу: например, предположи, что выигрыш будет сосредоточен утром и вечером; даже если результат её не подтвердит, обсуждение причин приносит баллы.
- Раздели переменные: независимая переменная — способ слежения (нет, одна ось, две оси), зависимая — энергия за день (Wh), а контролируемые — модель панели, нагрузочный резистор, место и дата.
- Рассказывай графиками: линейный график «время–мощность» показывает обе панели друг над другом; дневную энергию сравни столбчатой диаграммой, а разброс от дня ко дню укажи как погрешность.
- Обсуди чистую энергию: измерь собственное потребление системы и помести таблицу энергетического баланса на постер; это показывает, что проект честный и научный.
- В выставочном зале нет солнца: живую демонстрацию проводи с фонариком или прожектором, а с собой возьми ускоренное видео (таймлапс) эксперимента на улице и исходный файл CSV.
- Выстрой структуру постера: проблема, метод, схема подключения, блок-схема кода, результаты, ограничения и предложения; в каждом разделе короткие предложения и крупные графики.
- Назови ограничения заранее: если упомянуть такие ограничения, как маленькая панель, данные всего за несколько дней, ветер и разброс фоторезисторов, ещё до вопроса жюри, это вызывает доверие.
| Вопрос, который может задать жюри | Ответ, который стоит подготовить |
|---|---|
| Почему фоторезисторы, а не слежение по часам? | Объясни, что слежение по часам работает и в облачность, но требует настройки координат и времени, а слежение по фоторезисторам легко настроить и оно исправляет собственные ошибки, но при облачности нестабильно. |
| Покрывает ли система энергию, которую потребляет? | Ответь таблицей энергетического баланса: в мини-системе нет, но с ростом масштаба потребление становится малой долей выработки. |
| Как сориентирована неподвижная панель? | Точно на юг, с лучшим наклоном для полуденного солнца этого дня; покажи, что разница между двумя панелями тоже измерялась в предварительном тесте. |
| Что происходит в облачный день? | Свет рассеянный, поэтому выигрыш падает почти до нуля; мёртвая зона не даёт панели зря двигаться. Покажи данные пасмурного дня. |
| Используются ли трекеры на настоящих электростанциях? | Да; на больших солнечных электростанциях одноосевое слежение распространено. Двухосевые системы дороже и требуют больше обслуживания. |
| Как удалось уменьшить погрешность измерений? | Расскажи про усреднение восьми показаний, калибровку по мультиметру, перестановку панелей местами и повторение эксперимента в течение нескольких дней. |
Частые ошибки и их решения
| Проблема | Вероятная причина | Решение |
|---|---|---|
| Панель отворачивается от света | Направление вращения сервопривода не совпадает с твоей установкой | Поставь DIR_H или DIR_V в -1 |
| Сервопривод дрожит влево-вправо | Слишком узкая мёртвая зона, шумные показания | Увеличь TOL_START и TOL_STOP, усредняй больше показаний |
| Панель останавливается чуть в стороне от солнца | Фоторезисторы не откалиброваны или датчик не параллелен панели | Откалибруй и выровняй блок датчиков по поверхности панели |
| Arduino перезагружается, когда двигается сервопривод | Сервоприводы питаются от пина 5V платы | Используй внешний источник 5 V, общий GND и конденсатор 470 µF |
| На солнце все четыре показания около 1000, разницы нет | Слишком большой постоянный резистор, показания в насыщении | На улице используй 1–2,2 kΩ и сделай теневую перегородку выше |
| Обе панели показывают 7 V, разницы не видно | Нет нагрузочного резистора, измеряется напряжение холостого хода | Подключи к каждой панели нагрузочный резистор 33 Ω |
| На ESP32 аналоговые показания портятся при запуске Wi-Fi | Фоторезисторы подключены к пинам ADC2 | Используй пины ADC1 от GPIO 32 до 39 |
| Вечером панель остаётся на западе, а утром поворачивается поздно | Ночное положение не соответствует твоей установке или порог NIGHT слишком низкий | Поставь H_PARK на восточный край своей установки (180 или 0); если ночное среднее выше NIGHT, подними порог |
| В облачную погоду панель беспорядочно блуждает | При рассеянном свете разница мала и нестабильна | Расширь мёртвую зону и останавливай движение при слабом свете, подняв порог NIGHT |
Идеи, как развить проект
- Солнечная зарядная станция: подключи следящую панель к модулю зарядки TP4056 и аккумулятору 18650 и сравни время зарядки с неподвижной панелью.
- Гибридное слежение: рассчитывай положение солнца с помощью модуля часов реального времени RTC, а фоторезисторы используй только для точной доводки; тогда панель смотрит в нужную сторону даже в облачные дни.
- Запись данных по Wi-Fi: отправляй измерения с ESP32 в Google Таблицы и смотри график в реальном времени на телефоне.
- Теплица на солнечной энергии: используй следящую панель для питания вентилятора и полива модели умной теплицы.
- Сканер света: сделай версию, в которой сервопривод проводит один фоторезистор от 0 до 180° и находит самое яркое направление; логика очень похожа на проект радара на Arduino.
- Более точное измерение мощности: в дополнение к нагрузочному резистору используй датчик мощности с интерфейсом I2C, например INA219, который измеряет ток и напряжение одновременно, и построй кривую мощности панели.
Солнечный трекер объединяет в одном проекте чтение датчиков, принятие решений, управление моторами и научные измерения, поэтому он отлично подходит и для учёбы, и для показа на конкурсе. Начни с одной оси, настрой мёртвую зону, затем добавь вторую ось и эксперимент с неподвижной панелью. В приложении BlueGrays есть проекты, на которых можно по отдельности опробовать каждую часть этой системы, например измерение освещённости фоторезистором, ночник, управление углом сервопривода и цифровой вольтметр, — со схемами подключения и кодом.
Частые вопросы
Насколько солнечный трекер повышает выработку?
В больших системах одноосевое слежение собирает примерно на 15–35% больше энергии, чем неподвижная панель, а двухосевое — примерно на 30–45% больше. Выигрыш наибольший в ясные дни, утром и вечером, когда солнце низко, а около полудня он близок к нулю. Чтобы узнать реальное значение для своей установки, измерь его в сравнении с такой же неподвижной панелью в тот же день.
Сколько фоторезисторов нужно солнечному трекеру?
Для одноосевого трекера достаточно двух фоторезисторов, для двухосевого — четырёх. Между ними стоит теневая перегородка; когда солнце смещается в сторону, перегородка затеняет фоторезисторы с противоположной стороны, и Arduino поворачивает панель в зависимости от разницы. Если взять больше фоторезисторов, точность заметно не вырастет.
Какой солнечный трекер собрать: одноосевой или двухосевой?
Если это первый проект, начни с одной оси: один сервопривод и два фоторезистора дают основную часть выигрыша при простой механике. Две оси собирают немного больше энергии и эффектнее смотрятся на научных выставках, но требуют кронштейна pan-tilt и совместной настройки двух осей.
Какой сервопривод выбрать для солнечного трекера?
Для лёгких мини-панелей вроде модели 6 V 1 W хватит SG90; на улице при ветре надёжнее MG90S с металлическими шестернями. Для больших панелей от 5 W нужен сервопривод с высоким моментом вроде MG996R или мотор с редуктором. Всегда питай сервоприводы от внешнего источника 5 V и соединяй земли вместе.
Почему дрожит сервопривод в солнечном трекере?
Показания фоторезисторов из-за шума постоянно гуляют на несколько единиц; без мёртвой зоны (допуска) в коде сервопривод дёргается туда-сюда при каждой крошечной разнице. Мёртвая зона, которая игнорирует разницы ниже порога, или даже два отдельных порога для старта и остановки (гистерезис) убирают дрожание. Причиной может быть и слабое питание сервоприводов.
Может ли солнечный трекер обеспечивать себя энергией?
В виде мини-модели — нет: Arduino Uno расходует около 6 Wh в сутки, а панель 6 V 1 W в ясный день вырабатывает 3–5 Wh. А вот в больших системах мотор и контроллер потребляют лишь малую долю выработки. Этот расчёт в отчёте делает проект научно сильнее.
Что собрать после прочтения
Все проекты
Измерение освещённости с LDR
Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

Ночник на LDR
Маленький ночник, который сам включается, когда темнеет, и гаснет, когда наступает утро. Датчик освещённости измеряет, насколько светло в комнате, и Arduino включает светодиод, когда достаточно темно,

Измерение освещённости модулем LDR на ESP32
Наблюдение в мониторе порта в реальном времени за сырым значением ADC модуля LDR и относительным процентом освещённости, вычисленным по опорным значениям темноты и света. Этот процент — не измерение в люксах. Учит логике калибровки модуля. Идеально выполнить его перед проектом 10, потому что он нужен для определения порога.

Работа с сервоприводом
Рычаг маленького сервопривода по очереди поворачивается в три положения: до упора в начало, ровно на середину и до упора в конец, задерживаясь на каждой остановке на две секунды. Arduino сообщает мото

Сервопривод на ESP32 (управление потенциометром)
В этом проекте сервопривод SG90 управляется потенциометром. Угол сервопривода задаётся сопоставлением аналогового значения потенциометра с диапазоном 0–180 градусов. Библиотека ESP32Servo формирует сигналы сервопривода на подходящих выходных пинах GPIO у ESP32; этот проект использует GPIO 18. Это базовый способ управления для роборук, подвесов камер и механизмов автоматических дверей.

Цифровой вольтметр с LCD-дисплеем
Узнай, какое напряжение даёт батарейка или блок питания, с помощью измерителя, собранного своими руками. Делитель из двух резисторов понижает высокое напряжение до уровня, который может прочитать плат

Ночник на LDR с ESP32
Ночник, в котором светодиод сам загорается в темноте и гаснет на свету. Используется пин D0 (цифровой выход) модуля датчика LDR — порог темноты задаётся маленьким потенциометром на модуле, а выход HIGH/LOW формирует сам модуль. ESP32 просто читает этот сигнал через digitalRead(), код очень простой.
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

