Pages: [1]   Go Down
Author Topic: Umwandlung von String zu Integer? [Webinterface für WS2812b-Steuerung]  (Read 58 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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("<br />");  //Zeilenumbruch
            client.print("Gr&#xfc;n: ");
              client.print("<input type=\"text\" name=\"green\" size=3>");
              client.print(valueGreen);
              client.println("<br />");
            client.print("Blau: ");
              client.println("<input type=\"text\" name=\"blue\" size=3>");
              client.print(valueBlue);
              client.println("<br />");
            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");
  }
}
Logged

Offline Offline
Faraday Member
**
Karma: 79
Posts: 2716
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Werfe die dämliche String Klasse ganz raus und verwende Standard C Strings

In C sind Strings nicht anderes als Null-terminierte char Arrays:
http://openbook.galileocomputing.de/c_von_a_bis_z/011_c_arrays_011.htm#mja452663858fd23e86c51cfa3b9139f64
http://www.c-howto.de/tutorial-strings-zeichenketten.html


Es gibt aber eine toInt() Methode in der String Klasse:
http://arduino.cc/en/Reference/StringToInt


Ansonsten besteht noch die Möglichkeit das auf Kosten von etwas Speicher in ein char Array zu wandeln:
http://arduino.cc/en/Reference/StringToCharArray

Letzteres wäre wesentlich besser wenn man sich ausnahmsweise mal an C++ orientiert hätte und einfach wie c_str() einen Zeiger auf das interne Array zurückgäbe. Aber nein, dann müsste man ja beachten, da nie reinzuschreiben.
So musst du halt einen Puffer anlegen der groß genug ist und den als Parameter übergeben. Dann kann man die normalen C Funktionen verwenden.


P.S.:
Du solltest für die String-Konstanten bei print()/println(), das F()-Makro verwenden, sonst verschwendest du hunderte Bytes RAM:
Code:
client.println(F("Text"));
Damit bleibt das im Flash
« Last Edit: April 02, 2014, 08:39:33 am by Serenifly » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke dir Serenifly. Ich habe jetzt einfach eine Umwanldung über .toInt gemacht und es funktioniert.

Da ich noch relativ neu in der Programmierung bin, werde ich mir mal deine Anmerkungen zu Strings und Arrays in C anschauen.

Deine Anmerkung zu den String-Konstanten print()/println() mit der Speicherung im Flash habe ich nun auch ergänzt.

Jetzt muss ich nur noch an der Optik arbeiten.



Logged

Pages: [1]   Go Up
Jump to: