Stimmungsbarometer Arduino mit ESP8266 DIY

In diesem Projekt wollte ich eine analoge Anzeige realisieren, die Daten aus dem Internet anzeigen kann. Ich wollte mich auch auf dem Gebiet des 3D-Zeichnens etwas weiterbilden und bin auf die Software Fusion 360 von Autodesk gestossen, die für den Hobbybereich kostenlos ist. Fusion 360 ist wirklich zu empfehlen. Ist sehr einfach zu bedienen und es gibt sehr viel Youtube Filme über die Software. Der erste Prototyp den ich auf unserem Laser geschnitten habe passte perfekt. Anschliessend habe ich noch einige Optimierungen am Gehäuse vorgenommen. Da ich das Gehäuse in 3D gezeichnet habe, konnte ich meine Optimierungen schnell in der Zeichnung umsetzen.

Probleme die zu lösen waren

Schrittmotor mit Referenzfahrt referenzieren über Endschalter

Mit dem Schrittmotor gab es zuerst das Problem zu lösen, dass nach dem Einschalten des ESP8266 die Position nicht bekannt ist. Damit man die Position bestimmen, kann muss mit dem Schrittmotor auf eine bekannte Position gefahren werden, z.B. auf einen Endschalter. Als Endschalter habe ich bei meinem Stimmungsbarometer einen Hall-Sensor eingesetzt. Ein Hall-Sensor reagiert auf ein Magnetfeld. Deshalb habe ich beim Zeiger des Stimmungsbarometers einen runden Neodym Magneten eingebaut, der beim Referenzieren des Schrittmotors über den Hallsensor fährt und den Zeiger da auf null Stellen kann. Ich hätte auch eine kleine Lichtschranke oder einen mechanischen Endschalter nehmen können, jedoch ist es schöner und einfach einen Magneten auf dem Zeiger zu befestigen. Da das Magnetfeld des Neodym Magneten durch das Sperrholz hindurchgeht, kann der Hall- Sensor hinter der Holzfront montiert werden.
Hall Sensor 44E938:

Schrittmotor 28BYJ-28 Stromverbrauch bei Stillstand Strom reduzieren

Beim Schrittmotor wird auch beim Stillstand zum Bestromen der Wicklungen ca. 250mA Strom verbraucht. Dies hat zur Folge, dass der Motor durch den ständigen Stromverbrauch Wärme erzeugt. In einem ersten Versuch habe ich nach dem Positionieren immer die Ausgänge auf dem Schrittmotor auf 0 gestellt (Kein Strom mehr auf den Wicklungen). Nachteil war hier im dauertest, dass der Motor Schritte verloren hat. Wenn ein Schrittmotor schritte verliert, driftet die Position weg. Das heisst, der Zeiger steht einmal nicht mehr auf der gewollten 0°-Position, sondern auf 8° oder mehr. 

Nach einigen Versuchen und Dauerläufen habe ich eine Lösung gefunden wie ich den Motor ausschalten kann, ohne Schritte zu verlieren. Damit ich keine Änderungen in der Library vornehmen musste, habe ich eine kleine Funktion zum Abschalten und Einschalten des Schrittmotors geschrieben. Sobald der Motor positioniert hatte, rufe ich die Funktion zum Abschalten auf, die zuerst die Zustände des Schrittmotor-Outputs speichert. Anschließend wird noch etwas gewartet bis die Ausgänge zum Ansteuern des Schrittmotors Treiber ULN2003 auf Low geschaltet werden. Kommt eine neue Positionierung des Schrittmotors, werden zuerst die zuletzt gesetzten Signale auf dem ULN2003 gesetzt, etwas gewartet, erst dann die neue Position angefahren. Mit diesem einfachen Workaround kann ich den Motor bei Stillstand auf der Position halten ohne Schritte zu verlieren.
Schrittmotor 28BYJ-48:

Thingspeak oder Blynk

Zum Ansteuern des Stimmungsbarometers wollte ich eine einfache Lösung mit dem Handy realisieren. Zuerst habe ich die Positionswerte mit dem ESP8266 von einem Thingspeak abgefragt und immer den Zeiger auf diese Position positioniert. Das hat super funktioniert. Jedoch ergab sich mit dem gratis Thingspeak Account das Problem, dass du Werte nur alle 15 Sekunden ändern kannst. Wegen dieser Zeitverzögerung ist Thingspeak für das Stimmungsbarometer nicht geeignet. Ich denke Thingspeak könnte Interessant sein, wenn wir einen Temperaturwert auf einem umgebauten Stimmungsbarometer mit Analoger Skala anzeigen möchten. 

Als alternative habe ich mich für Blynk entschieden, was folgende Vorteile mit sich bringt:

  • Handy APP kann in wenigen Minuten erstellt werden
  • Kein aufwändiges programmieren notwendig
  • Einfache Bedienung
  • Erstellte APP kann mit Freunden geteilt werden
  • Schnelle Reaktionszeiten von einigen ms
  • Eingeschränkte Gratis Version
  • App für Apple und Android vorhanden

Mehr Infos zu Blynk findet ihr unter folgendem Link:
http://www.blynk.cc/

Die Android APP könnt ihr unter folgendem Link Herunterladen:
https://play.google.com/store/apps/details?id=cc.blynk

Hier meine Fertige Android  APP zum Ansteuern des Stimmungsbarometer mit Blynk:

Damit Ihr ein bisschen mit meinen Stimmungsbarometer spielen könnt, gebe ich euch meinen QR Code zum Ansteuern einfach mit. Mit Blink APP QR Code Scannen:


Eigenbau Holz Gehäuse

Hier zeige ich euch in einigen Bildern, die Entstehung des Holzgehäuses, dass ich für dieses Arduino Projekt erstellt habe.

Download Link für Konstruktion des Gehäuse in Fusion 360

Die komplette Konstruktion könnt ihr euch unter folgendem Link herunterladen

http://a360.co/2nmHa7m

Fusion 360 Zeichnen des Holz Gehäuses für Laser Cutter

Das Gehäuse habe ich im 3D Zeichnungsprogramm Fusion 360 von Autodesk gezeichnet. Anschliessend müssen die Daten für den Laser Cutter als DXF auf dem Fusion 360 exportiert werden. Zum Exportieren ins DXF Format für den Laser, gibt es bereits ein Zusatzmodul "DXF4Laser", mit dem auch die Strahldicke des Lasers kompensiert werden kann. Dies ist wichtig ansonsten halten die Holzverzahnungen (Fingerzinken) nicht richtig ineinander. Wichtig war für mich auch, dass ich das Gehäuse auf der Rückseite des Stimmungsbarometers einfach demontieren kann. Dies ist wichtig um an der verbauten Elektronik Änderungen vorzunehmen oder wenn man ein anderes Arduino Programm auf den ESP8266 übertragen will. Daher ist die Rückseite mit demontierbaren Holzkeilen an die Frontseite montiert:

Konstruktionsansicht in Fusion 360:

Stimmungsbarometer fertig konstruiert und gerendert mit Fusion 360:

Stimmungsbarometer fertig konstruiert und gerendert mit Fusion 360:



Infos zu Fusion 360 findet ihr unter folgendem Link:
http://www.autodesk.de/products/fusion-360/overview

Produktion des Holzgehäuses auf unserem 40W Laser Cutter

Nachdem die DXF Files erzeugt waren, konnte es ans schneiden der Holzbretter gehen. Ich verwendete hier ein 4mm Sperrholz aus dem Bauhaus. Ihr könnt natürlich das Gehäuse auch per Hand ausschneiden oder uns Anfragen wir können auch Gehäuse nach deinen Wünschen herstellen.
Deckel für Rückseite vom Stimmungsbarometer:

Sperrholz Front für Stimmungsbarometer:

Sperrholz Rückseite zusammengestellt:


Hier das komplette Arduino Code Beispiel von diesem Projekt

Als Mikrocontroller habe ich für das Stimmungsbarometer einen ESP8266 verwendet den ich mit der Arduino IDE programmiert habe. Da wir wenige Pins brauchen eignet sich der WeMos D1 mini perfekt:

/*******************************************************************************************
 *******************************************************************************************
 **                                www.bastelgarage.ch                                    **
 ** Der Onlineshop mit Videoanleitungen und kompletten Bausätzen für Anfänger und Profis! **
 *******************************************************************************************
 *******************************************************************************************
 ** In diesem Projekt wollte ich eine Analoge Anzeige realisieren die Daten aus dem       **
 ** Internet anzeigen kann. Zum Positionieren des Zeigers verwende ich einen Schrittmotor **
 ** mit Getriebe den 28BYJ-48. Als Treiber setze ich den ULN2003 ein der auch sehr einfach**
 ** in der Handhabung ist. Damit der Zeiger beim einschalten referenziert werden kann habe**
 ** ich auf dem Zeiger einen Neodym Magneten montiert. Fährt der Zeiger also über den     **
 ** verbauten Hall Sensor wird die Home Position neu gesetzt. Als Mikrokontroller verwende**
 ** ich einen WeMos D1 mini ESP8266 NodeMcu Lua Board der sich einfach mit dem Internet   **
 ** verbinden kann.                                                                       **
 **                                                                                       **
 ** Verwendete Libraries:                                                                 **
 ** BlynkSimpleEsp8266: https://github.com/blynkkk/blynk-library                          **
 ** Stepper: https://github.com/rydepier/Arduino-and-ULN2003-Stepper-Motor-Driver         **
 ** Autor: Philippe Keller                                                                **
 ** Datum: Januar 2017                                                                    **
 ** Version: 1.0                                                                          **
 *******************************************************************************************
*/

/************************( Importieren der genutzten Bibliotheken )************************/
#include <StepperMotor.h>
#include <ESP8266WiFi.h>
#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp8266.h>

/********************( Definieren der Globale Variablen und Konstanten)********************/
//Blynk Key wird einem per Mail geschickt beim Eröffnen eines neuen Projektes:
char auth[] = "41ae0128734c43b395f2ce39850d441c";

int PosIndexBlynk = 0; // Variable zum Speichern der Anzufahrenden Position 1 bis 5

int myPos[] = {36, 108, 180, 252, 324}; // Zeiger Positionen in °

// Schrittmotor Geschwindigkeit je höher die Zahl desto Langsamer fährt der Motor 1=Schnell
int motorSpeed = 2;

int motorSteps = 4096;    // Motorschritte für 360°

int AktuellePos = 0;      // Hilfsvariable zum Speichern der Aktuellen Position
int SollPos = 0;          // Hilfsvariable zum Speichern der Soll Position

// Hilfsvariablen zum Abspeichern der bestromten Wicklungen beim Ausschalten
unsigned char IN1 = 0;
unsigned char IN2 = 0;
unsigned char IN3 = 0;
unsigned char IN4 = 0;

/************************************(Wifi Einstellungen)**********************************/
char ssid[] = "xxxx";               // Deine Wlan SSID (Name)
char pass[] = "xxxx";   // Dein Wlan Passwort

/***********************( Definieren der Objekte und initialisieren )***********************/
//Schrittmotor Anschlüsse GPIO Nummer für IN1, IN2, IN3, IN4
StepperMotor motor(14, 12, 13, 15);



/*****************************************( Setup )****************************************/
void setup() {

  //Pin D2 GPIO4 als Input definieren für Hall Sensor dient zum Referenzieren
  pinMode(D2, INPUT);

  // Blynk starten Falls keine Verbindung aufgebaut wir bleibt das Programm hier hängen!
  Blynk.begin(auth, ssid, pass);


  motor.setStepDuration(3); // Geschwindigkeit zum referenzieren reduzieren

  // Befindet sich der Magnet bereits auf dem Hallsensor wird hier zuerst weggefahren
  if (digitalRead(D2) == false) {
    while (digitalRead(D2) == false)
    {
      motor.step(-10);
    }
    motor.step(-100);
  }

  // Solange der Hallsensor keinen Magneten sieht wird der Zeiger gedreht
  while (digitalRead(D2) == true) {
    motor.step(10);
  }

  // Hier den Offset eintragen wieviel ° der Zeiger weg von der Position 0° ist
  AktuellePos = 9;

  // Die Funktion CheckPos vergleicht die Soll mit der Aktuellen Position und fährt sie an
  CheckPos();


}

/******************************( Blynk Funktion für Steuerung )****************************/
BLYNK_WRITE(V0)
{
  // Angewählte Stimmung
  PosIndexBlynk = param.asInt(); // Speichern des empfangenen Wertes von Blynk V0
  //1= Super Happy
  //2= Gut drauf
  //3= Geht so
  //4= Bääh!
  //5= Zornig
}

/*************************************(Hauptprogramm)**************************************/
void loop() {
  Blynk.run();

  // Überprüfen ob ein gültiger Wert der mit den Positionen übereinstimmt vorhanden ist
  if (myPos[PosIndexBlynk - 1] <= 360) {
    SollPos = myPos[PosIndexBlynk - 1]; // Wenn gültiger Wert neue SollPosition setzen
  }
  else {
    SollPos = myPos[0]; // Wenn ungültiger Wert SollPosition 0°
  }
  CheckPos();           // Funktion zum Anfahren der Position aufrufen
}

/*************************(Funktion zum Prüfen neuer Positonen)****************************/
void CheckPos()
{
  if (AktuellePos != SollPos) //Überprüfen ob neue Position
  {
    StepperOn();
    motor.setStepDuration(motorSpeed); //Geschwindigkeit Schrittmotor setzen
    int PosDiff = (SollPos - AktuellePos) * -1; //Ausrechnen wie viel ° gefahren werden muss
    motor.step(map(PosDiff, 0, 360, 0, motorSteps)); //Grad in Schritte umwandeln und Anfahren
    AktuellePos = SollPos; // Neue Aktuelle Position speichern
    StepperOff(); //Schrittmotor ausschalten
  }
}

/*************************(Funktion zum auschalten des Motores)****************************/
// Wenn der Schrittmotor nicht ausgeschalten wird verbraucht er zum bestromen
// der Wicklungen bis zu 250mA dies generiert sonst unnötige Wärme

void StepperOff()
{
  delay(100);     //Warten damit der Zeiger nicht die Position überschiesst
  StepperSave();  //Motor zustand Speichern

  digitalWrite(12, LOW); //Motorwicklungen ausschalten
  digitalWrite(13, LOW);
  digitalWrite(14, LOW);
  digitalWrite(15, LOW);
}

/************************(Funktion zum einschalten des Motores)****************************/
void StepperOn()
{
  digitalWrite(12, IN1); //Motorwicklungen letzter Zustand wiederherstellen
  digitalWrite(13, IN2);
  digitalWrite(14, IN3);
  digitalWrite(15, IN4);
  delay(100 );
}

/*************(Funktion zum Speichern der bestromten Wicklungen des Motores)***************/
void StepperSave()
{
  IN1 = digitalRead(12); //Zustand Lesen und Speichern
  IN2 = digitalRead(13);
  IN3 = digitalRead(14);
  IN4 = digitalRead(15);
}



Verbundene Suchwörter

Beispiel Referenzfahrt Lernen Tutorial Mechanik Arduino Beispiel Blynk Code Programm ESP8266 Hall Sensor Schrittmotor ULN2003 Fusion 360 Autodesk DIY K40 Laser Cutter Holz IoT

Kommentare

Hinweis: HTML ist nicht verfügbar!

Im Beitrag erwähnte Produkte

WeMos D1 mini ESP8266 NodeMcu Lua Board

WeMos D1 mini ESP8266 NodeMcu Lua Board

Dieser kleine Mikrocontroller ist sehr Leistungsstark und verfüg dabei noch über ein WLAN Funkmodul...

6,90CHF 7,50CHF

Stepper Motor Schrittmotor 5V 1/64 (28BYJ-48)

Stepper Motor Schrittmotor 5V 1/64 (28BYJ-48)

Dieser unipolare Schrittmotor eignet sich perfekt für kleine Bastelprojekte mit Motoren. Der Schritt..

5,50CHF

ULN2003 Stepper Motor Driver / Schrittmotor Treiber Modul

ULN2003 Stepper Motor Driver / Schrittmotor Treiber Modul

Dieses Schrittmotor Treiber Modul mit einem ULN2003 (Darlington-Transistoren) SMD Chip, passt perfek..

2,90CHF

Magnetisch Hall Sensor Modul

Magnetisch Hall Sensor Modul

Dieser kleine Hall Sensor detektiert, ob ein Magnetfeld vorhanden ist und schaltet sein Ausgang auf ..

3,50CHF

Jumperkabel Dupont Set 10cm 60 Stk.

Jumperkabel Dupont Set 10cm 60 Stk.

Dupont Kabel dienen zum schnellen verbinden von Bauteilen. In der Umgangssprache werden Dupont Kabel..

4,90CHF

Schrittmotor Set mit Motor und Treiber

Schrittmotor Set mit Motor und Treiber

Dieser unipolare Schrittmotor Set mit Treiber eignet sich perfekt für kleine Bastelprojekte mit Moto..

6,90CHF