Ankündigung

Einklappen
Keine Ankündigung bisher.

LED Streifen per Openhab steuern

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    LED Streifen per Openhab steuern

    Hallo zusammen,


    Ich weiß gar nicht, ob ich mit diesem Problem hier im Forum richtig bin.

    ich habe da ein Problem.
    Ich möchte gerne einen LED-Streifen mit Openhab steuern.

    Ich habe mir dazu nach viel Suchen und recherchieren im Internet für einen ESP8266 als Controller entschieden.
    Den passenden Code für Arduino habe ich auch gefunden, alles gut.

    MQTT läuft auch alles.

    Nur ist der Code für WS2812-LED-Streifen, ich habe aber WS2801-LEDs

    Habe auch ein funktionierendes Script für den Raspberry rumliegen, da läuft alles.
    Nun soll der Raspi gegen den kleinen ESP8266 ausgetauscht werden.

    Hier ist der Code für den ESP8266 für die WS2812 LEDs

    Code:
    // Neopixel
    #include <Adafruit_NeoPixel.h>
    
    
    
    // ESP 8266
    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    
    // MQTT Subscribes
    const char* SubscribeTo = "LED1/out";
    const char* SubscribeFrom = "LED1/in";
    
    // WiFi & MQTT Server
    const char* ssid = "xxxxxx";
    const char* password = "xxxxxx";
    const char* mqtt_server = "xxxxx";
    
    WiFiClient espClient;
    PubSubClient pubClient(espClient);
    long lastMsg = 0;
    char msg[50];
    String message("#000000");
    String lastMessage("#000000");
    
    [MARKIEREN]
    // Neopixel Config
    #define NeoPIN D3
    #define NUM_LEDS 30
    int brightness = 150;
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, NeoPIN, NEO_RGB + NEO_KHZ800);
    [/MARKIEREN]
    
    void setup() {
      Serial.begin ( 115200 );
      
      // ##############
      // NeoPixel start
      Serial.println();
      strip.setBrightness(brightness);
      strip.begin();
      strip.show();
      delay(50);
      
      // WiFi
      setup_wifi();
      
      // MQTT
      Serial.print("Connecting to MQTT...");
      // connecting to the mqtt server
      pubClient.setServer(mqtt_server, 1883);
      pubClient.setCallback(callback);
      Serial.println("done!");
    }
    
    void callback(char* topic, byte* payload, unsigned int length) {
      Serial.print("Message arrived [");
      Serial.print(topic);
      Serial.print("] ");
      String color("#");
      
      for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
        if(i > 0){
          color = color + String((char)payload[i]);  
        }  
      }
      
      Serial.println();
    
    
      // finding payload
      if((char)payload[0] == '#'){
        // setting color
         setNeoColor(color);
      }
      
    }
    
    void setup_wifi() {
    
      delay(10);
      // We start by connecting to a WiFi network
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
    
      WiFi.begin(ssid, password);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(100);
        Serial.print(".");
      }
    
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }
    
    void loop() {
      if (!pubClient.connected()) {
        delay(100);
        reconnect();
      }
      pubClient.loop();
      
      long now = millis();
      if (now - lastMsg > 60000 || lastMessage.indexOf(message) < 0 ) {
        
        lastMsg = now;
        Serial.print("Publish message: ");
        Serial.println(message);
        char msg[7];
        message.toCharArray(msg, message.length());
        Serial.print("Publishing...");
        pubClient.publish(SubscribeTo, msg);
        Serial.println("Done!!!");
        lastMessage = message;
      }
      delay(10);
    }
    
    
    void setNeoColor(String value){
        Serial.println("Setting Neopixel..." + value);
        message = value;
        int number = (int) strtol( &value[1], NULL, 16);
        
        int r = number >> 16;
        int g = number >> 8 & 0xFF;
        int b = number & 0xFF;
    
        
    
         Serial.print("RGB: ");
        Serial.print(r, DEC);
        Serial.print(" ");
        Serial.print(g, DEC);
        Serial.print(" ");
        Serial.print(b, DEC);
        Serial.println(" ");
      
       for(int i=0; i < NUM_LEDS; i++) {
          strip.setPixelColor(i, strip.Color( g, r, b ) );
        }
        strip.show();
        
        Serial.println("on.");
    }
    
    
    void reconnect() {
      // Loop until we're reconnected
      while (!pubClient.connected()) {
        // Attempt to connect
        if (pubClient.connect("ESP8266Client")) {
          Serial.println("connected");
          // Once connected, publish an announcement...
          pubClient.publish(SubscribeTo, "Restart");
          // ... and resubscribe
          pubClient.subscribe(SubscribeFrom);
        } else {
          Serial.print("failed, rc=");
          Serial.print(pubClient.state());
          Serial.println(" try again in 5 seconds");
          // Wait 5 seconds before retrying
          delay(5000);
        }
      }
    }
    Kann mir jemand da einen heißen Tip geben, wie ich das Sketch auf WS2801 umschreiben kann?
    Habe die Stelle markiert.
    Ich muss doch den DataPin und den ClockPin definieren, und dann?

    Stehe da auf dem Schlauch.....

    Bin für jeden Tip dankbar.


    Gruß
    Yankee

    #2
    Grundsätzlicher Unterschied:

    WS2812: nur DATA-Leitung
    WS2801: DATA- und CLOCK-Leitung

    so einfach wird es nicht gehen....

    Kommentar


      #3
      Du hast da recht.

      aber die Library unterstützt beide Chip-Arten.

      Ich meine es muss nur etwas in der Syntax geändert werden, damit die Stripes entsprechend angesprochen werden.

      Hat denn sonst vielleicht jemand schon ein Sketch, damit ich die WS2801 per MQTT ansprechen kann?

      Kommentar


        #4
        Hilft Dir das vielleicht weiter?!?!

        https://github.com/adafruit/Adafruit-WS2801-Library

        Kommentar


          #5
          Oder gleich FastLED nehmen. Ist deutlich umfangreicher/schneller und unterstützt sehr viele verschiedene Chips.
          Ansonsten könntest du Tasmota nehmen und auf WS2801 anpassen (WS2812 werden schon unterstützt).
          Zuletzt geändert von darkcheater; 18.02.2019, 12:44.

          Kommentar

          Lädt...
          X