Ampel als Wetterstation mit Arduino

original Fahrradampel als Arduino Wetterstaion

Ich habe als richtiger Leipziger natürlich mehrere Fahrräder. Darunter ein selbst aufgebautes Rennrad, und das hat selbstverständlich keine Schutzbleche, weil das einfach geiler aussieht 😃 Allerdings ist das unpraktisch, wenn es regnet. Und für diese Fälle habe ich noch ein oder zwei andere Fahrräder mit Schutzblechen. Nun muss ich aber jedes mal ganz umständlich auf mein iPhone gucken, wie das wetter denn heute wird, und ob und wenn ja wann es regnet. Das ist für mich am morgen einfach zu viel Input 😛 Und außerdem hatte ich schon gute Erfahrung mit der Open Weather Map Api gemacht. Deswegen will ich ein Gadget, bei dem ich auf einen Blick sehe, ob es auch nur die kleinste Menge regnen wird. Dafür erfinde ich mir eine Wetter-Ampel.

Material

Nun begab es sich so, dass ich vor einer langen Zeit mal in den Besitz einer richtigen Ampel gekommen bin. Ich hatte damit eigentlich mal vor, das alte Konfischild Projekt neu zu bauen, mit Google Kalender Verknüpfung usw. Aber dazu kam es nie. Und nein, die ist weder illegal abgeschraubt, noch für sündhafte Beträge bei Ebay gekauft. Ich hab einfach zweidrei Baustellenservice Firmen angeschrieben, ob die sowas haben. Ich wollte definitiv die kleinen Fahrradampeln, und selbst die sind schon groß wenn man die mal in der Hand hält. Die Unternehmen hatten leider nix davon rumliegen. Sie haben mir aber den Tip gegeben, vielleicht mal beim Tiefbauamt zu fragen. Das hab ich dann auch gemacht. Dort wurde ich paarmal weitergereicht, hatte ein Telefonat und dann stand ich im Keller vom leipziger Tiefbauamt bei einem sehr netten Kollegen. Er hatte zwei alte Fahrradverkehrsampeln aus Leipzig für mich, wovon ich mir eine aussuchen durfte 😃

originale Fahrradampel aus Leipzig

Dazu kommt noch ein wenig Kleinzeugs. Es gab schon eine Vorgängerversion dieser Ampel. Die erste hatte ich mit einem NodeMCU gebaut, aber da ist irgendwann der Wifi Chip durchgebrannt. Daher hier die Dokumentation für die momentane Version 2. Die Bilder sind aber teilweise von der ersten Version. Der Aufbau ist im Grunde der gleiche. Ich habe allerdings bei der neuen Version dann ein Relais verwendet, statt die LED's direkt vom Controller aus zu betreiben. Damit kann ich ggf. andere Lampen verwenden und die bekommen in jedem Fall ihren eigenen Strom, damit die ganze Last nicht auf dem Controller hängt.

Vorbereitung

Zuerst bereite ich die API von OpenWeatherMap vor. Die ist ganz gut dokumentiert. An sich ist sie mit bestimmten Limits kostenlos. Die kostenpflichtige Version wird aber nur bei krasseren Projekten relevant. Stündliche Wettervorhersagen gibt es 48h im Voraus, mehr brauche ich für meine Zwecke ja nicht. Mit dem folgenden Code schaue ich nach dem stündlichen Wetter ür die aktuelle und nächste Stunde, bei meiner Position und lasse per GET schon die unrelevanten Forecasts weg. Wenn im Ergebnis die POP, d.h. Probability of precipitation, also Niderschlagswahrscheinlichkeit, größer 0 ist, dann lass ich 'red' zurückgeben, ansonsten 'green'. Das ganze packe ich auf eine kleine Subdomain damit ich es per GET abrufen kann. Der Vorteil dabei ist vor allem, dass ich die Logik ändern kann, ohne den Arduino neu zu programmieren, denn der reagiert ja nur auf rot oder grün. Wie rot oder grün berechnet wird, kann ich dann mega einfach in meiner PHP Datei ändern 👍

<?php
header('Content-Type: text/plain');
$weather = json_decode(file_get_contents("https://api.openweathermap.org/data/2.5/onecall?lat=51.340243&lon=12.3714403&exclude=current,minutely,daily,alerts&appid=xxxxxxxxxx"),true);
print ($weather['hourly'][0]['pop'] > 0 || $weather['hourly'][1]['pop'] > 0 ? 'red' : 'green');
?>

Prototyp

