User Tools

Site Tools


projects:neopixel-bandwidth-room-light

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
projects:neopixel-bandwidth-room-light [2017-10-15 08:32]
trinitor [Test]
projects:neopixel-bandwidth-room-light [2017-12-23 11:49] (current)
trinitor [Motion detection notification]
Line 1: Line 1:
 ====== NeoPixel Bandwidth Room Light ====== ====== NeoPixel Bandwidth Room Light ======
 +
 +{{:projects:neopixel_bandwidth_room_light.gif?direct|}}
  
 ===== Overview ===== ===== Overview =====
Line 11: Line 13:
 **Light wars incoming!** **Light wars incoming!**
  
-The ESPP8266 board is a NodeMCU Amica+The ESP8266 board is a NodeMCU Amica
    
 {{:projects:nodemcu_v0.9_pinout.png?400|}} {{:projects:nodemcu_v0.9_pinout.png?400|}}
Line 57: Line 59:
 ///////////////////////////// config ///////////////////////////// ///////////////////////////// config /////////////////////////////
 // Network // Network
-const char*  ssid         = "your_wifi_ssid"; +const char*  ssid         = "yourSSID"; 
-const char*  password     = "our_wifi_psk";+const char*  password     = "yourPassw0rd";
 unsigned int localUdpPort = 2342; unsigned int localUdpPort = 2342;
-char incomingPacket[255];  // buffer for incoming packets +char incomingPacket[255];   
-char replyPacket[] = "message received";  // a reply string to send back+char replyPacekt[] = "message received"; 
  
 // neopixel // neopixel
 const int LEDPIN          =   15; const int LEDPIN          =   15;
 const int NUMPIXELS        300; const int NUMPIXELS        300;
 +
 int displayrefresh        =   10; int displayrefresh        =   10;
 +int shiftpixels              2; //2 = shift pixels, 1 = no shift
 +int alwaysoff                0; //1 = blank 1st pixel if no new color
 ////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
  
-// usage examples:  +// usage examples: 
-// echo "{red:0,green:100,blue:0}" | nc -w -u 192.168.x.x 2342 +// echo "{red:0,green:100,blue:0}" | nc -w -u 192.168.x.x 2342 
-// echo "{red:32,green:32,blue:0,all:1}" | nc -w -u 192.168.x.x 2342 +// echo "{red:32,green:32,blue:0,all:1}" | nc -w -u 192.168.x.x 2342 
-// echo "{clearall:1}" | nc -w 1 -u 192.168.x.x 2342+// echo "{clearall:1}" | nc -w 0 -u 192.168.x.x 2342 
 +// echo "{refresh:50}" | nc -w 0 -u 192.168.x.x 2342 
 +// echo "{red:0,green:100,blue:0,pin:50}" | nc -w 0 -u 192.168.x.x 2342 
 +// echo "{scroll:1}" | nc -w 0 -u 192.168.x.x 2342 
 +// echo "{effect:1}" | nc -w 0 -u 192.168.x.x 2342 
 +// echo "{effect:1,option1:20}" | nc -w 0 -u 192.168.x.x 2342
  
  
Line 101: Line 111:
 void loop() void loop()
 { {
-  int red      -1+  int red       0
-  int green    -1+  int green     0
-  int blue     -1+  int blue      0
-  int refresh  =  0; +  int refresh   = 0; 
-  int all       0; +  int scroll    0; 
-  int clearall =  0;+  int pixel     0; 
 +  int all       = 0; 
 +  int clearall  0; 
 +  int effect    = 0; 
 +  int option1   0;
      
   int packetSize = Udp.parsePacket();   int packetSize = Udp.parsePacket();
   if (packetSize)   if (packetSize)
   {   {
-//    Serial.println("Read Packet"); 
     // receive incoming UDP packets     // receive incoming UDP packets
 //    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); //    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
Line 120: Line 133:
       incomingPacket[len] = 0;       incomingPacket[len] = 0;
 //      Serial.printf("UDP packet contents: %s", incomingPacket); //      Serial.printf("UDP packet contents: %s", incomingPacket);
-//      Serial.println("Parse Packet"); 
       StaticJsonBuffer<200> jsonBuffer;       StaticJsonBuffer<200> jsonBuffer;
       JsonObject& json = jsonBuffer.parseObject(incomingPacket);       JsonObject& json = jsonBuffer.parseObject(incomingPacket);
Line 136: Line 148:
         blue     = json["blue"];         blue     = json["blue"];
         refresh  = json["refresh"];         refresh  = json["refresh"];
 +        pixel    = json["pixel"];
         all      = json["all"];         all      = json["all"];
         clearall = json["clearall"];         clearall = json["clearall"];
 +        scroll   = json["scroll"];
 +        effect   = json["effect"];
 +        option1  = json["option1"];
       }       }
     }     }
Line 144: Line 160:
 //    Serial.println("send UDP response"); //    Serial.println("send UDP response");
 //    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); //    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
-//    Udp.write(replyPacket);+//    Udp.write(replyPacekt);
 //    Udp.endPacket(); //    Udp.endPacket();
   }   }
  
-  // new refresh rate received+  // new refreshrate received
   if (refresh > 0) {   if (refresh > 0) {
     Serial.println("new refresh rate received");     Serial.println("new refresh rate received");
Line 154: Line 170:
   }   }
  
-  // set all pixel to black if clearall was set to 1+  // change of scroll parameter 
 +  if (scroll > 0) { 
 +    Serial.printf("change scroll: %i", scroll); 
 +    if (scroll == 1) { 
 +      shiftpixels = 1; 
 +    } else { 
 +      shiftpixels = 2; 
 +    } 
 +  } 
 + 
 +  // set all pixel to color
   if(all == 1) {   if(all == 1) {
-//    Serial.println("set all pixels");+    Serial.printf("set all pixels -> red: %i, green: %i, blue: %i", red, green, blue);
     for(int i=0; i<NUMPIXELS; i++) {     for(int i=0; i<NUMPIXELS; i++) {
       pixels.setPixelColor(i, pixels.Color(red,green,blue));       pixels.setPixelColor(i, pixels.Color(red,green,blue));
Line 164: Line 190:
   // set all pixel to black if clearall was set to 1   // set all pixel to black if clearall was set to 1
   if(clearall == 1) {   if(clearall == 1) {
-//    Serial.println("clear all received");+    Serial.println("clear all received");
     for(int i=0; i<NUMPIXELS; i++) {     for(int i=0; i<NUMPIXELS; i++) {
       pixels.setPixelColor(i, pixels.Color(0,0,0));       pixels.setPixelColor(i, pixels.Color(0,0,0));
Line 171: Line 197:
  
   //shift pixels    //shift pixels 
-  for(int i=NUMPIXELS; i>=0; i--) { +  if (shiftpixels == 2) { 
-    uint32_t color = pixels.getPixelColor(i); +//    Serial.println("shift pixels"); 
-    pixels.setPixelColor(i+1, color);+    for(int i=NUMPIXELS; i>=0; i--) { 
 +      uint32_t color = pixels.getPixelColor(i); 
 +      pixels.setPixelColor(i+1, color); 
 +    }
   }   }
  
-  //set color of Pixel 0+  if (effect == 1) { 
 +    if (option1 == 0) { option1 = 128; } 
 +    fade(option1); 
 +  }  
 +  else if (effect == 2) { 
 +    if (option1 == 0) { option1 = 20; } 
 +    rainbow(option1); 
 +  } 
 +  // set color of Pixel
   // new color proviced color changed?   // new color proviced color changed?
-  if (red >=0 || green >=0 || blue >=0) {+  else if (red >0 || green >0 || blue >0) {
     //read current color     //read current color
     uint32_t CurrentColor = pixels.getPixelColor(1);     uint32_t CurrentColor = pixels.getPixelColor(1);
Line 185: Line 222:
     uint8_t  CurrentBlue  = CurrentColor;     uint8_t  CurrentBlue  = CurrentColor;
  
-    //if new color < 0 reuse the old color +    // if no new color was set -> reuse the old color 
-    if (red   0) {red   = CurrentRed;+    if (red   == 0) {red  = CurrentRed;
-    if (green 0) {green = CurrentGreen;+    if (green == 0) {green = CurrentGreen;
-    if (blue  0) {blue  = CurrentBlue;+    if (blue  == 0) {blue  = CurrentBlue;
-     + 
-//    Serial.printf("New color LED 0 -> red: %i, green: %i, blue: %i", red, green, blue); +    // set pixel 0 in case no spesific pixel was requested 
-    pixels.setPixelColor(0, pixels.Color(red,green,blue));+    if (pixel == 0) { 
 +//      Serial.printf("New color LED 0 -> red: %i, green: %i, blue: %i \n", red, green, blue); 
 +      pixels.setPixelColor(0, pixels.Color(red,green,blue)); 
 +    } else { 
 +      // if spesific pixel was request change the color and also copy pixel 1 to pixel 0 
 +//      Serial.printf("New color LED %i -> red: %i, green: %i, blue: %i \n", pixel, red, green, blue); 
 +      pixels.setPixelColor(pixel, pixels.Color(red,green,blue)); 
 +      if (shiftpixels == 2) { 
 +        uint32_t color = pixels.getPixelColor(1); 
 +        pixels.setPixelColor(0, color); 
 +      } 
 +    }
   } else {   } else {
 //    Serial.printf("no new color"); //    Serial.printf("no new color");
-    uint32_t color = pixels.getPixelColor(1); +    if (shiftpixels == 2) { 
-    pixels.setPixelColor(0, color);+      uint32_t color = pixels.getPixelColor(1); 
 +      if (alwaysoff = 1) { 
 +        pixels.setPixelColor(0, color); 
 +      } else { 
 +        pixels.setPixelColor(0, 0, 0, 0); 
 +      } 
 +    }
   }   }
  
Line 201: Line 255:
  
   delay(displayrefresh);   delay(displayrefresh);
 +}
 +
 +// Effects
 +void fade(int maxBrightness){
 +  for(int brightness = 0; brightness < maxBrightness; brightness++) { 
 +    for(int i = 0; i < NUMPIXELS; i++ ) {
 +      pixels.setPixelColor(i, pixels.Color(0, brightness, 0));
 +    }
 +    pixels.show();
 +    delay(5);
 +  }
 +  // Fade OUT
 +  for(int brightness = maxBrightness; brightness >= 0; brightness--) { 
 +    for(int i = 0; i < NUMPIXELS; i++ ) {
 +      pixels.setPixelColor(i, pixels.Color(0, brightness, 0));
 +    }
 +    pixels.show();
 +    delay(5);
 +  }
 +}
 +
 +void rainbow(uint8_t wait) {
 +  uint16_t i, j;
 +
 +  for(j=0; j<256; j++) {
 +    for(i=0; i < NUMPIXELS; i++) {
 +      pixels.setPixelColor(i, Wheel((i+j) & 255));
 +    }
 +    pixels.show();
 +    delay(wait);
 +  }
 +  for(int i=0; i<NUMPIXELS; i++) {
 +    pixels.setPixelColor(i, pixels.Color(0,0,0));
 +  }
 +  pixels.show();
 +}
 +
 +uint32_t Wheel(byte WheelPos) {
 +  WheelPos = 255 - WheelPos;
 +  if(WheelPos < 85) {
 +    return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
 +  }
 +  if(WheelPos < 170) {
 +    WheelPos -= 85;
 +    return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
 +  }
 +  WheelPos -= 170;
 +  return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
 } }
 </code> </code>
Line 247: Line 349:
 </code> </code>
  
-===== SNMP Example ======+===== snmp2neopixel.sh ======
 <code> <code>
-Todo+#!/bin/bash 
 + 
 +GATEWAYIP=192.168.x.1    #Your gateway 
 +SNMPCOMMUNITY=public     #snmp read community string 
 +INTNUMBER=1              #Interface number in SNMP; snmpwalk -v2c -c readcommstring <IP> | grep IF-MIB::ifName 
 +MESASURETIME=1           #Time in seconds between messurment 
 +INBOUNDBANDWIDTH=300000  #Max Interface bandwidth 
 +OUTBOUNDBANDWIDTH=100000 #Max Interface bandwidth 
 +MAXBRIGHTNESS=32         #NeoPixel brightness (max value = 255) 
 +NEOPIXELIP=192.168.x.10  #IP of your ESP8266 
 +NEOPIXELPORT=2342        #UDP port of your ESP8266 
 + 
 +while true; do 
 +  TIME=$(date +%s) 
 +  OUT=$(snmpget -v2c -c $SNMPCOMMUNITY $GATEWAYIP ifOutOctets.$INTNUMBER | awk '{print $4}'
 +  IN=$(snmpget -v2c -c $SNMPCOMMUNITY $GATEWAYIP ifInOctets.$INTNUMBER | awk '{print $4}'
 + 
 +  if [ -z "$OUT" ] || [ -z "$IN" ]; then 
 +     msg="Unable to retrieve SNMP info." 
 +     exit 2 
 +  else 
 +     sleep $MESASURETIME 
 +     TIME2=$(date +%s) 
 +     OUT2=$(snmpget -v2c -c $SNMPCOMMUNITY $GATEWAYIP ifOutOctets.$INTNUMBER | awk '{print $4}'
 +     IN2=$(snmpget -v2c -c $SNMPCOMMUNITY $GATEWAYIP ifInOctets.$INTNUMBER | awk '{print $4}'
 + 
 +     if [ "$OUT2" -gt "$OUT" ] || [ "$IN2" -gt "$IN" ] ; then 
 +       clear 
 +       if [ "$TIME2" == "$TIME" ]; then 
 +         TIME=1 
 +       fi 
 +       DELTAOUT=$(echo "$OUT2-$OUT" | bc) 
 +       DELTAIN=$(echo "$IN2-$IN" | bc) 
 +       DELTATIME=$(echo "$TIME2-$TIME" | bc) 
 +       INPUTBW=$(echo "$DELTAIN/$DELTATIME/1024" | bc) 
 +       OUTPUTBW=$(echo "$DELTAOUT/$DELTATIME/1024" | bc) 
 +       echo Inbound: $INPUTBW"KB/s" 
 +       echo Outbound: $OUTPUTBW"KB/s" 
 +       INPUTPERCENT=$(echo "$DELTAIN*8/$DELTATIME/$INBOUNDBANDWIDTH" | bc) 
 +       OUTPUTPERCENT=$(echo "$DELTAOUT*8/$DELTATIME/$OUTBOUNDBANDWIDTH" | bc) 
 +       echo Inbound %: $INPUTPERCENT"%" 
 +       echo Outbound %: $OUTPUTPERCENT"%" 
 +       RED=$(echo "($MAXBRIGHTNESS*$OUTPUTPERCENT/100)+1" | bc) 
 +       GREEN=$(echo "($MAXBRIGHTNESS*$INPUTPERCENT/100)+1" | bc) 
 +       echo "{red:$RED,green:$GREEN}" 
 +       echo "{red:$RED,green:$GREEN}" | nc -w 0 -u $NEOPIXELIP $NEOPIXELPORT 
 +     else 
 +      echo "no change" 
 +    fi 
 +  fi 
 +done 
 </code> </code>
  
 +
 +===== Webcam Motion Detection Notification =====
 +You can use a RPi, a webcam and [[https://github.com/Motion-Project/motion|Motion]] to send commands
 +<code>
 +on_event_start echo "{red:10,green:1,blue:1,all:1}" | nc -w 0 -u 192.168.x.x 2342
 +on_event_end echo "{red:1,green:1,blue:1,all:1}" | nc -w 0 -u 192.168.x.x 2342
 +</code>
projects/neopixel-bandwidth-room-light.1508056331.txt.gz · Last modified: 2017-10-15 08:32 by trinitor