WS2812B mit Twitch steuern

Elektronics at its best

WS2812B mit Twitch steuern

5. September 2020 Allgemein 0

Und mal wieder was mit LED´s und Twitch. Ich liebe es halt wenn es blinkt 😉
Diesmal geht es darum die LED´s per Follow bzw. Chatbefehl zu steuern und auf ein voreingestelltes Preset zurückzusetzen.
Der erste Ansatz sollte auf Basis von WLED laufen aber das wollte nicht ganz so wie ich es wollte.
Also dann mit der FastLED Libary und dem altbekannten Noycebru Sketch der Bubblemachine.
Ich hatte Unterstützung von “lazy_invader” auf Twitch. Er hat mir tatkräftig unter die Arme gegriffen.

Die Schaltung mit einer 8×8 RGB Matrix sieht folgt aus:

Aber ihr könnt auch einen RGB-Stripe verwenden. Bedenkt aber die Stromversorgung da der Wemos nicht genug Ausgangsleistung hat. Für einen kleinen Test mag das reichen aber nicht für den Dauerbetrieb.

Was wird außer der Arduino IDE benötigt?
Erstmal die “FastLED” Libary, die es in der Bibliotheksverwaltung gibt. Genauso wie die “ArduinoIRC” Libary.
Auch sollte der Wemos eingebunden sein. Ist dies nicht der Fall tragt bitte bei “Voreinstellungen” unter “Zusätzliche Boardverwalter-URLs” folgendes ein “http://arduino.esp8266.com/stable/package_esp8266com_index.json”
Dann geht auf Werkzeuge => Board => Boardverwalter und sucht dann nach ESP8266 und installiert diesen dann.

Ich habe das ganze auf einem Wemos D1 mini aufgespielt aber ihr könnt auch einen anderen ESP8266 wählen.

Als Sketch kommt hier eine Mischung von Noycebru´s “Bubblemaschine” und der FastLED Beispieldatei “Pacifica”

Zuerst erstellt ihr die “twitchconfig.h” in der die Daten eures Routers und Twitch Config eingetragen werden:

char ssid[] = "***";       // your network SSID (name)
char password[] = "***";  // your network key
 
//The name of the channel that you want the bot to join
const String twitchChannelName = "***";
 
//The name that you want the bot to have
#define TWITCH_BOT_NAME "***"
 
//OAuth Key for your twitch bot
// https://twitchapps.com/tmi/
#define TWITCH_OAUTH_TOKEN "***"

Dann kommt der Sketch

/*******************************************************************
    Connect to Twtich Chat with a Bot
   Created with code from TheOtherLoneStar (https://www.twitch.tv/theotherlonestar)
   Hackaday IO: https://hackaday.io/otherlonestar
   By Brian Lough (https://www.twitch.tv/brianlough)
   YouTube: https://www.youtube.com/channel/UCezJOfu7OtqGzd5xrP3q6WA
  Created with code from noycebru www.twitch.tv/noycebru
 *******************************************************************/

#include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino
#include <IRCClient.h>
#include "twitchconfig.h"
#include <FastLED.h>
FASTLED_USING_NAMESPACE
//define your default values here, if there are different values in config.json, they are overwritten.

#define IRC_SERVER   "irc.chat.twitch.tv"
#define IRC_PORT     6667

#define LED_PIN     D4
//#define CLOCK_PIN 4
#define NUM_LEDS    64
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
//#define BRIGHTNESS  64
#define MAX_POWER_MILLIAMPS 500
CRGB leds[NUM_LEDS];
int z;

String ircChannel = "";

WiFiClient wiFiClient;
IRCClient client(IRC_SERVER, IRC_PORT, wiFiClient);


