Im letzten Teil wurde bereits die Hardware, und insbesondere der Motor, um die Verdunkelung zu bewegen, installiert.
Die Steuerung des Motors und vor allem die Automatisierung lässt aber noch zu wünschen übrig.
In diesem Teil soll die Abdunklung automatisiert zur eingestellten Uhrzeit geschlossen beziehungsweise geöffnet werden.
Hardware
Zusätzlich zur Hardware aus dem Testaufbau aus dem letzten Teil benötigen Sie:
Gewindeschrauben (M3)
PCB spacer (M2)
Schmelzgewinde (M2 & M3)
Um den Aufbau langfristig betreiben zu können, empfiehlt es sich diesen auf einer Lochrasterplatine aufzubauen:

Abbildung 1: Verdrahtung auf der Lochrasterplatine
PCB größe: 3 x 7 cm
Überprüfen Sie, bevor Sie die Schaltung mit Strom versorgen, ob alle Verbindungen korrekt sind, und insbesondere die Stromversorgung auf Kurzschlüsse oder vertauschte Kabel.
D1 mini (GPIO) |
|
A4988: DIR |
22 |
A4988: STEP |
21 |
A4988: ENABLE |
18 |
Servo: Orange |
23 |
Button |
17 |
Tabelle 1: Verbindungsübersicht
Hinweis: Aufgrund des Layouts auf der Platine haben sich einige GPIOs geändert.
Software
1 Tastersteuerung
Mit dem Taster soll die Verdunkelung geschlossen oder geöffnet werden. Dazu kann ganz einfach der Code aus dem letzten Teil ergänzt werden.
#include "Arduino.h" #include <AccelStepper.h> #define dirPin 22 #define stepPin 21 #define stepsPerRevolution 200 //1.8° #define servoPin 23 #define enablePin 18 #define buttonPin 17 const int pwmChannelServo = 0; AccelStepper stepper = AccelStepper(AccelStepper::FULL2WIRE, dirPin, stepPin); const int numberOfTurns = -15; long targetPosition = stepsPerRevolution * numberOfTurns; void setServoAngle(int angle) { // Min Duty: ca. 1638 (0.5ms), Max Duty: ca. 8192 (2.5ms) bei 16 Bit int dutyMin = 1638; int dutyMax = 8192; int duty = map(angle, 0, 180, dutyMin, dutyMax); ledcWrite(pwmChannelServo, duty); } void setup() { Serial.begin(115200); ledcSetup(pwmChannelServo, 50, 16); ledcAttachPin(servoPin, pwmChannelServo); stepper.setMaxSpeed(500); stepper.setAcceleration(300); stepper.moveTo(0); pinMode(enablePin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); } void abrollen(long pos) { digitalWrite(22, LOW);//enable Motor setServoAngle(0); stepper.moveTo(pos); while (stepper.distanceToGo() != 0) { stepper.run(); } setServoAngle(80); digitalWrite(22, HIGH);//disable Motor } void loop() { if(!digitalRead(buttonPin)) { if (stepper.currentPosition() == targetPosition) { Serial.println("öffnen"); abrollen(0); // öffnen } else if (stepper.currentPosition() == 0) { Serial.println("schließen"); abrollen(targetPosition); // schließen } } } |
Den Code können Sie hier herunterladen.
Vom grundsätzlichen Aufbau hat sich das Programm im Vergleich zum ersten Teil nicht verändert.
Es wird im loop lediglich die Position des Motors abgefragt und dementsprechend die zugehörige Zielposition angesteuert.
Der Ablauf der Motoren, wie das Ansteuern des Servomotors, befindet sich jetzt sinngemäß in der abrollen Methode.
2 Zeitsteuerung
Um die aktuelle Uhrzeit über das Internet abzurufen, wird die Verbindung zu einem NTP-Server benötigt. Um das Auslesen der Uhrzeit möglichst einfach zu gestalten, wird eine externe Bibliothek benötigt.
Diese können Sie über den folgenden Link von GitHub als .zip heruntergeladen werden und in der Arduino IDE unter
Sketch > include Library > Add .zip Library …
ausgewählt und installiert werden.
Alternativ können Sie die NTPClient Library auch über die integrierte Bibliotheksverwaltung installieren.
Die folgende Methode regelt den Algorithmus für die Zeitsteuerung:
(Der folgende Code dient nur zur Erklärung, das gesamte Programm mit allen Variablen kann über den Link heruntergeladen werden.)
void timeControl() { timeClient.update(); //(1) /*Serial.print(timeClient.getHours()); Serial.print(":"); Serial.println(timeClient.getMinutes()); */ if(timeClient.getHours() == tOpen.tm_hour && timeClient.getMinutes() == |
Am Anfang der Methode wird zuerst die Uhrzeit über den NTP-Server aktualisiert(1). Danach folgt der Abgleich der aktuellen Uhrzeit mit den im Setup eingestellten Uhrzeiten (2). Falls es hier eine Übereinstimmung gibt, wird noch der Wert von timeControlTriggered abgefragt (3), über welchen ein dauerhaftes Wiederholen während derselben Uhrzeit verhindert wird, und die Motorposition abgeglichen. (4), So wird der Befehl nur ausgeführt, falls sich dieser noch nicht auf der Zielposition befindet.
Gibt es keine Übereinstimmung bei den Uhrzeiten wird der Wert von timeControlTriggered auf false zurückgesetzt (5).
Zur Fehlerbehebung kann in den oberen Zeilen die Uhrzeit ausgegeben werden, damit können zum Beispiel Probleme mit der Zeitzone ermittelt werden.
Die benötigten Variablen und Objekte befinden sich im finalen Programm, welches hier heruntergeladen werden kann. Die Tasterabfrage befindet sich in diesem Programm auch in einer eigenen Methode, um die Übersichtlichkeit des Programms zu verbessern.
Gehäuse
Um die fertige Schaltung auch an der Wand befestigen zu können, wird ein Gehäuse benötigt.
Zum Beispiel kann dieses hier heruntergeladen und ausgedruckt werden:
(.stl)
Sollten Sie andere Abmessungen benötigen, finden Sie hier auch die f3d Dateien, welche sich im CAD Programm Fusion 360 bearbeiten lassen:
(.f3d)
Nachdem das Gehäuse gedruckt ist, können Sie die Schmelzgewinde mit einem heißen Lötkolben in das Plastik drücken.
Um die Platine im Gehäuse zu befestigen, benötigen Sie die Schrauben (M2) aus dem Spacer Set.
Den Spannungswandler und den Deckel verschrauben Sie mit M3 Schrauben.

Abbildung 2: Fertiger Aufbau mit Gehäuse
Fazit
Da die Verdunkelung nach diesem Teil nun gesteuert werden kann und auch schon die erste Automatisierung in Form einer Zeitsteuerung eingebaut ist, ist die Verdunkelung bereits voll funktionsfähig.
Da die Verdunkelung aber, wie im letzten Teil angekündigt, auch noch Smart Home kompatibel werden soll, wird im nächsten Teil der Webserver und die MQTT Anbindung hinzugefügt.
Viel Spaß beim Nachbauen :)