Ich stecke eine einfache Schaltung zusammen. Das Foto ist noch von der ersten Ampel Version. Hier steuere ich zum Testen auf dem Breadboard die Pins mit den LED's direkt an.

Arduino Ampelschaltung und Wetter API

Beim Wechsel von Version 1 auf 2 hatte ich arge Probleme mit der Verbindung zum Controller. Ich dachte zuerst ich habe durch irgendein Update die Treiber verloren. Habe alle neu installiert doch das half nichts. Ich habe dann hunderte Einstellungsoptionen in der Arduino IDE probiert, auch kein Treffer. Nachdem ich schon völlig demotiviert war hab ich einige Monate später verschiedene Kabel getestet. Tadaa 😳 ... Hier mein Pro-Tip: Immer das richtige Kabel wählen. Es gibt offenbar Kabel, die keine Daten übertragen, sondern nur Strom 👍

  1. Node MCU mit WiFi ind er Ampel
  2. Einstellungen für ESP8266 Verbindung

Fertigung

Der finale Aufbau der Ampelschaltung ist dann recht einfach. Die Relais und den Controller habe ich mit Heißkleber an den Seitenwänden festgeklebt. Die Fassungen für die LED's ebenso. Der Rest sind nur noch Kabel. Das Pinout Schema ist auch recht übersichtlich:

ESP GND 5V D5
Power - +
Relais - + IN

Relais und Arduino ESP8266

Der folgende (finale) Code ist schon von der zweiten Version, in der ich ein Relais zwischenschalte. Grundgedanke ist, beim starten kurz beide Lampen blinken zu lassen, damit man ggf. ohne aufschrauben sehen kann, dass beide funktionstüchtig sind. Danach wird die das WLAN aktiviert und eine Verbindung aufgebaut. Dann wird meine kleine API abgefragt und die Ampel stellt sich entsprechend um. Dann lasse ich die WiFi Verbindung trennen, damit die nicht konstant den Chip belastet (hoffe ich) und lasse den Controller eine Stunde Pause machen. Danach wird wieder eine WiFi Verbindung aufgebaut, kurz abgefragt, und dan wieder schlafen gelegt. Somit habe ich nach Einschalten eine stündliche Anzeige der Wetters. Für die Uhrzeitabfrage nutze ich diesen UDP dingens, damit der Controller immer bis zur vollen Stunde schläft. Damit hab ich auch einigermaßen Kontrolle oder Gewissheit über das Ergebnis.

//wifi setup
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
const char* ssid = "ROUTER-NAME";
const char* password = "WIFI-PASSWD";

//time setup
#include <NTPClient.h>
#include <WiFiUdp.h>
const long utcOffsetInSeconds = 3600;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);

void setup () {

  Serial.begin(9600);
  Serial.println("booted");
  pinMode(5, OUTPUT); //D1

  delay(1000);  
  digitalWrite(5, HIGH);
  delay(500);
  digitalWrite(5, LOW);
  delay(500);

}

void loop() {

  String payload;

  Serial.println("connecting...");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }

  if (WiFi.status() == WL_CONNECTED) {

    HTTPClient http;
    WiFiClient client;

    http.begin(client,"http://w.rokito.de/");
    int httpCode = http.GET();

    if (httpCode > 0) {

      payload = http.getString();
      Serial.println(payload);

      if(payload == "green"){
        digitalWrite(5, HIGH);
      }else{
        digitalWrite(5, LOW);
      }

    }

    http.end();

  }

  timeClient.update();
  int timeLeft = (60 - timeClient.getMinutes()) * 60;
  WiFi.disconnect();
  Serial.println("wifi status:");
  Serial.print(WiFi.status());

  Serial.println("sleep:");
  Serial.println(timeLeft);
  delay(timeLeft * 1000);

}

Ich löte noch kleine mini-USB Ports an, damit ich das schöne geflochtene USB Kabel weiterbenutzen kann, dass ich für die erste Version schon benutzt hatte. Damals hatte ich es direkt in den Controller gesteckt, diesmal wollte ich aber etwas neues probieren. Bei den Lampen habe ich noch umgestellt auf gelbe statt weiße LED's, weil die dann ein hübscheres Licht machen, die Ampel hat ja auch hauptsächlich einen dekorativen Zweck.

Die fertige Wetter Ampel

Die Gelbphase hab ich zu ner richtig stylishen Dekolampe umgebaut. Dadrin ist jetzt einfach eine Fassung für eine Halogenlampe.

Verkehrsampel als Deko Lampe