// put your setup code here, to run once:
void setup() {


  LEDS.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setCorrection( TypicalLEDStrip );
  FastLED.setMaxPowerInVoltsAndMilliamps( 5, MAX_POWER_MILLIAMPS);
  Serial.begin(115200);
  Serial.println();

  // Set WiFi to station mode and disconnect from an AP if it was Previously
  // connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  // Attempt to connect to Wifi network:
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  IPAddress ip = WiFi.localIP();
  Serial.println(ip);

  ircChannel = "#" + twitchChannelName;

  client.setCallback(callback);
}
CRGBPalette16 pacifica_palette_1 =
{ 0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800,
  0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800
};
CRGBPalette16 pacifica_palette_2 =
{ 0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800,
  0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800
};
CRGBPalette16 pacifica_palette_3 =
{ 0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800,
  0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800
};
void pacifica_loop()
{
  // Increment the four "color index start" counters, one for each wave layer.
  // Each is incremented at a different speed, and the speeds vary over time.
  static uint16_t sCIStart1, sCIStart2, sCIStart3, sCIStart4;
  static uint32_t sLastms = 0;
  uint32_t ms = GET_MILLIS();
  uint32_t deltams = ms - sLastms;
  sLastms = ms;
  uint16_t speedfactor1 = beatsin16(3, 179, 269);
  uint16_t speedfactor2 = beatsin16(4, 179, 269);
  uint32_t deltams1 = (deltams * speedfactor1) / 256;
  uint32_t deltams2 = (deltams * speedfactor2) / 256;
  uint32_t deltams21 = (deltams1 + deltams2) / 2;
  sCIStart1 += (deltams1 * beatsin88(1011, 10, 13));
  sCIStart2 -= (deltams21 * beatsin88(777, 8, 11));
  sCIStart3 -= (deltams1 * beatsin88(501, 5, 7));
  sCIStart4 -= (deltams2 * beatsin88(257, 4, 6));

  // Clear out the LED array to a dim background blue-green
  fill_solid( leds, NUM_LEDS, CRGB( 2, 6, 10));

  // Render each of four layers, with different scales and speeds, that vary over time
  pacifica_one_layer( pacifica_palette_1, sCIStart1, beatsin16( 3, 11 * 256, 14 * 256), beatsin8( 10, 70, 130), 0 - beat16( 301) );
  pacifica_one_layer( pacifica_palette_2, sCIStart2, beatsin16( 4,  6 * 256,  9 * 256), beatsin8( 17, 40,  80), beat16( 401) );
  pacifica_one_layer( pacifica_palette_3, sCIStart3, 6 * 256, beatsin8( 9, 10, 38), 0 - beat16(503));
  pacifica_one_layer( pacifica_palette_3, sCIStart4, 5 * 256, beatsin8( 8, 10, 28), beat16(601));

  // Add brighter 'whitecaps' where the waves lines up more
  pacifica_add_whitecaps();

  // Deepen the blues and greens a bit
  pacifica_deepen_colors();
}

// Add one layer of waves into the led array
void pacifica_one_layer( CRGBPalette16& p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff)
{
  uint16_t ci = cistart;
  uint16_t waveangle = ioff;
  uint16_t wavescale_half = (wavescale / 2) + 20;
  for ( uint16_t i = 0; i < NUM_LEDS; i++) {
    waveangle += 250;
    uint16_t s16 = sin16( waveangle ) + 32768;
    uint16_t cs = scale16( s16 , wavescale_half ) + wavescale_half;
    ci += cs;
    uint16_t sindex16 = sin16( ci) + 32768;
    uint8_t sindex8 = scale16( sindex16, 240);
    CRGB c = ColorFromPalette( p, sindex8, bri, LINEARBLEND);
    leds[i] += c;
  }
}

// Add extra 'white' to areas where the four layers of light have lined up brightly
void pacifica_add_whitecaps()
{
  uint8_t basethreshold = beatsin8( 9, 55, 65);
  uint8_t wave = beat8( 7 );

  for ( uint16_t i = 0; i < NUM_LEDS; i++) {
    uint8_t threshold = scale8( sin8( wave), 20) + basethreshold;
    wave += 7;
    uint8_t l = leds[i].getAverageLight();
    if ( l > threshold) {
      uint8_t overage = l - threshold;
      uint8_t overage2 = qadd8( overage, overage);
      leds[i] += CRGB( overage, overage2, qadd8( overage2, overage2));
    }
  }
}

// Deepen the blues and greens
void pacifica_deepen_colors()
{
  for ( uint16_t i = 0; i < NUM_LEDS; i++) {
    leds[i].blue = scale8( leds[i].blue,  145);
    leds[i].green = scale8( leds[i].green, 200);
    leds[i] |= CRGB( 2, 5, 7);
  }
}

