Eine 2-stellige Zahl (char Array) in eine int Zahl konvertieren (gelöst)

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);

}

Dass hab ich noch gefunden, hilft mir aber auch nicht weiter.
http://forum.arduino.cc/index.php/topic,44151.0.html

Würde mich freuen, wenn jemand mal kurz drüber schauen könnte, Danke =)

Gruß

Morris

Hallo,

füge mal am Anfang "#include <stdlib.h>" (ohne Anführungszeichen) ein.

Gruß,
Ralf

Ich könnte mir nicht vorstellen, hier atoi zu nutzen. Rechne doch einfach erste Zahl mal 10 plus zweite Zahl.

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.

Serenifly:
Ich glaube es liegt daran, dass du nicht den korrekten ASCII-Code einträgst. '0' ist nicht ASCII 0, sondern 48.

Glaube ich auch.
Grüße Uwe

Schachmann:
Hallo,

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.

Glaube ich auch.
Grüße Uwe

Danke, werde es mal demnächst ausprobieren.

p.s. Hab mein Problem lösen können, danke

#include <stdlib.h>

char Data[2];
int i;
int zahl=0;

int button = 0; 
const int analogInPin = A0;

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

}

char 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 'e';
   if (button <= 920 && button >= 860)
  return '0'; 
  else return 32; 
}

void loop() {
int buttonkey = getkey();

if (buttonkey == '9')
{
Serial.print("Max Temperatur\n");
Serial.print(zahl);
}
if (buttonkey == 'e')
{
 
Serial.print("\nTemp eingeben\n");

do {
  int key = getkey();
 
  Serial.write(key);
  Serial.print("\n"); 
  delay(2000);
  if (key <= 57 && key >= 48)
  {
    Serial.write(key);
    Data[i] = key;
    i++;
    Serial.print(" OK\n");
  }
  
} while (i<2);



  zahl = atoi(Data);
  
  Serial.print("Schalt-Temperatur\n");
  Serial.print(zahl);
  Serial.write(42);
  Serial.write(67);
  delay(5000);

}

Serial.print(" _");
delay(2500);

}

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);

Grüße Uwe

Danke, habs schon =). Siehe oben :slight_smile:

Oder data[3] = '\0' um es ganz deutlich zu machen, dass NULL gemeint ist :slight_smile:

meisner:
Danke, habs schon =). Siehe oben :slight_smile:

Du hattest
Data[3]='0'
geschrieben und nicht
Data[3]=0;
oder
data[3] = '\0';

Grüße Uwe