Mehrere Variablen an Arduino schicken

Hallo :slight_smile: Heute ist mein Arduino endlich gekommen "juhu".

Ich wollte ein kleines Programm in C# schreiben, mit dem ich die LED ein und ausschalten kann, und die delay zeiten regeln kann.

Ein/Aus funktioniert wunderbar. Ich schicke mit serialPort1.write(signal) eine 1 oder eine 0 um die LED anzusteuern.

So jetzt zum Problem. Ich möchte jetzt noch zusätzlich eine zweite variable an den mc schicken, in der ich die delay zeiten für den LED status übermittle.

val = Serial.read();      

  if (val > '0' && val <= '9' ) {
   val = val - '0';          
   for(int i=0; i<val; i++) {
    Serial.println("blink!");
    digitalWrite(ledPin,HIGH);
    delay(zeit);                         wie kriege ich die zahl aus dem string (val) in die variable zeit?
    digitalWrite(ledPin, LOW);
    delay(zeit);
   }
   //Serial.println();
 }
}

Dankeeeeeeee

Hi,

wenn Du nur eine einzige Zahl sendest sähe das einfachste Programm so aus:

if (Serial.available()>0){
warte = 100 * Serial.read();
}
digitalWrite(ledPin,HIGH);
delay(warte);
digitalWrite(ledPin, LOW);
delay(warte);

Und wenn ich zusätzlich sagen möchte wie oft meine led blinken soll?

Hat keiner eine Idee ? :frowning:

Ich möchte nur ein An oder Aus und die "delay" Zeit von 0 - 2000 an Arduino schicken.

LG

für delay nimmt man keine variablen siehe hier :

http://www.mikrocontroller.net/topic/208639#new

hmmm..., ich stelle fest, mit der arduino-proggerei wird wild gegen die winavr-c-regeln verstossen.
es gbt noch andere brandnester in den fertigen routinen, die ein flächenbrand hinsichtlich des speicherverbrauches verursachen.

gruss

für delay nimmt man keine variablen

Kannst Du das bitte genauer erklären. Ich habe keine Begründung gefunden.

Hat keiner eine Idee

Doch. Du musst dann halt z.B. folgende Zeichenkette schicken $$1,2000** Danach die ankommenden Bytes nach einem $$ durchsuchen, alles in einen String schreiben, bis ** kommt. Nun den String zerlegen. Das erste Zeichen steht für ein oder aus, ab dem dritten Zeichen kommt dann die restliche Variable.

Das ist natürlich quick and dirty und geht noch viel schöner. Eine Einfache Sache wäre noch das delay auf 0-9 oder ein vielfaches zu beschränken. Dann könntest Du folgende Zeichen senden. S1 oder S0 für ein oder aus. D1 oder D5 für 0,1 Sekunde oder 0,5 Sekunden. Dann brauchst Du nur nach den Zeichen S oder D suchen und das nächste Zeichen enthält dann deine gewünschte Info.

Vorgehensweise einigermaßen klar geworden?

Gruß

Sebastian

Meine erste Idee ist IMMER erst einmal im Playground oder bei den Beispielen nachschauen. Erst dann wenn sich da nichts findet macht man sowas selber.

Schaut Euch doch mal Arduino Playground - Messenger an.

Udo

Meine erste Idee ist IMMER erst einmal im Playground oder bei den Beispielen nachschauen

Eine beliebte Methode ist (leider) auch direkt im Forum fragen. Nachlesen kann man ja später :wink: :wink:

hmmm..., da ist doch ein schönes beispiel drin , wie man einen festen wert in der delay hat, wie es gefordert wird und dann eben eine variable in der for-schleife , die sehr klein im binär-code gehalten wird :

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29

ein ausszug für unsere pusteblume zitat :
Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten konstanten Werten aufgerufen werden....

void long_delay(uint16_t ms)
{
    for(; ms>0; ms--) _delay_ms(1);
}

Sorry aber ich habe schon das ganze Internet durchforstet und finde kein passendes Beispiel. Aus deinen Links werde ich leider nicht schlauer und glaube dass die nicht mit dieser Problematik zu tun haben :confused:

Ich weiß wie ich das Problem lösen könnte, nur bräuchte ich ein Beispiel wie ich einen String zerlegen könnte.

Wie kann ich den folgenden String in ein Array zerlegen:
signal = "123456789"

