Sida 1 av 1

Vad är Arduinon's motsvarighet till scanf() ?

Postat: 6 november 2013, 09:18:04
av Al_Bundy
Hej!

Jag vill mata in int/floats/charachters in en variabel men det ska fungera så att programmet ska vänta på en tills man har skrivit in det man vill t.ex en mening eller ett ord eller ett decimaltal eller heltal och sedan avsluta med enter eller någon annan knapp.

Jag har en 4x4 keypad och jag har lyckats få den skriva ut "1" till "9" och "0" och "*", "A" till "D".

Koden ser ut så här.
Har ni något förslag på scanf() ?

Kod: Markera allt

#include <Keypad.h>

const byte ROWS = 4; //4 rader
const byte COLS = 4; //4 kolumer
char keys[ROWS][COLS] = {
  {'1','2','3', 'A'},
  {'4','5','6', 'B'},
  {'7','8','9', 'C'},
  {'*','0','#', 'D'}
};
byte rowPins[ROWS] = {46, 48, 50, 52}; //anslut dessa i de digitala pinnar.
byte colPins[COLS] = {38, 40, 42, 44}; //samma här också. 

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char key = keypad.getKey();
  
  if (key){
    Serial.println(key);
  }
}
Koden fungera så att när man trycker på en knapp t.ex "2" så skriver den ut "2" på monitor.
Men jag vill sätta ihop flera värden/ord och avsluta med t.ex "B" eller "A".

Om man skulle skippa denna kod

Kod: Markera allt

if (key){
    Serial.println(key);
}
Så skulle man skriva ut bokstaven eller nummret man skriver och den försvinner lika snabbt som den kommer upp på skärmen, dvs processorns hastighet. Det bara blinka till typ.

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 6 november 2013, 10:09:39
av Icecap
Men... vad är problemet? Har inte Arduino färdiga rutiner för det också? Eller måste du faktisk programmera på riktigt nu?

Nåväl, svaret är enkelt: du måste skapa en buffer som du kan lagra texten i, t.ex.:
char Buffer[10]; // Max 9 tecken + EOL

Då kan du addera texten till den buffer om du först initierar den vid att skrive:
Buffer[0] = 0; // Lägger in en EOL

Sedan kan du, för varje tecken som kommer, lägga till det i buffern:

Kod: Markera allt

if(key && (strlen(Buffer) < (sizeof(Buffer)-1))
  {
  sprintf(Buffer + strlen(Buffer), "%c", key);
  Serial.println(Buffer);
  }
Enda problemet är hur du sedan tömmer buffern när det ska bli en ny sträng som ska matas in, där kan man använda time-out eller ett visst tecken eller liknande.

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 6 november 2013, 11:14:05
av Al_Bundy
Så du anser att man inte programmerar på riktigt när man programmerar en arduino?
Tack ialalfall! Jag ska söka upp det där om strlen().

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 6 november 2013, 11:21:06
av Icecap
Njaa... Du påstår ju att Arduino är så bra för att allt finns klart eller hur?
Eller menar du att du inte står för vad du skriver?

Förstå mig rätt: du får göra som du vill och du får tro att Arduino är gudarnas svar på µC allt du vet - men dina frågor visar att du har ytterst lite koll på vad du håller på med och någon dag inser du att du nog inte är så hjälpt som du tror. Jag anser att Arduino är en björntjänst helt enkelt.

Av det du har skrivit inser jag att ditt kunnande om t.ex. vad som sker när t-bordet avkodas är obefintligt osv., skulle du alltså behöva en specialiserat lösning som inte erbjuds färdig i Arduino-paketet eller på nätet kommer du att stå handfallen och undra vad som hände.

Så nej, jag anser inte att du programmerar över DUPLO-nivå.

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 6 november 2013, 11:57:35
av Al_Bundy
Haft en dålig dag eller?
Jag frågade bara om det fanns någon scanf()-liknande metod i arduino. :)

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 6 november 2013, 12:09:20
av sodjan
> Jag frågade bara om det fanns någon scanf()-liknande metod i arduino.

"scanf arduino" i Google gav dessa två som de två första träffarna:
http://forum.arduino.cc/index.php?topic=120440.0
http://stackoverflow.com/questions/1827 ... o-language

> Enda problemet är hur du sedan tömmer buffern när det ska bli en ny sträng som ska matas in,

Buffer[0] = 0; // Lägger in en EOL

Det är ju ingen skillnad på att tömma bufferten från början och att tömma bufferten efteråt.
Rent tekniskt så "tömmer" man aldrig något, bara sätter EOL pekaren till första tecknet i båda fallen.

Om man ska vara säkerhetsmässigt helt korrekt, så kanske man även ska skriva 0 i hela bufferten,
men det är knappast nödvändigt i detta fall...

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 6 november 2013, 12:59:30
av Al_Bundy
Jag får köra en loop som räknar antal tecken och sedan omvandlar det till en float.
Kanske man ska använda en struct?

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 6 november 2013, 13:05:21
av sodjan
Det du först och främst ska fundera på om du faktiskt behöver
float över huvudtaget. Väldigt ofta beror användningen av float
enbart på dålig systemering av problemet från början.

http://arduino.cc/en/Reference/Float :

"Floating point math is also much slower than integer math in performing calculations,
so should be avoided if, for example, a loop has to run at top speed for a critical
timing function. Programmers often go to some lengths to convert floating point
calculations to integer math to increase speed."

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 6 november 2013, 18:39:46
av Icecap
scanf() är för att läsa ASCII till float. Ditt problem var att du inte ens kunde samla ihop strängen du ska omvandla till float.

Så nej, min dag är inte speciell dålig. Jag är dock ganska förvånat över att du inte ens vet vad du ber om hjälp om...

Sedan kan jag hålla med om att float i µC-sammanhang inte sällan är onödigt och kan dra ganska stora resurser. Men det finns tillfällen där man behöver det, de är dock sällsynta.

En lösning kan vara att t.ex. räkna internt i t.ex. 1/100-del av värdet och sedan i den "float"-omvandling som finns helt enkelt använder siffror innan komma som ett heltal - som ska multipliceras med 100 - och två (bara ett exempel) siffror efter kommat är ytterligare ett heltal som bara ska adderas till det totala värdet.

Då kan man mata in ett komma-tal men ändå jobba med heltalsmatte som är mer "skonsamt" för programstorlek och genomloppshastighet.

Och för att nollställa den mottagna strängen kan man göra exakt som sodjan beskriver, och det gör man när man har omvandlat den. Hur man sedan utlöser en omvandling beror ju på hur det hela ska fungera.

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 7 november 2013, 20:05:51
av olof_n
Hej!

Du kan precis som ovan har föreslagit lagra alla tecken i en char array.
Se nedan, koden fyller en char array tills max längd uppnås eller att du tryckt på *
Konverterar sedan strängen till en float.

if (bCharpos<maxlen && key!='*')
{
typedKeys[bCharpos]=key;
bCharpos++;
}
else
{
typedKeys[bCharpos]='\0';
flyttal=atof(typedKeys);
}

/Olof

Re: Vad är Arduinon's motsvarighet till scanf() ?

Postat: 7 november 2013, 21:52:10
av void
Icecap skrev:scanf() är för att läsa ASCII till float....
??
scanf() supporterar i stort sätt samma "placeholders" som printf().