Jaloezie met servo aansturing

Ik was al een tijdje van plan om mijn jaloezie met een servo open en dicht te doen.
Nu is het er eindelijk van gekomen.
Voor de aansturing gebruik ik eenĀ NodeMcu ESP2286 development board.
En de servo is een DS3120MG 270 graden versie.

Zo werkt de aansturing:

En zo is de servo aangesloten op de jaloezie as:

2018-01-06 16.25.26.jpg

2018-01-06 16.25.49.jpg

De software is geschreven in Arduno IDE.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <Servo.h>
#include <ArduinoOTA.h> // changes required for OTA

MDNSResponder mdns;
ESP8266WebServer server(80); //Web server object. Will be listening in port 80 (default for HTTP)

Servo myservo;
int servoPin = D2; //CHANGE TO WHATEVER PIN YOUR USING
int LED_HB = D0; // blue led on NodeMCU
int Angle_old = 0;
//int Angle_new = 0;
int pos = 90;
String Angle_newstr = “” ;
const byte BoardAdd = 1; // changes required for OTA

void setup() {

pinMode(LED_HB, OUTPUT); // initialize the digital pin as an output for the led.
Serial.begin(74880);
ArduinoOTA.handle(); // changes required for OTA
WiFi.begin(“ssid”, “password”); //Connect to the WiFi network

while (WiFi.status() != WL_CONNECTED) { //Wait for connection

delay(500);
Serial.println(“Waiting to connect…”);
}
char OTAName[50]; // changes required for OTA
sprintf(OTAName, “Arduino API Board:%02i”, BoardAdd ); // changes required for OTA
ArduinoOTA.setHostname(OTAName); // changes required for OTA
ArduinoOTA.onStart([]() { // changes required for OTA
Serial.println(“Start”); // changes required for OTA
}); // changes required for OTA
ArduinoOTA.onEnd([]() { // changes required for OTA
Serial.println(“\nEnd”); // changes required for OTA
}); // changes required for OTA
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { // changes required for OTA
Serial.printf(“Progress: %u%%\r”, (progress / (total / 100))); // changes required for OTA
}); // changes required for OTA
ArduinoOTA.onError([](ota_error_t error) { // changes required for OTA
Serial.printf(“Error[%u]: “, error); // changes required for OTA
if (error == OTA_AUTH_ERROR) Serial.println(“Auth Failed”); // changes required for OTA
else if (error == OTA_BEGIN_ERROR) Serial.println(“Begin Failed”); // changes required for OTA
else if (error == OTA_CONNECT_ERROR) Serial.println(“Connect Failed”); // changes required for OTA
else if (error == OTA_RECEIVE_ERROR) Serial.println(“Receive Failed”); // changes required for OTA
else if (error == OTA_END_ERROR) Serial.println(“End Failed”); // changes required for OTA
}); // changes required for OTA
ArduinoOTA.begin(); // changes required for OTA

if (MDNS.begin(“Blinds”)) { //Start mDNS
Serial.println(“MDNS started”);
}

Serial.print(“IP address: “);
Serial.println(WiFi.localIP()); //Print the local IP to access the server

server.on(“/Blind”, handleBlind); //Associate the handler function to the path
server.on(“/”, handleGuide); //Associate the handler function to the path

server.begin(); //Start the server
Serial.println(“Server listening”);
delay(50);
myservo.attach(servoPin); // energize servo
delay(50);
myservo.write(pos); // set blinds to 50%
delay(50);
myservo.detach();
Serial.println(“Servo klaar init”);
}
uint8_t hbval=128;
int8_t hbdelta=8;

void handleGuide() {

String message = “”;
message += “<h1>ESP8266 Servo control</h1>” ;
message += “<p>status: http://ip address/Blind</a></p>”;
message += “<p>set angle: http://ip address/Blind?Angle=xx</a></p>”;
message += “<p>angle can be off, on, or 0…100</a></p>”;
message += “<p>servoPin used = GPIO”;
message += servoPin ;
message += “</a></p>”;
server.send(200, “text/html”, message);
}

void handleBlind() {

String message = “”;
Angle_old = myservo.read(); // Angle of servo now
if (server.arg(“Angle”)== “”){ //Parameter not found
message = Angle_old; //stuur gemeten Angle waarde
}else{ //Parameter found
message += server.arg(“Angle”); //Gets the value of the query parameter
Angle_newstr = server.arg(“Angle”);
Serial.print(“Angle input “);
Serial.println(Angle_newstr);
if (Angle_newstr == “on”){
Angle_newstr =”100″;
Serial.print(“New Angle_newstr “);
Serial.println(Angle_newstr);
}
if (Angle_newstr == “off”) Angle_newstr =”0″;
Serial.print(“string Angle “);
Serial.println(Angle_newstr);
int Angle_new = Angle_newstr.toInt();
Angle_new = Angle_new * 180;
Angle_new = Angle_new / 100 ;
Serial.print(“New Angle “);
Serial.println(Angle_new);
if ( Angle_new >= Angle_old) { // hoek wordt groter
Serial.println(“Servo rechtsom”);
myservo.attach(servoPin); // energize servo
delay(50);
for (pos = Angle_old; pos <= Angle_new; pos += 1) { // goes from 0 degrees to 90 degrees in steps of 1 degree CHANGE 90 TO MATCH ANGLE OF TILT DESIRED
myservo.write(pos); // tell servo to go to position in variable ‘pos’
digitalWrite(LED_HB, 0);
delay(30); // waits 60ms between each degree to slow rotation speed
digitalWrite(LED_HB, 1);
delay(30);
}
delay(50);
myservo.detach(); // movement finished so detach servo to conserve power
Serial.println(“Servo klaar rechtsom”);
}
else if ( Angle_old >= Angle_new) { // hoek wordt kleiner
Serial.println(“Servo linksom”);
myservo.attach(servoPin); // energize servo
delay(50);
for (pos = Angle_old; pos >= Angle_new; pos -= 1) { // goes from 0 degrees to 90 degrees in steps of 1 degree CHANGE 90 TO MATCH ANGLE OF TILT DESIRED
myservo.write(pos); // tell servo to go to position in variable ‘pos’
digitalWrite(LED_HB, 1);
delay(30); // waits 60ms between each degree to slow rotation speed
digitalWrite(LED_HB, 0);
delay(30);
}
delay(50);
myservo.detach();
Serial.println(“Servo klaar linksom”);// movement finished so detach servo to conserve power
}

}

message = myservo.read();
message = message.toInt()*100 ;
message = message.toInt() / 180 ;

server.send(200, “text/html”, “<h1>” + message + “</h1>”); //Returns the HTTP response

}

void loop() {
if (hbval > 250) hbdelta = -hbdelta;
if (hbval < 1) hbdelta = -hbdelta;
hbval += hbdelta;
//Serial.println(hbval);
if (hbval > 1) digitalWrite(LED_HB, 1);
if (hbval < 1) digitalWrite(LED_HB, 0);
//analogWrite(LED_HB, hbval);
delay(20);
ArduinoOTA.handle();
server.handleClient(); //Handling of incoming requests

}

In Homeseer heb ik een dimbaar device aangemaakt voor de servo.
In events een event dat start als het device van waarde verandert:

Dit event start een script:

Public Sub Main(parms As Object)
Dim debug = 1
Dim P_url = “192.168.86.249”
Dim P_page = “/Blind?Angle=”
Dim Is_page
Dim z165 = hs.getdeviceref(“z165”)
Dim waarde = hs.devicevalue(z165)
If debug = 1 Then hs.writelog(“servo_2286”, waarde)
Is_page = hs.GetURL(P_URL, P_page & waarde, False, 80)
If debug = 1 Then hs.writelog(“servo_2286”, Is_page)
End Sub

De URL is de URL van de NodeMCU

z165 is de code voor het device:

Als het device van waarde verandert start het event die weer het script start en het script stuurt het commando naar de NodeMCU die vervolgens de servo in de juiste stand zet.

De servo is ook vanuit een webpagina aan te sturen.
Uitleg hierover staat op de homepage van de NodeMCU.

De LED op de NodeMCU knippert langzaam als de software draai.
En snel als de servo draait.

Het je vragen, laat dan een reactie achter.

 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.