array[0] = 1
array[1] = 2
etc.

Das würd mein Problem lösen

Danke

http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F

versuch mal damit...und les dir die ganze seite mal durch, da findest du sehr interessante stringfunktionen... :slight_smile:

manometer... :slight_smile:

Ich weiß wie es in C und anderen Sprachen geht, ich will es aber in meinem arduino scatch machen. da will ich den string den ich seriell empfangen habe zerlegen

sieh mal in der hilfe zu serial : Serial_Available.html

byte für byte empfangen in einem array und dann auswerten..., sag mal was ist da so schwierig?

Bei der Messenger Library ist ein Beispiel dabei. Auch im Playground, ganz unten.

Schau dir mal diesen Thread an:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1263206298

Die Lösung als Bibliothek heisst TextFinder:
http://www.arduino.cc/playground/Code/TextFinder

Danke für die Antworten,

ich habe das so versucht:

void get_data() {
  char data[80];
  int incount = 0;
  if ( Serial.available() )
  {
    while (Serial.available()) {
    data[incount++] = Serial.read();      
    }
    //data[incount] = '\0';  // puts an end on the string
    Serial.println(data);
}
}

So, das Problem sieht so aus:

Ich schicke seriell: 12345678

Als Antwort bekomme ich:
1
2
3
45

warum?
wenn ich jetzt noch mal was sende z.B. 9999
bekomme ich

678 zurück.

Serial.print.data[0] liefert auch keine ergebnisse, warum ?

Danke

irgendwie verstehst du das mit dem seriellen ablauf nicht.
wenn ich sichere daten empfangen möchte in "c" dann muss auch eine abstimmung stattfinden zwischen versender und verschicker sonst hast du nur den gurkensalt wie jetzt auch.
was meinst du wohl warum eine serielle schnittstelle 9 pins hat?....he...

jetzt lese dir das mal ganz durch mit dem uart..., da steht auch etwas vom empfang von zeichenketten...:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART

Hallo mazell
Du scheinst den Eingangsbuffer schneller zu leeren als Daten kommen.
Versuch mal:
eine schneller Baudrate einzustellen
oder ein delay (5) in die while Schleife zu geben.
Das "Serial.println(data);" muß nach dem "data[incount++] = Serial.read(); " stehen da Du ansonsten einige Zeichen nicht ausdrucken könntest.
Des weiteren sehe ich daß der Empfang nicht im Loop steht sondern in einer anderen Funktion. Slbald der Eingangsbuffer leer ist springst Du aus dieser Funktion und mußt sie für den Empfang der weiteren date wieder aufrufen.
Grüße Uwe

uwefed:
Hallo mazell
Du scheinst den Eingangsbuffer schneller zu leeren als Daten kommen.
Versuch mal:
eine schneller Baudrate einzustellen
oder ein delay (5) in die while Schleife zu geben.
Das "Serial.println(data);" muß nach dem "data[incount++] = Serial.read(); " stehen da Du ansonsten einige Zeichen nicht ausdrucken könntest.
Des weiteren sehe ich daß der Empfang nicht im Loop steht sondern in einer anderen Funktion. Slbald der Eingangsbuffer leer ist springst Du aus dieser Funktion und mußt sie für den Empfang der weiteren date wieder aufrufen.
Grüße Uwe

Danke Uwe, jetzt funktioniert es :slight_smile: Mir stellt sich nur die Frage, warum ich hinterher nicht mehr auf das array zugreifen kann (Außerhalb der while schleife) =? Die Ausgabe stimmt jetzt.
Wenn ich jetzt folgenden Code ausführe, passiert nichts:

Serial.println(data[0]);
Serial.println(data[1]);
Serial.println(data[2]);

Die Ausgabe bleibt leer hmm

ihr lasst die wesentlichen grundzüge der uart-programmiererung ausser acht.
sender und empfänger müssen sich immer verständigen wann daten losgeschickt werden und ankommen.

eine delay in der schleife ist unsinn, bremst nur den gesamten ablauf ab und nicht nur die uart-spielerei.

die zeit zum lesen der richtigen uart-handhabung sollte man schon haben, bevor man gross in die tasten haut und dem zufall der delay-bremse überlässt.

mit dem hammer kann man das ziel schlecht erreichen.

gruss