Hallo,
ich lese mithilfe des Arduino, ein Tastenfeld 3x4 aus. Nun gebe ich 2 Ziffern ein, welche in einem char Array gespeichert werden.
Dieses Array möchte ich nun mit der Funktion atoi() also ascii to int in eine integer Zahl umwandeln und anzeigen lassen. Die Eingabe funktioniert soweit nur die Konvertierung will nicht.
Hier der Sketch
char Data[3];
int i;
int zahl=0;
int button = 0;
const int analogInPin = A0;
void setup()
{
Serial.begin(9600);
}
int getkey()
{
int button = analogRead(A0);
if (button <= 55 && button >= 20)
return 1;
if (button <= 90 && button >= 75)
return 2;
if (button <= 135 && button >= 125)
return 3;
if (button <= 175 && button >= 165)
return 4;
if (button <= 290 && button >= 250)
return 5;
if (button <= 390 && button >= 370)
return 6;
if (button <= 540 && button >= 475)
return 7;
if (button <= 700 && button >= 650)
return 8;
if (button <= 780 && button >= 750)
return 9;
if (button <= 850 && button >= 790)
return 100;
if (button <= 920 && button >= 860)
return 0;
else return 999;
}
void loop()
{
int buttonkey = getkey();
if (buttonkey == 9)
{
Serial.print("Max Temperatur\n");
Serial.print(zahl);
}
if (buttonkey == 100)
{
Serial.print("Temp eingeben\n");
do
{
int key = getkey();
Serial.print("Gedrueckt ");
Serial.print(key);
Serial.print("\n");
Serial.print(i);
delay(2000);
if (key <= 50 && key >= 0)
{
Serial.print(key);
Data[i] = key;
i++;
Serial.print(" OK\n");
}
} while (i<2);
Data[2] = '\0';
zahl = atoi(Data);
//Serial.print(zahl);
delay(5000);
}
Serial.print("-> ");
delay(2500);
}
Ich glaube es liegt daran, dass du nicht den korrekten ASCII-Code einträgst. '0' ist nicht ASCII 0, sondern 48. Siehe hier:
Wenn du also data[index] = key machst trägst du irgenwelche ASCII-Steuerzeichen ein. Du musst vorher +48, +0x30, oder +'0' machen. Oder lass die Methode gleich einen char zurückgeben. Das muss kein int sein.
füge mal am Anfang "#include <stdlib.h>" (ohne Anführungszeichen) ein.
Gruß,
Ralf
Danke, aber daran liegt es nicht
sth77:
Ich könnte mir nicht vorstellen, hier atoi zu nutzen. Rechne doch einfach erste Zahl mal 10 plus zweite Zahl.
Hmm da hast du Recht in dem Fall die bessere Variante, so mach ichs glaub jetz auch danke:).
Serenifly:
Ich glaube es liegt daran, dass du nicht den korrekten ASCII-Code einträgst. '0' ist nicht ASCII 0, sondern 48. Siehe hier: http://www.asciitable.com/
Wenn du also data[index] = key machst trägst du irgenwelche ASCII-Steuerzeichen ein. Du musst vorher +48, +0x30, oder +'0' machen. Oder lass die Methode gleich einen char zurückgeben. Das muss kein int sein.
Klingt logisch, hab es nämlich davor mit Serial.read gemacht da hat es funkioniert. Also mit Tastatur über die Serielle Schnittstelle.
Hab nur eine Frage, normal reicht es wenn ich die korrekten ascii codes habe, und mit der '0' als letzte Ziffer abbreche?
Also muss ich davor keine null setzen? bsp.
Data[0]='0'
Data[1]='2'
Data[2]='3'
Data[3]='0'//Abbruchbedingung
uwefed:
Serenifly:
Ich glaube es liegt daran, dass du nicht den korrekten ASCII-Code einträgst. '0' ist nicht ASCII 0, sondern 48.
Hab nur eine Frage, normal reicht es wenn ich die korrekten ascii codes habe, und mit der '0' als letzte Ziffer abbreche?
Also muss ich davor keine null setzen? bsp.
Data[0]='0'
Data[1]='2'
Data[2]='3'
Data[3]='0'//Abbruchbedingung
Nein.
um atoi() zu benutzen braucht Du ein array mit den ascii Code der Zahlen und einer Null am Ende (nicht ascii-Code von Null)
also:
Data[0]='1'; //49
Data[1]='2'; //50
Data[2]='3'; //51
Data[3]=0 ; // 0 Ende des Strings
Zahl = atoi(Data);