Hallo,
irgendwie scheinen die Daten, die in einem String (mit großem S) gespeichert werden wohl eine besondere Klasse zu sein. Ich verstehe nur nicht wie. Nachdem ich mich jetzt durch einiges durchgelesen habe, komme ich immer noch nicht weiter.
Ich wollte, vorerst zu Testzwecken, ein paar Leds ein und ausschalten. Zu diesem Zweck werden Befehle von einem kleinen Java-Programm via Ethernet an den Arduino uebergeben.
Der Befehl fuer Einschalten sieht dann so aus: setport21
Dabei ist die erste Zahl die Pinnummer und die zweite Zahl die Funktion (1 = Ein, 0 = Aus).
Nachfolgender Code funktioniert so wie er soll:
#include <SPI.h>
#include <Ethernet.h>
// network configuration. gateway and subnet are optional.
// the media access control (ethernet hardware) address for the shield:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x1D, 0x59 };
//the IP address for the shield:
byte ip[] = { 192, 168, 123, 170 };
// the router's gateway address:
byte gateway[] = { 192, 168, 123, 253 };
// the subnet:
byte subnet[] = { 255, 255, 255, 0 };
// server starten port 50290
EthernetServer server = EthernetServer(50290);
// String fuer die eingegebenen Daten
String Eingang;
void setup()
{
// initialize the ethernet device
Ethernet.begin(mac, ip, gateway, subnet);
// start listening for clients
server.begin();
}
void loop()
{
// if an incoming client connects, there will be bytes available to read:
EthernetClient client = server.available();
while (client.available()) {
// Eingabe vom Client entgegen nehmen
// Ein Zeichen einlesen
char einzel = client.read();
// Zeichenkette zusammensetzen
Eingang += einzel;
}
// Wenn digitale Ports geschaltet werden sollen (set)
if (Eingang.substring(0,3) == "set"){
// Abtesten welcher Digital-Port gewuenscht wird (hier 2)
if (Eingang.substring(7,9) == "21"){
// Port als Ausgang schalten
pinMode(2, OUTPUT);
// Einschalten
digitalWrite(2, HIGH);
}
else if (Eingang.substring(7,9) == "31"){
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
}
else if (Eingang.substring(7,9) == "41"){
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
}
else if (Eingang.substring(7,9) == "51"){
pinMode(5, OUTPUT);
digitalWrite(5, HIGH);
}
else if (Eingang.substring(7,9) == "61"){
pinMode(6, OUTPUT);
digitalWrite(6, HIGH);
}
else if (Eingang.substring(7,9) == "71"){
pinMode(7, OUTPUT);
digitalWrite(7, HIGH);
}
else if (Eingang.substring(7,9) == "81"){
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
}
else if (Eingang.substring(7,9) == "91"){
pinMode(9, OUTPUT);
digitalWrite(9, HIGH);
}
// Abtesten welcher Digital-Port gewuenscht wird (hier 2)
if (Eingang.substring(7,9) == "20"){
// Port als Ausgang schalten
pinMode(2, OUTPUT);
// Ausschalten
digitalWrite(2, LOW);
}
else if (Eingang.substring(7,9) == "30"){
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
}
else if (Eingang.substring(7,9) == "40"){
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
}
else if (Eingang.substring(7,9) == "50"){
pinMode(5, OUTPUT);
digitalWrite(5, LOW);
}
else if (Eingang.substring(7,9) == "60"){
pinMode(6, OUTPUT);
digitalWrite(6, LOW);
}
else if (Eingang.substring(7,9) == "70"){
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
}
else if (Eingang.substring(7,9) == "80"){
pinMode(8, OUTPUT);
digitalWrite(8, LOW);
}
else if (Eingang.substring(7,9) == "90"){
pinMode(9, OUTPUT);
digitalWrite(9, LOW);
}
}
Eingang ="";
}
Nun habe ich versucht das Ganze etwas kuerzer zu schreiben:
#include <SPI.h>
#include <Ethernet.h>
// network configuration. gateway and subnet are optional.
// the media access control (ethernet hardware) address for the shield:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x1D, 0x59 };
//the IP address for the shield:
byte ip[] = { 192, 168, 123, 170 };
// the router's gateway address:
byte gateway[] = { 192, 168, 123, 253 };
// the subnet:
byte subnet[] = { 255, 255, 255, 0 };
// server starten port 50290
EthernetServer server = EthernetServer(50290);
// String fuer die eingegebenen Daten
String Eingang;
void setup()
{
// initialize the ethernet device
Ethernet.begin(mac, ip, gateway, subnet);
// start listening for clients
server.begin();
}
void loop()
{
// if an incoming client connects, there will be bytes available to read:
EthernetClient client = server.available();
while (client.available()) {
// Eingabe vom Client entgegen nehmen
// Ein Zeichen einlesen
char einzel = client.read();
// Zeichenkette zusammensetzen
Eingang += einzel;
}
// Wenn digitale Ports geschaltet werden sollen (set)
if (Eingang.substring(0,3) == "set" && Eingang.substring(7,8) == "1"){
// Port als Ausgang schalten
pinMode(int(Eingang.substring(7,8)), OUTPUT);
// Einschalten
digitalWrite(int(Eingang.substring(7,8)), HIGH);
}
Eingang ="";
}
Hier bekomme ich bei der Zeile:
pinMode(int(Eingang.substring(7,8)), OUTPUT);
den Fehler "invalid cast from type 'String' to type 'int'".
Irgendwie passen die Datentypen, trotz versuchter Konvertierung, nicht zusammen.
Kann mir da jemand helfen
Gruß
Christoph