Wollis Homepage
IoT

Tipps und Tricks
IoT
  Conrad IoT Adventskalender 2015
  CheerLights mit ESP-12E
  ESP-01 Adapter erweitern
  Conrad IoT Adventskalender 2018
Studienarbeiten
Privates
Suche
Startseite > IoT > Conrad IoT Adventskalender 2015

Conrad IoT Adventskalender 2015

Mein eigenes Arduino WLAN Board

Der Conrad IoT Adventskalender 2015 Adventskalender wird mit einem "Pretzelboard" ausgeliefert. Dieses Board ist die Kombination eine Arduino Nano mit einem ESP8266 (ESP-01) Board. Da ich dieses Board nicht zur Verfügung habe, beschließe ich dieses selber "nachzubauen". Folgende Boards finde ich, um mein Arduino WLAN Board zu erstellen:

  • ESP8266 (ESP-01)
  • Arduino Pro Mini, 3,3 Volt, 8 Mhz (mit AMS1117 3.3)
  • USB zu TTL Konverter CP-2102
Diese drei Teile zusammen zu bauen, war eine kleine Herausforderung. Da das ESP8266 Modul schon etwas über ein Jahr alt ist, hatte es noch eine sehr alte Firmware. Für die Firmware Aktualisierung habe ich das ESP-01 direkt mit dem CP-2102 verbunden. Diese habe ich durch die aktuellste Firmware ersetzt. Leider musste ich feststellen, dass mein ESP-01 Board einen 4Mbit Chip hat. Bei diesem kann kein OTA (over the air) Firmware Update durchgeführt werden. Das heißt, dass für ein Update der Firmware immer der ESP-01 direkt an den Seriellen Port angeschlossen werden muss, damit eine aktualisiert Firmware aufgespielt werden kann.

Die Boards habe ich wie folgt verdrahtet:

Schaltbild Arduino WLAN Board
Wenn man sich das Bild anschaut, fällt die zusätzliche 9V Batterie auf. Diese musste ich hinzufügen, da die Stromstärke die vom CP-2102 geliefert wurde zu gering war. Das WLAN Modul hat sich bei der Stromversorgung über das CP-2102 Modul andauernd neu gestartet. Die von mir gewählte Lösung sollte nur genommen werden, wenn der Arduino eine Spannung Regulator besitzt, der eine ausreichende Stromstärke liefert. Der von mir verwendete Arduino besitzt einen AMS1117 3.3. Laut Verkäufer kann der Arduino bis zu 800 mA liefern. (siehe BEEStore Arduino Pro Mini mit AMS1117 3.3) Den 3.3 Volt Arduino habe ich ausgewählt, da das ESP-01 Board maximal 3.3 Volt (auch auf den Datenleitungen) verträgt. Benutzt man einen 5 Volt Arduino, muss ein Level Shifter eingesetzt werden. Nachdem ich die Boards zusammen gesteckt hatte, musste ich feststellen, dass die Serielle Verbindung zum ESP-01 nicht funktionierte. Nach einiger Zeit bin ich darauf gekommen, dass die Übertragungsrate vom ESP-01 Modul auf 115200 Baud eingestellt war. Nachdem ich das ESP-01 Modul wieder direkt mit dem CP-2102 verbunden hatte, konnte ich mit dem Befehl:
AT+UART_DEF=19200,8,1,0,0
die Geschwindigkeit auf 19200 Baud reduzieren. ACHTUNG: Am 8. Dezember musste ich die Geschwindigkeit auf Grund von Problemen auf 9600 Baud reduzieren! Danach habe ich die Boards wieder zusammen gebaut und konnte das Beispiel für den 1. Dezember erfolgreich testen.

Foto Arduino WLAN Board
Nachteile meines eigenen Arduino WLAN Boards:
  • Arduino Pro Mini läuft mit 3,3 Volt anstatt 5 Volt
  • Arduino Pro Mini hat weniger nutzbare Ausgänge
  • Zu geringe Stromstärke bei der Versorgung über den USB Port daher zusätzliche Stromversorgung über 9 Volt Block Batterie
  • ESP-01 Modul besitzt, wie das "Pretzelboard" nur einen 4Mbit Speicherchip und ist somit nicht OTA Update fähig
  • Kontroll LEDs des original Boards fehlen
  • Board läuft nicht zuverlässig mit 19200 Baud, 9600 Baud funktionieren
  • 9 Volt Block NiMH Akku (150mAh) betreibt das Board nur ca. 45 bis 60 Minuten

1. Dezember

Das Programm vom 1. Dezember konnte ich problemlos ausführen.
1. Dezember

2. Dezember

Da ich am 1. Dezember
    AT+CWMODE=1
    AT+CWJAP="SSID","Passwort"
    

sind die Zugangsdaten für mein WLAN schon im ESP8266 gespeichert. Entsprechend habe ich folgenden Bereich aus dem Beispielcode für den 2. Dezember angepasst
//Connect to WLAN, long Timeout
esp8266.setTimeout(20000);
if (esp8266.find("CONNECTED")) {
  Serial.println("WLAN Connect OK");
}
else {
  Serial.println("WLAN Connect Error");
}

Die Ausgaben auf dem Serial Monitor haben gezeigt, dass das Programm erfolgreich durchlaufen wurde. An Pin D13 habe ich keine LED angeschlossen.
2. Dezember

3. Dezember

Auch das UDP Beispiel vom 3. Dezember konnte ich nach anfänglichen Schwierigkeiten erfolgreich ausführen.
3. Dezember
Die Probleme konnte ich beheben, indem ich in den erweiterten Netzwerkeinstellungen von Windows 10, für die "NanoESP" Verbindung folgenden Schalter aktivierte:
3. Dezember

4. Dezember

Das Beispiel vom 4. Dezember war ohne Problem nachzuvollziehen.
4. Dezember

5. Dezember

Da der von mir verbaute Arduino mit 3,3 Volt arbeitet und nicht wie das "Pretzelboard" mit 5 Volt, habe ich den verbauten Widerstand von 1 kΩ auf 560 Ω reduziert. Ansonsten hat auch das Beispiel vom 5. Dezember problemlos funktioniert und das Licht konnte ein und ausgeschaltet werden.

Als zusätzliche Herausforderung für den Tag habe ich versucht mit einem Android Smartphone die LED zu schalten. Dazu habe ich das Programm UDP Sender / Receiver aus den Google Play Store installiert. Nachdem ich die Ports im Programm von 90 und 91 auf 58880 und 58881 geändert habe, konnte ich nun auch mit dem Mobiltelefon die LED bedienen.
5. Dezember

6. Dezember

So langsam wird es interessanter. Heute wird ein Tastschalter verbaut. Wird gedrückt, wird eine UDP-Nachricht verschickt. Auch heute gab es wieder Probleme auf Grund des nachgebauten Boards. Durch eine andere Anordnung der Arduino Ein-/Ausgänge konnte ich den Schalter nicht so wie in der Vorlage anbringen. Aber nachdem ich den Widerstand und die LED versetzt hatte, konnte ich auch den Schalter unterbringen. Danach lief das Programm vom 6. Dezember problemlos.
6. Dezember

7. Dezember

Für den Versuchsaufbau am 7. Dezember fand ich in meiner Elektronik Kiste keinen 10 kΩ Poti. Daher habe ich für den Aufbau einen 50 kΩ Poti genommen.
7. Dezember
Langsam füllt sich mein Breadboard:
7. Dezember

8. Dezember

Nachdem bisher alles ohne größere Probleme funktioniert hat, musst ich am 8. Dezember leider ein Problem feststellen. Wie das folgenden Bild zeigt, wurden beim Abrufen der Web Seite Buchstaben verschluckt.
8. Dezember
Ich muss noch genauer untersuchen, warum das Problem auftritt.

Nach einer genaueren Untersuchung stellte ich fest, dass immer andere Buchstaben fehlten. Da ich irgenwo gelesen hatte, dass man den Software Serial mit 9600 Baud ansprechen soll, habe ich das mal ausprobiert.
Mit dem AT Befehl:
AT+UART_DEF=9600,8,1,0,0
habe ich die Geschwindigkeit des ESP-01 Boards auf 9600 Baud reduziert.
Bei den Codebeispielen muss ich nun die Zeilen
Serial.begin(19200);
esp8266.begin(19200);
durch
Serial.begin(9600);
esp8266.begin(9600);
ersetzen.

9. Dezember

Irgendwie ist jetzt der Wurm drin. Auch das Beispiel vom 9. Dezember hat nicht funktioniert. Die Uhrzeit fing immer bei 00:00:09 Uhr an zu zählen. Nachdem ich das Programm so umgeschrieben hatte, dass die Rückgabewerte von http://chronic.herokuapp.com/utc/in-one-hour ausgegeben wurden, habe ich gemerkt, dass teilweise Fehler zurückgegkommen sind, oder es ist gar nichts zurückgekommen. Im Programmcode habe ich nach der Zeile:
esp8266.println(getRequest);
einen Timeout (10 Sekunden) mit der Zeile:
esp8266.setTimeout(10000);
hinzugefügt. Danach lief der Abruf der Zeit stabil. Vermutlich gibt es Performanz Problem mit der Seite.
9. Dezember
Weitere Infos zum Abrufen der Zeit befinden sich auf der Seite http://chronic.herokuapp.com.

10. Dezember

Mein Board habe ich entsprechend der Anleitung aufgebaut. Die Widerstände habe ich auf Grund der geringeren Spannung von 1 kΩ auf 560 Ω reduziert. Das Programm vom 10. Dezember lief sofort problemlos und ich konnte feststellen, dass es in Essen gerade 4°C warm war. Die Lampe leuchtete kräftig grün mit einem leichten blauen schimmer. Einige Tests mit verschiedenen Temperaturen habe gezeigt, dass meine RGB LED nicht blickstabil ist. Auf der Seite, auf die ich geschaut hatte, dominierte immer das grüne Licht. Hat man von den anderen Seiten darauf geschaut, konnte man auch rot und blau erblicken. Wenn ich die LED mit der Digitalkamera fotografiert habe, wurden die Farben gemischt aufgenommen.
10. Dezember
Die RGB LED bei 4°C in Essen:
10. Dezember - 4°C in Essen

11. Dezember

Für den 11. Dezember habe ich die Widerstände und die RGB LED entfernt.
Das Programm lief mit der Anleitung wie beschrieben und ich konnte ein "Hallo" an den Chrome Browser schicken.
11. Dezember

12. Dezember

Das Programm für den 12. Dezember lief sofort. Über den Browser konnte ich nun die LED starten. Wenn man die URL häufiger aufruft, bekommt man gelegentlich eine Fehlermeldung auf dem Serial Monitor angezeigt und der Browser wartet bis er einen Timeout bekommt.

12. Dezember

Auf Grund der kurzen Akkulaufzeit habe ich meine Stromversorgung ein wenig umgebaut. Jetzt wird die Stromversorung über ein umgebautes USB Kabel sichergestellt. Dieses habe ich mit dem CP-2102 Board an einem passiven USB Hub angeschlossen. Die Stromversorgung musste ich durch einen parallel geschalteten Kondensator stabilisieren (2,2 uF).
Bei einem Stromverbrauch von ca. 100 mAh bei 5 Volt, sollte ich mir in den nächsten Tagen einmal die Möglichkeiten zum Strom sparen anschauen.

13. Dezember

Das Programm für den 13. Dezember zeigt im Browser eine HTML Oberfläche an, über die man die LED gezielt schalten kann.

14. Dezember

Das Programm für den 14. Dezember lief auch sofort. Einzig der Edge Browser von Microsoft scheint das Color Picker Element nicht zu unterstützen.

Bei dem heutigen Programm stellte sich nach jeder Farbauswahl die auf der HTML Seite angezeigte Farbe wieder auf schwarz. Ich habe das Programm so geändert, dass die HTML Seite die Farbe der LED als Vorauswahl anzeigt.
Folgende Änderungen habe ich an dem Programm vorgenommen: In dem HTML String habe ich value=\"#ABCDEF\" hinzugefügt. Denn Wert #ABCDEF ersetze ich später durch den ausgewählten RGB Farbwert.
const char site[] PROGMEM = {
"<HTML><HEAD>\n<link rel=\"icon\" href=\"data:;base64,iVBORw0KGgo=\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=2.0, user-scalable=yes\">\n<title>\nRGB LED\n</title>\n</HEAD>\n\n
<BODY bgcolor=\"#FFFF99\" text=\"#000000\">\n<FONT size=\"6\" FACE=\"Verdana\">\nSelect Color\n</FONT>\n\n<HR>\n<BR>\n<FONT size=\"3\" FACE=\"Verdana\">\nChange the Color<BR>\nof the RGB-LED\n
<BR>\n<BR>\n<form method=\"GET\">\n\t<input type=\"color\" value=\"#ABCDEF\" name=\"rgb\" onchange=\"this.form.submit()\"><BR>\n</form>\n<BR>\n<HR>\n\n</font>\n</HTML>\0"
};
Die hexstring Variabel musste ich etwas höher deklarieren und der Methode createWebsite habe ich einen String ("hexstring") übergeben.
void loop() {
  String xBuffer;
  if (esp8266.available()) // check if the esp is sending a message
  {
    if (esp8266.find("+IPD,"))
    {
      debug("Incomming Request");
      int connectionId = esp8266.parseInt();
      String hexstring;
      if (esp8266.findUntil("?rgb=", "\n"))
      {
        hexstring = esp8266.readStringUntil(' ');
        long number = (long) strtol( &hexstring[3], NULL, 16); 

        // Split them up into r, g, b values
        int r = number >> 16;
        int g = number >> 8 & 0xFF;
        int b = number & 0xFF;

        analogWrite(RED, r);
        analogWrite(GREEN, g);
        analogWrite(BLUE, b);
      }
      if (sendWebsite(connectionId, createWebsite(hexstring))) debug("Website send OK"); else debug("Website send Error");
    }
  }
}
Nach dem Abrufen der Webseite aus dem PROGMEM ersetze ich beim "hexstring" zuerst "%23" durch "#" (%23 ist die URL Codierung für #). Danach ersetze ich den String "#ABCDEF" durch den Wert der jetzt in "hexstring" steht. Dadurch wird die aktuell einstellte Farbe als Vorauswahl für den Color Picker gesetzt.
String createWebsite(String hexstring)
{
  String xBuffer;

  for (int i = 0; i <= sizeof(site); i++)
  {
    char myChar = pgm_read_byte_near(site + i);
    xBuffer += myChar;
  }
  hexstring.replace("%23","#");
  xBuffer.replace("#ABCDEF",hexstring);
  return xBuffer;
}

15. Dezember

Das Programm für den 15. Dezember verwendet einen Fototransistor. In meiner Komponentenkiste habe ich keinen gehabt und habe somit einen Fotowiderstand genommen. Als Widerstand zum teilen der Spannung habe ich ein 6,8 kΩ Widerstand verwendet.
Die Werte, die ich erhalten habe, lagen im Wertebereich von 0 (Dunkelheit) bis 980 (anleuchten mit einer hellen Taschenlampe).
15. Dezember

Geänderte Schaltung zum 15. Dezember

16. Dezember

Das Programm für den 16. Dezember bringt die beiden LEDs zum leuchten, die für diesen Tag angeschlossen werden müssen. Für mich war neu, dass die LEDs direkt zwischen zwei Digitale Ports über den Arduino angeschlossen werden können. Ich war bisher immer davon ausgegangen, dass ein Vorwiderstand benötigt wird.

17. Dezember

Für das Programm vom 17. Dezember hatte ich kein IR-Empfangsmodul.
Da die Projekte bis heute interessant waren, habe ich mich entschlossen, dieses Teil zu kaufen. Bei Conrad habe es für 1,19 € gekauft. Das IR-Empfangsmodul arbeitet auch mit 3,3 Volt, somit kann ich das Modul ohne Änderungen anschließen.

Nachdem ich die Software das erste Mal aufgespielt habe, kann ich die Codes meiner Samsung Fernbedienung auslesen. Nach dem Eintragen der Codes und dem erneuten Aufspielen, zeigen die LED und die Web Seite die jeweils gewählte Farbe an.

Die von mir ausgelesenen Codes:
#define irCom1 0xE0E0F00F      //MUTE
#define irCom2 0xE0E048B7      //Ch+
#define irCom3 0xE0E008F7      //Ch-
#define irCom4 0xE0E0D629      //CH List
#define irCom5 0xE0E0E01F      //Vol+
#define irCom6 0xE0E0D02F      //Vol-

18. Dezember

Der 18. Dezember ist der erste Tag,an dem ich größere Probleme mit meinem Versuchsaufbau habe. Nach einigen Analysen konnte ich feststellen, das die über "Bibliotheken verwalten" installiert IRremote Bibliothek aktueller ist, als die mitgelieferte Bibliothek. Die aktuellere Bibliothek unterstützt auch das Samsung Protokoll. Beim Empfang von Daten wird dieses Protokoll auf das Protokoll 7 gemappt. In dem Beispielprogramm wird dann dieses Protokoll auf das Panasonic Protokoll gemappt. Hier musste ich eine Änderung an dem Beispielprogramm vornehmen. Als IR-Diode habe ich eine aus einem Feuermelder ausgebaute Diode genommen. Meine Änderungen an dem Beispielprogramm:
...
//Pwr, Vol+, Vol-, Ch +, Ch -, Mute,
const long irCommand[6] = {0xE0E040BF, 0xE0E0E01F, 0xE0E0D02F, 0xE0E048B7, 0xE0E048B7, 0xE0E0F00F}; 
const int irProtocol = 7;  //SAMSUNG Format
const int irLen = 32;
...
   case 7:
      irsend.sendSAMSUNG(irCommand[irCom], irLen);
      delay(40);
      break;
...
Nach den Modifikationen kann ich jetzt meinen Monitor über einen Browser fern bedienen. Wobei die maximale Entfernung der IR-Diode zum Fernseher maximal einen Meter betragen darf. Wenn ich mir die IR-Diode beim Senden durch eine Digital Kamera anschaue und das mit der IR-Diode der Fernbedienung vergleiche, erkennt man, dass die Fernbedienung deutlich stärker leuchtet. Um den Versuchsaufbau zu optimieren, könnte man evtl. noch eine bessere IR-Diode verwenden und dann auch ggf. die Spannung und Stromstärke noch etwas erhöhen. Ich finde es spannend zu sehen, wie leicht man eine lernbare Fernbedienung bauen kann.

19. Dezember

An heutigen Tag, den 19. Dezember verlassen die Daten erstmalig das Heimnetz und werden in das Internet geschickt. Für die Datenaufnahme habe ich meinen Versuchsaufbau vom 15. Dezember genommen. Die Registrierung auf der Seite www.thingspeak.com verlief problemlos. Entsprechend der Anleitung habe ich einen Channel angelegt und den API Key in das Programm eingetragen. Danach lief alles und ich kann mit die Helligkeitswerte des Sensors im Internet anschauen.
19. Dezember

20. Dezember

Für den 20. Dezember habe ich eine LED an den Arduino digitalen Anschluss D9, mit einem 560 Ω Vorwiderstand angeschlossen. Das Programm des heutigen Tages brachte die LED zum leuchten. Ich finde es ein wenig schade, dass in dem Text zum Adventskalender nichts über die verwendete API steht. So muss ich mir die API später einmal genauer anschauen.

21. Dezember

Heute, am 21. Dezember wird eine Alarmanlage gebaut, die bei Auslösung auch gleichzeitig eine Twitter Mitteilung schickt.
Hat man das Programm nicht vor der ersten Ausführung mit Alarmauslösung modifiziert, hat man sich nur "geoutet". Unter dem Hashtag #NanoESP kann man nun die Nachrichten und User finden.

Für die Versuch musste ich etwas improvisieren. Ich hatte nur eine kleine Piezo Scheibe gefunden. Da meine Versuchsaufbau nur mit 3,3 Volt arbeitet und nicht mit 5 Volt, war der kleine Lautsprecher sehr leise. Erst als ich Ihn mit einer Wäscheklammer auf eine Plastikkarte befestigt hatte, konnte man einen deutlichen Alarmton hören.

Eine deutliche Steigerung der Lautstärke konnte ich noch durch die Nutzung der "toneAC" Bibliothek erreichen. Dazu muss der Piezo Lautsprecher mit den Pins D9 und D10 verbunden werden.
Folgende Änderungen am Programm habe ich vorgenommen: Import der vorher installierten Bibliothek:
#include <toneAC.h>
Anpassung der Tonausgabe:
void alarm(int value)
{
  debug("alarm!");
  sendTwitterPost(TwitterKEY, "Alarm! #NanoESP Value = " + String(value));
  while (analogRead(SENSOR) >= 500)
  {
    toneAC(400,10,500);
    delay(500);
    toneAC(800,10,500);
    delay(500);
  }
}

22. Dezember

Für den Aufbau am 22. Dezember musste ich etwas improvisieren, da meine Tastschalter ein wenig zu groß sind. Nach dem Aufbau habe ich das Programm, so wie es ausgeliefert wurde, nicht zum Laufen gebracht. Erst als ich die letzte Zeile der "loop" Methode von delay(50); in delay(500); geändert habe, lief das Programm. Ich vermute, dass eine Änderung auf delay(100); gereicht hätte, habe es aber nich ausprobiert. Dadurch, dass mein Arudino nur mit 8 Mhz betrieben wird und ich die serielle Übertragungsrate auf 9600 reduziert habe, ist die Verarbeitung der Daten wesentlich langsamer. Aus diesem Grund muss wahrscheinlich die Wartezeit erhöht werden.
22. Dezember

23. Dezember

Am 23. Dezember muss alles wieder wie am 10. Dezember umgebaut werden, es wird als die RGB LED angeschlossen. Das Programm was heute läuft ist sehr interessant. Über Twitter kann man einen Farbwunsch schicken und dieser Farbwunsch geht dann an alle "Teilnehmer". Der Farbwunsch bleibt, bis er von einer weiteren Twitter Nachricht mit einem neuen Farbwunsch ersetzt wird. Durch das Programm wird alle zehn Sekunden die Farbe aktualisiert.

24. Dezember

Am letzten Tag, den 24. Dezember, gibt es wieder einiges zum probieren. Die erste Herausforderung des Tages, lag in einem Fehler im Beispielprogramm. Ich habe entsprechend der Abbildung meine Schaltung aufgebaut, aber die LED wollte nicht leuchten. Nach kurzer Zeit habe ich festgestellt, das die Pin Definition im Source Code falsch war.
Die Pin Belegung im Code habe ich wie folgt korrigiert: #define RED 6 #define GREEN 4 #define BLUE 3 #define GND 5 Nach dieser Änderung leuchtete auch die LED.
Die weiteren beschriebenen Funktionen, die über Thingspeak konfiguriert wurden, funktionierten sofort. So konnte ich Zeitgesteuert Jingle Bells hören und wenn es über 30°C wurde, ging der Alarm los.

Fazit

Die 24 Versuche des Adventskalenders haben mir sehr gut gefallen, auch wenn an einigen Tagen nur sehr triviale Sachen gemacht wurden. Da ich nur die Anleitung des Adventskalenders benutzt habe, konnte ich die Versuche mit einem finanziellen Aufwand von ca. 3 € durchführen. WIe beschrieben hatte ich aber schon einen Arduino und eine ESP-01 Platine. Motiviert durch die Versuche werde ich in der nächsten Zeit weitere Projekte mit dem Arduino und dem ESP8266 probieren.
Bei einem Versuch Strom zu sparen, habe ich auf die 3.3 Volt Leitung direkt die 9 Volt von der Blockbatterie gegeben. Ich habe es erst durch den Geruch nach verbranntem bemerkt. Der Arduino hat dieses "Experiment" unbeschadet überstanden. Das ESP-01 Board war etwas empfindlicher. Es verbindet sich noch kurzzeitig mit dem Internet, aber der Stromverbrauch ist massiv gestiegen und die Chips auf der Platine werden kochend heiß, daher habe ich dieses Board als defekt entsorgt. Für meine eigenen Projekte habe ich mir jetzt folgende Boards direkt aus China über AliExpress bestellt:
  • ESP-01 (auf der Abbildung war ein ESP mit 8Mbit Speicher, somit sollte auch das aktualisieren über OTA funktionieren. (1,65 €)
  • ESP-201 Hier werden im Gegensatz zum ESP-01 alle Leitungen nach außen geführt. (2,52 €)
  • ESP-12E Als Developer Board mit RGB Led und Helligkeitssensor. (3,15 €)

(27.01.2016)

Druckversion
(C)1996-2019 Wolfgang Büning  >> Impressum