Moin leute, habe heute meinen 1. Arduino bekommen. Bisher nur die Platine, elektronikzeug kommt im laufe der nächsten woche
Aber ich kann ja zumindest schonmal mit der onboard-LED rumexperimentieren
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:
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
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
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
}
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
@ 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");
}
}
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!