void colorLED(int r,int g,int b) {
  fill_solid(leds, NUM_LEDS, CRGB(r, g, b));
  FastLED.show();
  delay(3000);
  FastLED.clear();
  FastLED.show();
  EVERY_N_MILLISECONDS( 20) {
    pacifica_loop();
    FastLED.show();
  }
}
void loop() {
  //FastLED.clear();
  //FastLED.show();

  EVERY_N_MILLISECONDS( 20) {
    pacifica_loop();
    FastLED.show();
  }


  // Try to connect to chat. If it loses connection try again
  if (!client.connected()) {
    Serial.println("Attempting to connect to " + ircChannel );
    // Attempt to connect
    // Second param is not needed by Twtich
    if (client.connect(TWITCH_BOT_NAME, "", TWITCH_OAUTH_TOKEN)) {
      client.sendRaw("JOIN " + ircChannel);
      Serial.println("connected and ready to rock");
      sendTwitchMessage("Ready to go Boss!");
    } else {
      Serial.println("failed... try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
    return;
  }
  client.loop();
}

void sendTwitchMessage(String message) {
  client.sendMessage(ircChannel, message);
}


void callback(IRCMessage ircMessage) {
  //Serial.println("In CallBack");


  if (ircMessage.command == "PRIVMSG" && ircMessage.text[0] != '\001') {
    //Serial.println("Passed private message.");

    ircMessage.nick.toUpperCase();

    String message("<" + ircMessage.nick + "> " + ircMessage.text);

    //prints chat to serial
    Serial.println(message);
    if (ircMessage.text.indexOf("following") > -1 && ircMessage.nick == "STREAMLAB")
    {
            FastLED.clear();
      z = 1;
      do {
        Serial.println(z);
        z++;
        fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0));
        FastLED.show();
        delay(500);

        fill_solid(leds, NUM_LEDS, CRGB(0, 0, 255));
        FastLED.show();
        delay(500);
      }
      while (z < 10);
      FastLED.clear();
      FastLED.show();
      EVERY_N_MILLISECONDS( 20) {
        pacifica_loop();
        FastLED.show();
      }
    }

    else if (ircMessage.text == "!rot") {
        colorLED( 255, 0, 0);
      }
    

  
 else if (ircMessage.text == "!grün") {
        colorLED(0, 255, 0);
      }

      else if (ircMessage.text == "!blau") {
        colorLED(0, 0, 255);
      }
      
    return;
  }
}

Ihr könnt das ganze natürlich euren Bedürfnissen anpassen. Für das Grundpreset “Pacifica” könnt ihr in folgendem Bereich die Farben einstellen:

CRGBPalette16 pacifica_palette_1 =
{ 0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800,
  0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800
};
CRGBPalette16 pacifica_palette_2 =
{ 0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800,
  0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800
};
CRGBPalette16 pacifica_palette_3 =
{ 0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800,
  0x003100, 0x335A33, 0x5C7B5C, 0x00FF00, 0x00A300, 0x5CC45C, 0x2F652F, 0x006800
};

Ich habe es mir einfach gemacht und in allen 3 Segmenten die selben Werte verwendet aber euch steht alles offen um es anzupassen.

Im Folgenden könnt ihr eure Alerts eintragen und mit jeder Farbe versehen die ihr möchtet. Ich habe mich für einen Blinker mit den Fraben rot und blau entschieden.

if (ircMessage.text.indexOf("following") > -1 && ircMessage.nick == "STREAMLAB")
    {
            FastLED.clear();
      z = 1;
      do {
        Serial.println(z);
        z++;
        fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0));
        FastLED.show();
        delay(500);

        fill_solid(leds, NUM_LEDS, CRGB(0, 0, 255));
        FastLED.show();
        delay(500);
      }
      while (z < 10);
      FastLED.clear();
      FastLED.show();
      EVERY_N_MILLISECONDS( 20) {
        pacifica_loop();
        FastLED.show();
      }
    }

Das ganze befindet sich in einer Schleife welche aber auch individuell zu ändern ist.

Anschauen könnt ihr das bei mir im Twitch-Stream unter https://twitch.tv/greenbrainsecke

Bis dahin,
habt Spaß am basteln und vor allem: bleibt gesund 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen