[Anfänger] Warten auf Dateneingabe/Wert

Moin leute, habe heute meinen 1. Arduino bekommen. Bisher nur die Platine, elektronikzeug kommt im laufe der nächsten woche :slight_smile:

Aber ich kann ja zumindest schonmal mit der onboard-LED rumexperimentieren :slight_smile:

Soweit sogut, kleine sachen hab ich schon hinbekommen.

Nun möchte ich eine Abfrage starten und anhand zweier werte (Zahlen, wenn möglich zwei- oder dreistellig) eine berechnung durchführen, die bei überschreiten eines wertes die LED anschaltet.

Nun zum Problem:

  1. Weiss ich nicht welchen Datentyp ich nehmen kann, um eine 2 oder 3-stellige zahl eingeben zu können.
    int var1 = 1; geht anscheinend nicht, da bie mir nach eingeben einer zweistelligen zahle nur die erste angenommen wird

  2. wie kann ich die loop anhalten, um auf eine Dateneingabe zu warten?!
    Bsp.:
    "Bitte 1. Zahl eingeben:" -> Warten auf eingabe -> Zahl eingegeben -> "Bitte 2.Zahl eingeben" -> Warten auf eingabe -> zahl eingegeben -> berechnung -> je nach wert LED an oder aus

Freu mich schon auf nen tTipp

MrSliff

Wie gibst Du die Zahlen ein?

über die serial-konsole in der arduino-ide

MrSliff:
2. wie kann ich die loop anhalten, um auf eine Dateneingabe zu warten?!
Bsp.:
"Bitte 1. Zahl eingeben:" -> Warten auf eingabe -> Zahl eingegeben -> "Bitte 2.Zahl eingeben" -> Warten auf eingabe -> zahl eingegeben -> berechnung -> je nach wert LED an oder aus

Blockierende Programme sind Quatsch.
Wenn Du so einen Quatsch tatsächlich programmieren möchtest, kannst Du den Controller mit

while (!Serial.available());

in eine enge Warteschleife zwingen, die so lange läuft, bis ein Zeichen im seriellen Eingangspuffer angekommen ist.

Beispielprogramm:

void setup() {
  Serial.begin(9600);
}

int intInput()
{
  char str[10];
  int charcount=0;
  memset(str,0,sizeof(str)); // String-Puffer löschen
  while (!Serial.available()); // Warten bis 1. Zeichen im Eingangspuffer
  delay(100); // Warten auf weitere Zeichen im Eigangspuffer
  while (Serial.available() && charcount<9)
  {
    str[charcount]=Serial.read(); // Zeichen aus Eingangspuffer lesen
    charcount++;
  }
  return atoi(str); // String in Integer-Rückgabewert wandeln
}

void loop() {
  Serial.print("Geben Sie Wert1 ein: ");
  int wert1=intInput();
  Serial.println(wert1);
  Serial.print("Geben Sie Wert2 ein: ");
  int wert2=intInput();
  Serial.println(wert2);
  Serial.print("Das Ergebnis Wert1 * Wert2 ist = ");
  long wert3=(long)wert1*wert2;
  Serial.println(wert3);
  Serial.println();
}

ok wenn du da 1, 2, 3 auf der Tastatur eintippst kommen über die serielle Schnittstelle die ashii-code der gedrückten Tasten. im Falle von 1 2 3 die Zahlen 49, 50 und 51 (dezimal)
Der unten angeführte Sketch nimmt bis zu 5 Zahlen entgegen und wandelt sie in eine Zahl um. Damit auch kleinere Zahlen übertragen werden können ohne vor der Zahl Nullen zu schreiben wartet der Sketch 0,5 Sekunden für die Übertragung.

int Zahl;   
char Data[5];                  //Anzahl der max Ziffernzahl -1 in diesem Fall eine 4-stellige Zahl
int i;                               //Arbeitsvariable
unsigned long Tempo;    // Startzeit für die Übertragung

void setup()
{
  Serial.begin(9600);
}

