• ESP8266

    Ich habe vor kurzem ein Video gesehen, in dem jemand eine Lampe gebaut hat, die aussieht wie eine Wolke. Die Idee hat mir super gefallen und da dachte ich mir, ich will das ganze auch umsetzen und nachbauen. Das war relativ einfach.

    • 2x Lampenschirme besorgt
    • vier Dosen SprĂŒhkleber
    • eine Dose Haarspray fĂŒrs Finish
    • FĂŒllmaterials als “Wolke”
    • ein bisschen Heißkleber und Draht zum verbinden der beiden Lampenschirme

    Wenn man das alles kombiniert, sieht’s am Ende ungefĂ€hr so aus:

    Wolken Lampe DIY - Lampenschrime miteinander verklebt

    Wolken Lampe DIY - Lampenschirme mit FĂŒllmaterial beklebt

    Bis zu dem Stand hat das ganze ca. 25€ gekostet. FĂŒr so eine stylische Lampe eigentlich Konkurrenzlos. 🙈 Fehlen eigentlich nur noch die LED’s im Inneren.

    Ich habe mich erstmal fĂŒr normale RGB-LED-Streifen entschieden.

    Wolken Lampe DIY - RGB LED

    So weit so gut, nur reicht mir das so noch nicht: Meine Lampe soll smart werden. Und damit herzlich Willkommen zu meiner kleinen Projekt-Dokumentation. 🙂


    Projekt-Dokumentation:

    Meine smarte Wolkenlampe mit Wetteranzeige


    Smart bedeutet in dem Fall nicht nur steuerbar ĂŒber das Handy und per Sprache via Siri, sondern ich möchte, dass meine Wolkenlampe das Wetter und die Uhrzeit widerspiegelt.

    Bedeutet im Klartext: Die Wolkenlampe soll mit dem wetter und der Uhrzeit synchronisiert werden. Und das völlig automatisch.

    Morgens und Abends soll meine Wolke jeweils in Rot / Orange / Gelb / Lila Farbtönen erleuchten. Wie ein Sonnenauf und -untergang eben aussieht. 🙂

    TagsĂŒber soll die Lampe einfach nur in strahlendem weiß leuchten wenn schönes Wetter ist, und grĂ€ulich wenn es regnet.

    Als Highlight, und um die passende AtmosphĂ€re zu erzeugen, möchte ich, dass die Wolkenlampe zum Blitzen anfĂ€ngt, wenn es draußen gewittert. 🌧

    Das ist der Plan, und ungefÀhr so soll das Farbspiel am Ende aussehen:

    Morgens / Abends

    Wolken Lampe DIY - Morgens und Abends

    TagsĂŒber

    Wolken Lampe DIY - TagsĂŒber

    Gewitter / schlechtes Wetter

    Wolken Lampe DIY - bei Gewitter

    Realisieren möchte ich das ganze mit WS2812 LED’s und einer API eines Wetteranbieters. Das wird mein erstes WS2812 Projekt, und ich hab richtig bock. Abonniert das Thema wenn ihr wollt, ich werde meine Updates zu dem Projekt hier veröffentlichen.


    🔔 Aktiviert die Glocke fĂŒr Benachrichtigungen 🔔


    Hier gehts weiter:


    To be continued


  • ESP8266

    Die Wetter-API

    Als API fĂŒr das aktuelle Wetter habe ich mich fĂŒr die kostenlose Variante der openweathermap.org entschieden. Ich denke die Anzahl der Anfragen sollte fĂŒr meinen Zweck hier locker ausreichen. Nach kurzer Recherche im Internet sieht es auch vielversprechend aus was die ZuverlĂ€ssigkeit und Genauigkeit betrifft.

    Hier mal die Leistungen des Free-Plans:

    • 60 Anfragen/Minute
    • 1.000.000 Anfragen/Monat

    • Current Weather
    • Minute Forecast 1 hour*
    • Hourly Forecast 2 days*
    • Daily Forecast 7 days*
    • Historical weather 5 days*

    (*) auf 1000 Anfragen am Tag beschrÀnkt.

    Nach der kostenlosen Registrierung steht der persönliche API-SchlĂŒssel direkt zur VerfĂŒgung und kann genutzt werden, um auf die API zuzugreifen.

    Der API-Call ist ziemlich einfach und liefert folgendes Ergebnis

    http://api.openweathermap.org/data/2.5/weather?q={STADT}&appid={API-TOKEN}

    {
    	"coord": {
    		"lon": 11.58,
    		"lat": 48.14
    	},
    	"weather": [{
    		"id": 800,
    		"main": "Clear",
    		"description": "clear sky",
    		"icon": "01d"
    	}],
    	"base": "stations",
    	"main": {
    		"temp": 300.87,
    		"feels_like": 302.24,
    		"temp_min": 300.37,
    		"temp_max": 301.48,
    		"pressure": 1022,
    		"humidity": 52
    	},
    	"visibility": 10000,
    	"wind": {
    		"speed": 1.41,
    		"deg": 339
    	},
    	"clouds": {
    		"all": 0
    	},
    	"dt": 1600173992,
    	"sys": {
    		"type": 3,
    		"id": 2002112,
    		"country": "DE",
    		"sunrise": 1600145467,
    		"sunset": 1600190802
    	},
    	"timezone": 7200,
    	"id": 2867714,
    	"name": "Munich",
    	"cod": 200
    }
    

    Man erhĂ€lt erstaunlich viele Daten mit denen man arbeiten kann. Mehr als ich erwartet hatte. Mal sehen ob man davon noch was sinnvoll verwenden kann, auch fĂŒr andere Projekte. Erstmal sind fĂŒr mich aber folgende Objekte relevant:

    "sys": {
    	"type": 3,
    	"id": 2002112,
    	"country": "DE",
    	"sunrise": 1600145467,
    	"sunset": 1600190802
    }
    
    "weather": [{
    	"id": 800,
    	"main": "Clear",
    	"description": "clear sky",
    	"icon": "01d"
    }]
    

    Da es in MĂŒnchen aktuell super schön ist, werde ich erstmal rausfinden mĂŒssen, was mir bei verschiedenen Wetterlagen zurĂŒckgegeben wird. 🙂


    In Hamburg ist es gerade leicht Bewölkt:

    "weather": [{
    	"id": 802,
    	"main": "Clouds",
    	"description": "scattered clouds",
    	"icon": "03n"
    }],
    
    "clouds": {
    	"all": 40
    }
    

    In Brynamman (UK) regnet es:

    "weather": [{
    	"id": 500,
    	"main": "Rain",
    	"description": "light rain",
    	"icon": "10d"
    }],
    
    "clouds": {
    	"all": 87
    }
    

    Aber bevor ihr jetzt ebenfalls anfÀngt, die aktuelle Wetterkarte zu studieren wo es regnet oder Gewittert, könnt ihr leichter einen Blick in die API-Dokumentation werfen.

    Hier mal die Wetter-Codes und die passenden Bezeichnungen dazu:
    https://openweathermap.org/weather-conditions

    Hier allgemein die Keys und Values und deren Bedeutung:
    https://openweathermap.org/weather-data

  • ESP8266

    API Daten verarbeiten

    Ich habe gerade die API in einem Arduino Programm verarbeitet. Entweder lĂ€uft das ganze am Ende auf einem ESP01-S oder einem D1 Mini oder Ähnlichem. Je nachdem was die Leistung hergibt.


    Der Code holt sich das JSON-Objekt von der API und verarbeitet es dementsprechend weiter. Auf den ersten Blick sieht das Programm ziemlich wild aus, ist aber eigentlich nichts spektakulÀres:

    #include <ESP8266WiFi.h>
    #include <ESP8266HTTPClient.h>
    
    #include <ArduinoJson.h>
    
    
    HTTPClient sender;
    
    
    // #####################################################################
    // USER DATA USER DATA USER DATA USER DATA USER DATA USER DATA USER DATA 
    
    
    // #####################################################################
    // WLAN-Daten
    const char* ssid = "WLAN-SSID";
    const char* password = "WLAN-PSK";
    
    // #####################################################################
    // home.openweathermap.org/api_keys
    const int zipcode = 12345;
    const String apikey = "d96f32a2a42s3832fa0695fx4553c5c4";
    
    
    // USER DATA USER DATA USER DATA USER DATA USER DATA USER DATA USER DATA
    // ##################################################################### 
    
    
    
    String json;
    
    String city_name;
    String weather_description;
    int weather_id;
    
    
    /*
     * 
     * DEFINITIONEN DER EINZELENEN WETTER-IDs
     * 
     */
    
    // THUNDERSTORM // GEWITTER
    int thunderstorm[]={200, 201, 2020, 210, 211, 212, 221, 230, 231, 232};
    
    // DRIZZLE // NIESELREGEN
    int drizzle[]={300, 301, 302, 310, 311, 312, 313, 314, 321};
    
    // RAIN // REGEN
    int rain[]={500, 501, 502, 503, 504, 511, 520, 521, 522, 531};
    
    // SNOW // SCHNEE
    int snow[]={600, 601, 602, 611, 612, 613, 615, 616, 620, 621, 622};
    
    // ATMOSPHERE // ATMOSPHÄRE
    int atmosphere[]={701, 711, 721, 731, 741, 751, 761, 762, 771, 781};
    
    // CLEAR // KLAR
    int clear_0[]={800};
    
    // CLOUDS // BEWÖLKT
    int clouds[]={801, 802, 803, 804};
    
    
    void setup() {
      Serial.begin(115200);
      
      WiFi.begin(ssid, password);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(200);
        Serial.print(".");
      }
    
      Serial.println("Verbunden!");
    
      
    
      // JSON-Objekt von der API abfragen und in Variable speichern
      json = get_weather_json(zipcode, apikey);
    
      // JSON Objekt ausgeben (DEBUG)
      Serial.println(json);
    
      
      // Values der Keys in die einzelnen Variablen speichern
      city_name = get_city_name(json);
      weather_description = get_weather_description(json);
      weather_id = get_weather_id(json);
    
      // Ausgabe der einzelnen Variablen (DEBUG)
      Serial.println(city_name + " :: " + weather_description + " :: " + weather_id);
    
    
    
    
      //HIER NUR EIN BEISPIEL ZUM VERABRITEN
    
      if (std::find(std::begin(thunderstorm), std::end(thunderstorm), weather_id) != std::end(thunderstorm)){
        Serial.println("Es ist herrscht ein Gewitter!");
      }
    
      if (std::find(std::begin(drizzle), std::end(drizzle), weather_id) != std::end(drizzle)){
        Serial.println("Es ist herrscht Nieselregen!");
      }
    
      if (std::find(std::begin(rain), std::end(rain), weather_id) != std::end(rain)){
        Serial.println("Es ist regnet!");
      }
    
      if (std::find(std::begin(snow), std::end(snow), weather_id) != std::end(snow)){
        Serial.println("Es ist schneit!");
      }
    
      if (std::find(std::begin(atmosphere), std::end(atmosphere), weather_id) != std::end(atmosphere)){
        Serial.println("TrĂŒbe AtmosphĂ€re!");
      }
    
      if (std::find(std::begin(clear_0), std::end(clear_0), weather_id) != std::end(clear_0)){
        Serial.println("Der Himmel ist klar!");
      }
    
      if (std::find(std::begin(clouds), std::end(clouds), weather_id) != std::end(clouds)){
        Serial.println("Es ist (leicht) bewölkt!");
      }
    
    
      //HIER NUR EIN BEISPIEL ZUM VERABRITEN
    
     
      
    }
    
    
    void loop() {
    
      
    
    }
    
    
    /*
     * 
     * 
     * ##### DEFINED FUNCTIONS #####
     * 
     * 
     */
    
    
    String get_weather_json(int zipcode, String apikey){
    
      if (sender.begin("http://api.openweathermap.org/data/2.5/weather?zip=" + String(zipcode) + ",DE&appid=" + apikey)) {
    
        // HTTP-Code der Response speichern
        int httpCode = sender.GET();
       
    
        if (httpCode > 0) {
          
          // Anfrage wurde gesendet und Server hat geantwortet
          // Info: Der HTTP-Code fĂŒr 'OK' ist 200
          if (httpCode == HTTP_CODE_OK) {
    
            // Hier wurden die Daten vom Server empfangen
    
            // String vom Webseiteninhalt speichern
            String payload = sender.getString();
    
            // Hier kann mit dem Wert weitergearbeitet werden
            // ist aber nicht unbedingt notwendig
            // Serial.println(payload);
    
            
            return payload;
            
          }
          
        }else{
          // Falls HTTP-Error
          Serial.printf("HTTP-Error: ", sender.errorToString(httpCode).c_str());
        }
    
        // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet
        sender.end();
        
      }else {
        Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!");
      }
      
    }
    
    
    String get_city_name(String input_json){
    
      const size_t capacity = 800;
      DynamicJsonDocument doc(capacity);
            
      const char* json = input_json.c_str();
    
      deserializeJson(doc, json);
    
      const char* cityname = doc["name"];
    
      return String(cityname);
      
    }
    
    String get_weather_description(String input_json){
    
      const size_t capacity = 800;
      DynamicJsonDocument doc(capacity);
            
      const char* json = input_json.c_str();
    
      deserializeJson(doc, json);
      JsonObject weather_0 = doc["weather"][0];
    
      const char* weather_0_description = weather_0["description"];
    
      return String(weather_0_description);
      
    }
    
    int get_weather_id(String input_json){
    
      const size_t capacity = 800;
      DynamicJsonDocument doc(capacity);
            
      const char* json = input_json.c_str();
    
      deserializeJson(doc, json);
      JsonObject weather_0 = doc["weather"][0];
    
      int weather_0_id = weather_0["id"];
    
      return weather_0_id;
      
    }
    

    Mit dem folgendem Code-Snippet wird die API abgerufen. Die Einzelnen Werte werden dementsprechend in Variablen gespeichert. FĂŒr mich sind nur 3 Values ausschlaggebend.

    Der Ort, die Wetter-Beschreibung und die Wetter-ID.

    FĂŒr den eigentlichen Call und die Ausgabe sind nur die folgenden Zeilen verantwortlich:

      // JSON-Objekt von der API abfragen und in Variable speichern
      json = get_weather_json(zipcode, apikey);
    
      // JSON Objekt ausgeben (DEBUG)
      Serial.println(json);
    
      
      // Values der Keys in die einzelnen Variablen speichern
      city_name = get_city_name(json);
      weather_description = get_weather_description(json);
      weather_id = get_weather_id(json);
    
      // Ausgabe der einzelnen Variablen (DEBUG)
      Serial.println(city_name + " :: " + weather_description + " :: " + weather_id);
    
    MĂŒnchen :: few clouds :: 801
    

    Der Rest des Codes sind die definierten Funktionen auf die zugegriffen werden. Also u.a get_weather_id(), get_weather_json() oder get_city_name().

    Ihr könnt das Programm 1:1 kopieren und einfĂŒgen und natĂŒrlich testen. Ihr mĂŒsst nur 4 Parameter anpassen:

    // WLAN-Zugangsdaten
    const char* ssid = "WLAN-SSID";
    const char* password = "WLAN-PSK";
    
    // PLZ und API-Key
    const int zipcode = 12345;
    const String apikey = "d96f32a2a42s3832fa0695fx4553c5c4";
    

    Ich halte euch auf dem Laufenden. 👍


  • @cooper wann geht es weiterđŸ€—

  • ESP8266

    @MichKla Weiß ich noch nicht 🙉 momentan fehlt komplett die Motivation. đŸ„±


  • Mal so n paar Fragen falls ich auf die Idee kommen sollte das nachbaun zu wollen. Auf was lĂ€uft die Wetter Api. Auf nem Raspi? Und ĂŒber was wird die Wolke mit Strom versorgt? Per bliit- und sonnen Energie? Spaß. Per Netzteil oder sogar dierekt 230V? Ich wĂŒrd mich ĂŒber antworten freuen. MFG Justin.

  • ESP8266

    @justricity mal vorab, sie Lampe lĂ€uft nich wie ursprĂŒnglich geplant auf WS2812 LEDs sondern normale RGB LEDs. Und hab sie auch nicht mit dem Wetter gesynced weil, keine Ahnung. FrĂŒh und Abends ist es bissle planlos bzw. unnötig mit der kleinen Wolke da 
 und gewittern tuts auch fast nie hier. Also lĂ€uft grad einfach nur als RGB Lampe.

    Wetter API ist ein Dienst. Steht eigentlich alles hier beschrieben.

    Ich verwende nen normalen LED Streifen mit dem Controller hier:
    https://makesmart.shop/Magic-Home-RGB-Controller

    Könntest aber auch ein Komplettset nehmen:
    ÂčAmazon

    Ansonsten, naja wenn du halt adressierbare LEDs verwenden möchtest lĂ€uft das ganze mit nem 5V Netzteil fĂŒr entsprechende LEDs und Mikrocontroller. Angesteuert werden die LEDs ĂŒber eine 3.3V Datenleitung direkt ĂŒber den Mikrocontroller.

    ÂčAffiliate Link. Affiliate Links sind Referenzen des Autors. Bei Kauf wird eine Provision ausgeschĂŒttet. Mehr Informationen.

Ähnliche Themen

  • 33
  • 12
  • 44
  • 4
  • 1