Dual-Achsen-Solartracker mit Auto- & Manual-Modus – Effizientes Sonnen-Tracking
Komponenten und Zubehör
| Arduino UNO | ×1 |
| Drehpotentiometer (generisch) | ×2 |
| LED (generisch) | ×2 |
| SparkFun Taster 12 mm | ×1 |
| Servos (Tower Pro MG996R) | ×2 |
| Fotowiderstand (LDR) | ×4 |
| 10-kΩ-Widerstand | ×5 |
| 221-Ω-Widerstand | ×2 |
Benötigte Werkzeuge und Maschinen
- Lötkolben (generisch)
Apps und Online-Dienste
- Autodesk Tinkercad
- Arduino IDE
Über dieses Projekt
Dies ist ein Projekt, das meine Schüler während des Abendclubs „Young Hackers“ 2017-2018 umgesetzt haben. Es ist ein anspruchsvolles Projekt für Grundschüler und hat uns viele Treffen gekostet, um es zu vollenden. Es enthält ein kleines 5V-Solarpanel, das sich in zwei Achsen drehen kann, um maximale Leistung aus der Sonne zu gewinnen. Das Projekt basiert auf dem „Dual Axis Solar Tracker Project“ von OpenSourceClassroom.
Wir wollten zwei Modi im Endprodukt implementieren:
- Ein manueller Modus – gesteuert durch zwei Potentiometer.
- Ein automatischer Modus – gesteuert durch vier Lichtsensoren (LDRs).
Um das zu erreichen, haben wir das Gerät so programmiert, dass es per Tastendruck und zwei Anzeige-LEDs zwischen den Modi wechselt. Im manuellen Modus leuchtet die rote LED, und wir können die Drehung des Panels in zwei Achsen mit den zwei Potentiometern steuern. Im automatischen Modus leuchtet die blaue LED, und die Drehung des Panels wird durch das von den vier LDRs gesammelte Licht bestimmt. Die Programmierung erfolgte in Tinkercad.
Die Schüler arbeiteten in Gruppen in einer Fertigungsstraßen-Manier, um die Aufgaben zu erledigen (Kabel löten, Kabel isolieren, Teile verschrauben etc.).

Code
Rotierendes Solarpanel-Code (Arduino)
Der finale Code des Dual-Achsen-Solarpanels:
#include <Servo.h>
// Variablen initialisieren
int mode = 0;
int buttonState = 0;
int prevButtonState = 0;
int topLeftLight = 0;
int topRightLight = 0;
int bottomLeftLight = 0;
int bottomRightLight = 0;
int LeftLight = 0;
int RightLight = 0;
int TopLight = 0;
int BottomLight = 0;
// Zwei Servos deklarieren
Servo servo_9;
Servo servo_10;
void setup() {
pinMode(7, INPUT); // Modus-Taster
pinMode(12, OUTPUT); // LED-Indikator für manuellen Modus
pinMode(11, OUTPUT); // LED-Indikator für Auto-Modus
pinMode(A0, INPUT); // Potentiometer für Rechts-Links-Bewegung
pinMode(A1, INPUT); // Potentiometer für Hoch-Runter-Bewegung
pinMode(A2, INPUT); // Lichtsensor oben-links
pinMode(A3, INPUT); // Lichtsensor oben-rechts
pinMode(A4, INPUT); // Lichtsensor unten-links
pinMode(A5, INPUT); // Lichtsensor unten-rechts
servo_9.attach(9); // Servomotor Rechts-Links-Bewegung
servo_10.attach(10); // Servomotor Hoch-Runter-Bewegung
}
void loop() {
buttonState = digitalRead(7);
if (buttonState != prevButtonState) {
if (buttonState == HIGH) {
// Modus wechseln und korrekte LED aktivieren
if (mode == 1) {
mode = 0;
digitalWrite(12, HIGH); // Rot an
digitalWrite(11, LOW); // Blau aus
} else {
mode = 1;
digitalWrite(11, HIGH); // Blau an
digitalWrite(12, LOW); // Rot aus
}
}
}
prevButtonState = buttonState;
delay(50); // 50 ms warten
if (mode == 0) {
// Manueller Modus: Potentiometer-Werte auf Drehwinkel mappen
servo_9.write(map(analogRead(A0), 0, 1023, 0, 180));
servo_10.write(map(analogRead(A1), 0, 1023, 0, 180));
} else {
// Auto-Modus: Sensorwerte auf 0-100 Lichtintensität mappen
// Jeder Lichtsensor hat unterschiedliche Empfindlichkeit und muss zuerst getestet werden
// für seine High- und Low-Werte
topLeftLight = map(analogRead(A2), 50, 980, 0, 100);
topRightLight = map(analogRead(A3), 200, 990, 0, 100);
bottomLeftLight = map(analogRead(A4), 170, 970, 0, 100);
bottomRightLight = map(analogRead(A5), 250, 1000, 0, 100);
// Durchschnittliche Lichtverhältnisse berechnen
TopLight = (topRightLight + topLeftLight) / 2;
BottomLight = (bottomRightLight + bottomLeftLight) / 2;
LeftLight = (topLeftLight + bottomLeftLight) / 2;
RightLight = (topRightLight + bottomRightLight) / 2;
// Servos drehen, falls nötig
if (abs(RightLight - LeftLight) > 4) {
// Position nur ändern, wenn Lichtdifferenz > 4%
if (RightLight < LeftLight) {
if (servo_9.read() < 180) { servo_9.write(servo_9.read() + 1); }
}
if (RightLight > LeftLight) {
if (servo_9.read() > 0) { servo_9.write(servo_9.read() - 1); }
}
}
if (abs(TopLight - BottomLight) > 4) {
// Position nur ändern, wenn Lichtdifferenz > 4%
if (TopLight < BottomLight) {
if (servo_10.read() < 180) { servo_10.write(servo_10.read() - 1); }
}
if (TopLight > BottomLight) {
if (servo_10.read() > 0) { servo_10.write(servo_10.read() + 1); }
}
}
}
}
Schaltplan
Verdrahtungsschema:

Herstellungsprozess
- DHT11 Temperatur- & Feuchtesensor mit LED-Anzeige & Piezo-Summer
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- Solar Tracker V2.0 – Fortgeschrittenes DIY-Solarnachführsystem
- IoT-Solartracker: Intelligentes Energiemanagement mit Arduino Mega
- 4x4x4 LED-Würfel mit Arduino Uno & 1Sheeld bauen – Interaktives LED-Projekt
- Hochgeschwindigkeits-Arduino-Drehzahlmesser (RPM) mit neuartigem Algorithmus
- Kupfer-Galvanik-Projekt: Intelligentes System mit Arduino UNO bauen
- Präzise Solareinstrahlungsmessung mit Arduino UNO & Ethernet Shield
- Präzise Solar-Nachführung mit Servo-Plattform für maximalen Energieertrag
- Solarmodul-Qualität: Kritische Kontrollpunkte für maximale Leistung