void loop(){
 
   do {
     if (Serial.available()) {       
       Data[i] = Serial.read();                        //liest die Zeichen nacheinander ein
       i++;
       }     
     if(i<1)Tempo = millis();                            // Startzeit abspeichern 
     } while (i<4 && (millis()-Tempo) < 500);  // schleife solange nicht 4 Zeichen übertragenoder 0,5 Sekunden vorbei sind
  
   Data[i] = 0;                                                // Abschluß der Zeichenkette mit Null für die Umwandlung
   Zahl = atoi(Data);                                      // Umwandlung Zeichenkette zu 
   i=0;
   Serial.println(Zahl);                                   // ausgabe der Zahl zu kontrolle
}

Grüße Uwe

Okay, danke schonmal, musste mir jetzt erstmal die einzelnen befehle anschauen, die ich noch nicht kannte, wie "atoi" z.B.

Ich werd denk ich mal den code vom uwe nehmen, aber trotzdem danke euch beiden :wink:

@ uwe: wird doe do->while-schleife erst nach tasteneingabe abgearbeitet oder wartet die auf die erste tasteneingabe, lässt den timer runterlaufen und geht dann erst weiter?! (erklärt sich fast von selbst, aber als bestätigung , dass ich richtig denke und die schleife solange wartet bis ne zahl eingegeben wurde)

int Zahl1;
int Zahl2;
char Data[5];                  //Anzahl der max Ziffernzahl -1 in diesem Fall eine 4-stellige Zahl
int i;                               //Arbeitsvariable
int a;
unsigned long Tempo;    // Startzeit für die Übertragung
int led = 13;


void setup()
{
  Serial.begin(9600);
  pinMode(led,OUTPUT);
}

void loop(){
 
   do {
     if (a == 0)
     {
       Serial.println("Bitte die 1. Zahl eingeben"); 
       a=a+1;
     }
     if (Serial.available()) {
       Data[i] = Serial.read();                        //liest die Zeichen nacheinander ein
       i++;
       }     
     if(i<1)Tempo = millis();                            // Startzeit abspeichern 
     } while (i<4&(millis()-Tempo) < 500);  // schleife solange nicht 5 Zeichen übertragenoder 0,5 Sekunden vorbei sind
  
   Data[i] = 0;                                                // Abschluß der Zeichenkette mit Null für die Umwandlung
   Zahl1 = atoi(Data);                                      // Umwandlung Zeichenkette zu 
   i=0;
   a=0;
   Serial.print("Die 1. Zahl ist: ");
   Serial.println(Zahl1);                                   // ausgabe der Zahl zu kontrolle
   
   do {
     if (a ==0) 
     {
       Serial.println("Bitte die 2. Zahl eingeben"); 
       a=a+1;
     }
     if (Serial.available()) {       
       Data[i] = Serial.read();                        //liest die Zeichen nacheinander ein
       i++;
       }     
     if(i<1)Tempo = millis();                            // Startzeit abspeichern 
     } while (i<4&(millis()-Tempo) < 500);  // schleife solange nicht 5 Zeichen übertragenoder 0,5 Sekunden vorbei sind
     
     Data[i] = 0;
     Zahl2 = atoi(Data);
     i=0;
     Serial.print("Die 2. Zahl ist: ");
     Serial.println(Zahl2);
     
     if (Zahl1 - Zahl2 >=10)
     {
       digitalWrite(led,HIGH);
       Serial.println("LED an");
     }
     else
     {
       digitalWrite(led,LOW);
       Serial.println("LED aus");
     }
}

noch ne Frage:

der Befehl

Data = 0;
fügt eine Ziffer an die letzte stelle in der Variablen/Speicher "i" ein?
D.h. bei der Folge
Data = 1;
Data = 2;
Data = 3;
Data *= 0; *
würde in "i" -> 1230 stehen?
Edit: ups, da soll natürlich ein i in rechteckigen Klammern nach dem "Data" stehen!

Setzte das in Code Tags (siehe Rauten Symbol #), dann passiert das nicht.

Ansonsten ja. Lies dir vielleicht mal was zu Arrays durch. z.B.:

ah alles klar, danke für den link, die seite kommt direkt mal in meine arduino-bookmarks :slight_smile: