Moin,
Ich bin gerade dabei meine WS2812b-LEDs über ein Webinterface, welches auf meinem Arduino Uno mit Ethernet Shield läuft, zu steuern. Zuerst sollen nur die Werte der Farben (Rot, Grün, und Blau) gesetzt werden. Weitere Funktionen werden dann später noch ergänzt werden.
Der Webserver auf dem Arduino funktioniert bereits, jedoch besteht mein Problem darin, dass ich aus dem HTML-Formular, wo ich meine Farbwerte eintrage, die Daten als String erhalte. Für das Setzten der Farbe (hierfür verwende ich die FastLED-Bibliothek) benötige ich jedoch Integer-Werte (soweit ich dies verstanden habe).
Mein erster Gedanke war die Umwandlung über atoi. Dieser wandelt aber leider nur CHARS in INTEGER um. Habt ihr Ideen wie ich die Farbwerte umwandeln kann?
Grüße
Optex
#include <FastLED.h>
#include <SPI.h>
#include <Ethernet.h>
// ========================= VARIABLEN =========================
// Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,236);
EthernetServer server(80); // Initialize the Ethernet server library
// LED
#define NUM_LEDS 222 // LED Anzahl
#define DATA_PIN 9 // Datenpin
int red, green, blue;
CRGB leds[NUM_LEDS]; // Define the array of leds
//HTML
String get_request; // Get-Anfrage
int firstEqualSign;
int secondEqualSign;
int thirdEqualSign;
int firstAmpersand;
int secondAmpersand;
int lastSpace;
String valueRed;
String valueGreen;
String valueBlue;
// ========================= Setup =========================
void setup()
{
//Ethernet
Serial.begin(9600); // Open serial communications and wait for port to open:
Ethernet.begin(mac, ip); // start the Ethernet connection and the server
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
// LED
FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
}
// ========================= Loop =========================
void loop() {
EthernetClient client = server.available(); // listen for incoming clients
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();
get_request +=c; // Speichern der HTTP Abfrage in der Variablen get_request
if (c == '\n' && currentLineIsBlank)
{
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// HTML-Form
client.println("<form method=\"get\">");
client.print("Rot: ");
client.println("<input type=\"text\" name=\"red\" size=3>");
client.print(valueRed);
client.println("
"); //Zeilenumbruch
client.print("Grün: ");
client.print("<input type=\"text\" name=\"green\" size=3>");
client.print(valueGreen);
client.println("
");
client.print("Blau: ");
client.println("<input type=\"text\" name=\"blue\" size=3>");
client.print(valueBlue);
client.println("
");
client.println("<input type=submit value=\"Senden\">");
client.println("</form>");
client.println("</html>");
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;
// GET-Request verarbeiten und Farbwerte extrahieren
// Beispiel: GET /?red=1&green=2&blue=3 HTTP/1.1
}
firstEqualSign = get_request.indexOf("=");
firstAmpersand = get_request.indexOf("&");
valueRed = get_request.substring(firstEqualSign+1, firstAmpersand); // 1
secondEqualSign = get_request.indexOf("=", firstAmpersand);
secondAmpersand = get_request.indexOf("&", secondEqualSign);
valueGreen = get_request.substring(secondEqualSign+1, secondAmpersand); // 2
thirdEqualSign = get_request.indexOf("=", secondAmpersand);
lastSpace = get_request.indexOf(" ", secondEqualSign);
valueBlue = get_request.substring(thirdEqualSign+1, lastSpace);
}
}
Serial.println(valueRed); // Farbwert für Rot als String
Serial.println(valueGreen);
Serial.println(valueBlue);
Serial.println(red); // Farbwert für Rot als Integer
Serial.println(green);
Serial.println(blue);
// LED Farbe setzten
memset(leds, 0, NUM_LEDS) ;
for(int i = 1; i < NUM_LEDS; i++) // alle LEDs auswählen
{
//leds[i].setRGB(0,128,255); - Magenta
leds[i].setRGB(red, green, blue); // Farbe setzten
}
FastLED.show();
get_request = ""; // //Löschen des String-Inhalts
delay(1);
client.stop(); // // Schließen der Verbindung
Serial.println("client disonnected");
}
}