Es gibt ein Update zum meinem Waschmaschinenprojekt. Zur Erinnerung: Es ging darum, bei einer recht alten Waschmaschine eine Benachrichtigung am Handy zu bekommen, sobald der Waschvorgang beendet ist.
Die Spielerei hat anfangs recht gut funktioniert, im Laufe der Zeit jedoch immer schlechter. Meine Erklärung: Der Vibrationssensor hat der Belastung nicht standgehalten. Der erste Sensor ging wirklich kaputt, ein zweiter wurde auch laufend schlechter. Schlechter bedeutet, dass die Werte immer mehr streuten und daher das zeitliche Vibrationsprofil, über das der letzte Schleudervorgang und damit das Ende des Waschvorgangs detektiert wurde, immer verrauschter und uneindeutiger wurde. Es gab Fehlalarme.
3-Achsen-Beschleunigungssensor GY-61
Über ein anderes Bastelprojekt bin ich dann auf einen einfachen 3-Achsen-Beschleunigungssensor gestoßen, den GY-61. Der gibt an drei analogen Ausgängen einfach die Beschleunigung für drei orthogonale Achsen (x, y, z) aus. Im Prinzip so ein Teil, welches heute in jedem Smartphone z.B. die Bildschirmorientierung steuert. Gravitation ist ja auch nichts anderes als eine Beschleunigung; dreht man das Handy, dann wirkt diese Beschleunigung (zumindest anteilig) in eine andere Richtung.
Ich habe nun den alten Vibrationssensor durch den neuen Beschleunigungssensor ersetzt. Von den drei Achsen kann ich allerdings nur ein einzige nutzen, weil der Wemos D1 mini nur einen analogen Eingang bietet. Hier ein paar Bilder vom Umbau:
Die Werte, die der Sensor in den drei Schleuderphasen der Waschmaschine liefert sind um Welten besser als das, was der Vibrationssensor jemals geliefert hat. Hier der Plot eines typischen Waschvorgangs:
Die Werte werden für mich zur Kontrolle an meinen Raspberry Pi geschickt und mit Hilfe der Bibliothek dygraphs geplottet. Blau: Beschleunigung. Rot: Der Schwellwert. Gelb: Dauer über dem Schwellwert. Rot: Auslösen der Benachrichtigung.
Man sieht hier schön, dass der letzte Schleudergang stärker und vor allem länger ist als die ersten beiden. Seit dem Einbau des neuen Sensors wurde damit das Ende des Waschvorgangs hundertprozentig richtig erkannt. Weiterlesen →
Es wäre gelogen zu sagen, dass es bei unserer Waschmaschine dringenden Optimierungsbedarf gegeben hätte. Aber als Bastler sucht man ja immer nach einer möglichst sinnvollen Kanalisation des Basteltriebs. Daher hier die im Nachhinein zusammengelogene Motivation für das aktuelle Projekt:
Unsere Waschmaschine steht im Keller. Außerdem ist sie alt, fast 18 Jahre. Damals gab es noch kein „Ich bin fertig!“-Gepiepse. Also muss man nach dem Einschalten der Maschine in etwa abschätzen, wann sie fertig sein wird und sich am besten eine Erinnerung am Handy einstellen. Sonst könnte sich eine der folgenden dramatischen Szenen abspielen:
Die Maschine ist fertig und niemand räumt sie aus.
Die Maschine ist fertig und man räumt sie viel zu spät aus.
Die Maschine ist fertig und man merkt es zu spät, wodurch sich die nächste Maschine verzögert, deren Ende man wieder zu spät merkt, wodurch sich die näcshte Maschine… (das Prinzip ist klar).
Die Maschine ist fertig und irgend etwas anderes ganz schlimmes.
Wemos D1 mini
Da hat man als Bastler jetzt also einen Wemos D1 mini herumliegen (also einem Arduino-ähnlichen Mikrocontroller mit einem ESP8266-WLAN-Modul) und fragt sich, was man – bezüglich des oben geschilderten „Problems – sinnvolles damit machen könnte. Natürlich 1) irgendwie das Ende des Waschvorgangs detektieren und dann 2) irgendwie eine Nachricht absetzen, die dann wiederum irgend jemanden zum Ausräumen der Waschmaschine animieren soll.
Ich habe wieder ein bisschen mit Elektronik gebastelt. Allerdings war das aktuelle „Projekt“ nicht wirklich echt, es ging nicht um das Produkt, sondern nur um ein bisschen Spaß. Für die aktuelle Themenreihe der CityChurch sollten ein paar Videos gedreht werden, und die Videoleute fragten mich an, ob ich ich dafür nicht irgend eine Elektronik-Bastelei machen könnte.
Die Idee war dann, die Weihnachtsbaumbeleuchtung per WLAN vom Handy aus zu steuern. Einfach so zum Spaß. Ich hatte mir gerade das Wemos D1 mini etwas genauer angesehen und sagte zu. Sollte kein zu großes Problem sein, damit per WLAN ein Relais zu steuern, welches die Beleuchtung dann schaltet. Das Problem war dann aber, dass ich aufgrund der letzten Bastelei kein Relais mehr hatte und pfuschen improvisieren musste: Statt des Relais habe ich ein Servo verwendet, mit dem eine Art motorisierter Schalter gebaut wurde. Also auch eine Art Relais, nur nicht mit Magnetspule, sondern mit Servomotor. Dem Elektriker meines Vertrauens sei gesagt, dass die Konstruktion längst wieder zerlegt wurde und nie für den produktiven Einsatz gedacht war. Der Vollständigkeit halber: Don’t try this at home!
Hier also das Video. Schnitt und so ist nicht von mir, nur die Bastelei und ein bisschen Schauspielerei (nicht gerade meine Kernkompetenz).
Fazit: Das Wemos D1 mini kann ich nur empfehlen. Im Wesentlichen Arduino-kompatibel, man kann es mit der Arduino-IDE programmieren (eine simple Anleitung zur Installation des Boards findet man hier), WLAN ist an Bord, außerdem ein einfach zu bedienender Webserver. Die erste Demo (Steuerung einer LED per WLAN) war mit guter Anleitung in unter 15 Minuten auf dem Schreibtisch lauffähig und die Abwandlung zur Servo-Steuerung ein Klacks. Außerdem ist ein Klon des Boards mit 6,50€ wirklich erschwinglich.
Vom Prozedere her läuft das ganze so: Code schreiben, compilieren und auf’s Board schieben, aus dem seriellen Monitor der Arduino-IDE die IP des Boards holen, mit dem Browser die IP aufrufen und darüber das Board steuern. Wenn man das ganze (wie im Video gezeigt) etwas eleganter per Smartphone machen will empfiehlt sich eine App wie z.B. HTTP Request Widget, die für Android Widgets erstellen kann, die dann HTTP-Requests absetzen und somit die Steuerung ohne den „Umweg“ über den Browser übernehmen.
Der Vollständigkeit halber hier noch mein Code für das Projekt:
//http://www.esp8266learning.com/wemos-webserver-example.php
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <Servo.h>
const char* ssid = "deine WLAN-SSID";
const char* password = "dein WLAN-Passwort";
int servoPin = D4;
Servo Servo1;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
Servo1.attach(servoPin);
Servo1.write(0);
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected!");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.print("Use this URL : ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Match the request
int value = LOW;
if (request.indexOf("/servo=on") != -1) {
//digitalWrite(servoPin, HIGH);
Servo1.write(90);
value = HIGH;
}
if (request.indexOf("/servo=off") != -1){
//digitalWrite(servoPin, LOW);
Servo1.write(0);
value = LOW;
}
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("Servo position is now: ");
if(value == HIGH) {
client.print("ON");
} else {
client.print("OFF");
}
client.println("
");
if(value == HIGH) {
client.println("Click <a href=\"/servo=off\">to turn the servo in OFF position</a>
");
} else {
client.println("Click <a href=\"/servo=on\">to turn the servo in ON position</a>
");
}
client.println("</html>");
delay(1);
Serial.println("Client disconnected");
Serial.println("");
}