Källkoden till Minlampa.eu

#include <Adafruit_NeoPixel.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>

#define PIN 6


// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(40, PIN, NEO_GRB + NEO_KHZ800);

byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x95, 0x3F};

IPAddress ip(192,168,0,99);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

int startValue = 255;
int red = startValue;
int green = startValue;
int blue = startValue;
int interval = startValue;
int brightness = 255;
String readString = "";
String lastValue = "";
const String RED = "red";
const String GREEN = "green";
const String BLUE = "blue"; 
const int RED_ADDRESS = 0;
const int GREEN_ADDRESS = 1;
const int BLUE_ADDRESS = 2;

void setup() {
  Serial.begin(9600);
  
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  strip.setBrightness(brightness);
  
  int tmpRed = EEPROM.read(RED_ADDRESS);
  int tmpGreen = EEPROM.read(GREEN_ADDRESS);
  int tmpBlue = EEPROM.read(BLUE_ADDRESS);
  if(tmpRed > 0 || tmpGreen > 0 || tmpBlue > 0){
    red    =  tmpRed;
    green  =  tmpGreen;
    blue   =  tmpBlue;
    colorWipe(strip.Color(red, green, blue));    
  }else{
    colorWipe(strip.Color(red, green, blue));
  }
  
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
    // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string 
          readString += c;
        } 
        
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: application/json");
          client.println("Connection: close");
          client.println();
          client.println(prepareHtml());
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
    
    String queryString = getQueryString(readString);
    
    if(getValue(queryString, RED).length() > 0)
    {
      red = getIntValue(getValue(queryString, RED));
      EEPROM.write(RED_ADDRESS, red);
      Serial.print("red:");
      Serial.println(red);
    }
    if(getValue(queryString, GREEN).length() > 0)
    {
      green = getIntValue(getValue(queryString, GREEN));
      EEPROM.write(GREEN_ADDRESS, green);
      Serial.print("green:");
      Serial.println(green);
    }
    if(getValue(queryString, BLUE).length() > 0)
    {
      blue = getIntValue(getValue(queryString, BLUE));
      EEPROM.write(BLUE_ADDRESS, blue);
      Serial.print("blue:");
      Serial.println(blue);
    }
    
    //clearing string for next read
    readString="";
    queryString="";
  
    colorWipe(strip.Color(red, green, blue));
    setBrightness(brightness);
    Serial.print(lastValue);
  } // client
}

void setBrightness(int brightness){
  strip.setBrightness(brightness);
}

String prepareHtml(){
  String html = "{\"status\":\"ok\"}";
  int tmpRed = EEPROM.read(RED_ADDRESS);
  int tmpGreen = EEPROM.read(GREEN_ADDRESS);
  int tmpBlue = EEPROM.read(BLUE_ADDRESS);
  if(tmpRed > 0 || tmpGreen > 0 || tmpBlue > 0){
    html = "{\"status\":\"ok\", \"rgb\":["+String(tmpRed)+","+String(tmpGreen)+","+String(tmpBlue)+"]}";
  }else{
    html = "{\"status\":\"ok\", \"rgb\":["+String(startValue)+","+String(startValue)+","+String(startValue)+"]}";
  }
  return html;
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
  }
}

int getIntValue(String value){
  int tmpValue = value.toInt();
  if(tmpValue > 255){
    return 255;
  }
  if(tmpValue < 0){
    return 0;
  }
  
  return tmpValue;
}

String getValue(String queryString, String param){
  
  if(queryString.indexOf("?") > -1 && queryString.indexOf(param) > -1){    
    //Serial.print(param);Serial.println(queryString.indexOf('?') > -1 && queryString.indexOf(param) > -1);
    int paramPos = queryString.indexOf(param) + 1 + param.length();
    int AndCharPosOrLength = queryString.indexOf("&",paramPos);
    if(paramPos > 0){
      if(AndCharPosOrLength == -1){
        AndCharPosOrLength = queryString.length();
      }
      return queryString.substring(paramPos, AndCharPosOrLength);
    }
  }
  return "";
}

String getQueryString(String httpHeader){
  String startString = "GET /";
  String endString = " HTTP/1.1";
  int startPos = httpHeader.indexOf(startString) + startString.length();
  int endPos = httpHeader.indexOf(endString, startPos);

  if(startPos > 0 && endPos > 0){
    Serial.println(httpHeader.substring(startPos, endPos));
    return httpHeader.substring(startPos, endPos);
  }
  return "";
}

Publicerat av

Peter Lindblom

Mer info om mig finns på sidan http://plweb.se/om-peter-lindblom/

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *