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
Last revision Both sides next revision
projects:neopixel-bandwidth-room-light [2017-10-15 08:25]
trinitor [Programm]
projects:neopixel-bandwidth-room-light [2017-12-23 11:33]
trinitor [snmp2neopixel.sh]
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 221: Line 323:
 http://esp8266.github.io/Arduino/versions/2.0.0/doc/ota_updates/ota_updates.html http://esp8266.github.io/Arduino/versions/2.0.0/doc/ota_updates/ota_updates.html
  
-===== Test =====+===== LED Test =====
 <code> <code>
 #!/bin/bash #!/bin/bash
 IP=192.168.x.x IP=192.168.x.x
 PORT=2342 PORT=2342
-for i in 16 48 96 256 128 64 32 16 1 +SLEEP=0.1 
-do + 
-   echo led intensity: $i +while : ; do 
-   echo "{red:$i,green:1,blue:1}"   | nc -w 0 -u $IP $PORT ; sleep 1 +for i in $(seq 32 -4 0); do 
-   echo "{red:1,green:$i,blue:1}"   | nc -w 0 -u $IP $PORT ; sleep 1 +     echo Led intensity: $i 
-   echo "{red:1,green:1,blue:$i}"   | nc --u $IP $PORT sleep 1 +     echo "{red:$i,green:0,blue:0}" | nc -w 0 -u $IP $PORT ; sleep $SLEEP 
-   echo "{red:$i,green:$i,blue:$i}" | nc -w 0 -u $IP $PORT ; sleep 1+  done 
 +  sleep 1 
 +for i in $(seq 32 -4 0); do 
 +     echo Led intensity: $i 
 +     echo "{red:0,green:$i,blue:0}" | nc -w 0 -u $IP $PORT ; sleep $SLEEP 
 +  done 
 +  sleep 1 
 +for i in $(seq 32 -0)do 
 +     echo Led intensity: $i 
 +     echo "{red:0,green:0,blue:$i}" | nc -w 0 -u $IP $PORT ; sleep $SLEEP 
 +  done 
 +  sleep 1
 done done
 </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>
  
 +
 +===== Motion detection notification =====
 +you can use a RPi, a webcam and [[https://github.com/Motion-Project/motion|Motion]] to change the color 
 +<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.txt · Last modified: 2017-12-23 11:49 by trinitor