Weil ich ein Projekt sehr interessant fand, habe ich es nach gebaut, um damit die Funktion eines Powerline Wlans (Terrasse) zu testen. Ich habe regelmäßig das Problem, dass das Wlan zwar vorhanden ist, aber keine Verbindung zum Internet besteht. Mit dieser Lösung kann ich mir nun anzeigen lassen, ob eine Verbindung besteht oder nicht.
Der Aufbau ist sehr überschaubar. Ich habe dazu mal wieder eine "customized Version" des Breakoutboards von joh.raspi genommen und den nächstbesten Micro-USB-Anschluss aufgelötet, der mir in die Finger fiel. Das ist nicht schön, aber es funktioniert. Auf der Unterseite erzeugt ein LDO die notwendigen 3,3V. Auf der Vorderseite ist ein ESP-12S direkt aufgelötet. Darauf habe ich mit doppelseitigem Klebeband eine kleine Platine geklebt, auf der eine 5050 RGB-LED sitzt. Die drei Farben wurden mit drei GPIO verbunden. Als Vorwiderstand habe ich lediglich 100 Ohm gewählt, damit die LED im Außenbereich noch hell genug leuchtet. Damit bin ich am Limit dessen, was der ESP pro GPIO liefern kann.
Den Sketch habe ich leicht abgewandelt und an meine Bedürfnisse angepasst.
[code=php]
/**
* WLAN Monitor mit ESP-12 Modul.
*
* Kontrolliert die Erreichbarkeit eines Internet Servers
* und zeigt den Status mit einer bunten LED an.
*
* Beim Start wird jede LED kurz getestet. Danach blinkt grün 3x kurz auf.
*
* Grün = Alles Ok
* Blau = Verbindung ist langsam
* Rot = Verbindung ist ausgefallen
* Aus = Keine Verbindung zum AP
*
* Ein leichtes Flackern der LED bestätigt, dass das Modul arbeitet.
*
* Die Schaltung ist ganz einfach:
* Das ESP-12 Modul wird auf der Platine angebracht und dann z. B. mit 5V versorgt.
* Die RGB-LED ist so angeschlossen:
*
* LED 3x 100 Ohm
* GND o---+---|<|---[===]-------o GPIO0 blau
* |
* +---|<|---[===]-------o GPIO4 rot
* |
* +---|<|---[===]---+---o GPIO5 grün
*
*
*/
#include <ESP8266WiFi.h>
// Name und Passwort des Access Points
#define SSID "wlan-von-hier"
#define PASSWORD "das-passwort"
// Webserver, dessen Erreichbarkeit getestet wird
#define HOST "heise.de"
#define PORT 80
// Wenn der Verbindungsaufbau länger dauert, geht die Anzeige auf blau.
#define MAX_CONNECT_MS 100
// Intervall für die Verbindungstests
#define INTERVAL_MS 10000
// Wird verwendet, um Verbindungen zu testen.
WiFiClient client;
/** Wird beim Start einmal ausgeführt */
void setup()
{
// Seriellen Port nicht verwenden
//Serial.end();
// LED's aus
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(0, OUTPUT);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
delay(200);
digitalWrite(4,HIGH);
delay(500);
digitalWrite(4,LOW);
delay(200);
digitalWrite(5,HIGH);
delay(500);
digitalWrite(5,LOW);
delay(200);
digitalWrite(5,HIGH);
delay(200);
digitalWrite(5,LOW);
delay(200);
digitalWrite(5,HIGH);
delay(200);
digitalWrite(5,LOW);
delay(200);
digitalWrite(5,HIGH);
delay(200);
digitalWrite(5,LOW);
delay(1000);
// WLAN Parameter setzen
WiFi.mode(WIFI_AP);
WiFi.begin(SSID, PASSWORD);
}
/** Hauptschleife, wird wiederholt ausgeführt. */
void loop()
{
// Sind wir mit dem AP verbunden?
if (WiFi.status()!=WL_CONNECTED)
{
led_rot();
delay(400);
led_aus();
}
else
{
// Verbinde mit einem Webserver und messe die Zeit
unsigned long start=millis();
if (client.connect(HOST, PORT))
{
unsigned long end=millis();
if (end-start > MAX_CONNECT_MS)
{
// Hat zu lange gedauert
led_aus();
delay(50);
led_blau();
}
else
{
// War schnell genug
led_aus();
delay(50);
led_gruen();
}
}
else
{
// Hat nicht geklappt, der Internet Zugang ist gestört
led_aus();
delay(50);
led_rot();
}
client.stop();
}
delay(INTERVAL_MS);
}
void led_aus()
{
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(0, LOW);
}
void led_gruen()
{
digitalWrite(5, HIGH);
digitalWrite(4, LOW);
digitalWrite(0, LOW);
}
void led_rot()
{
digitalWrite(5, LOW);
digitalWrite(4, HIGH);
digitalWrite(0, LOW);
}
void led_blau()
{
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(0, HIGH);
}
[/php]
Sollte jemand Interesse an der verlinkten Platine, dem Adapter, etc. haben, kann er sich gerne per PN melden.