avr_libc standard könyvtár
Az avr_libc egy, az Arduino telepítésével együtt installált könyvtár, ami egy egyszerű lib felhívással (#include<stdlib.h>) elérhető. A legtöbb funkciója az Arduino standard hívásokon keresztül is elérhető, de van néhány hasznos, ott meg nem található funkciója is.
Ennek a könyvtárnak nem feladata az összes AVR funkció közlése, csak néhány általam érdekesnek és hasznosnak tartott funkciót ismertetek itt.
Leírása itt található: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#g6c140bdd3b9bd740a1490137317caa44
Az oldalon is szereplő funkciók összefoglalása a referencia-oldalon található.
dtostrf()
float / double konvertálása karakter-lánccá, normál formátumban: „[-]d.ddd”.
Szintaktika
dtostrf (value, width, prec, out)
value (float, double): bemeneti érték
width (signed char): egész helyiérték pozíciók száma
prec (unsigned char): törtrész pozíciók száma
out (char*): kimenet
- A törtrészt, ha annak a megjelenítési helye kisebb, mint a számé, kerekíti.
- Az egészrész kezdeti üres pozícióit szóközzel tölti fel.
- Negatív with érték az eredményt balra igazítja, egyébként az igazítás jobbra történik
A funkció különösen előnyös I2C kommunikáció esetén; a mérésadatok továbbításához (lásd a lenti példát).
Példa
#include <Wire.h> char t[10]; //empty array where to put the numbers going to the master volatile int Val; // variable used by the master to sent data to the slave void setup() { Wire.begin(8); // Slave id #8 Wire.onRequest(requestEvent); // function to run when asking for data Wire.onReceive(receiveEvent); // what to do when receiving data Serial.begin(9600); // serial for displaying data on your screen } void loop() { int aRead = analogRead(A0); //plug a potentiometer or a resistor to pin A0, so you can see data being transfer float x = aRead/1024.0*5.0; //generate a float number, with this method you can use any time of data pretty much dtostrf(x, 3, 2, t); //convers the float or integer to a string. (floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, empty array); Serial.println(Val); // print the character delay(500); } // function: what to do when asked for data void requestEvent() { Wire.write(t); } // what to do when receiving data from master void receiveEvent(int howMany) {Val = Wire.read();}
dtostre()
float / double konvertálása karakter-lánccá, kitevős formátumban: „[-]d.ddde±dd”.
Szintaktika
dtostre (value, out, prec, flag)
value (float, double): bemeneti érték
out (char*): kimenet
prec (unsigned char): törtrész pozíciók száma
flag (unsigned char): egész helyiérték pozíciók száma
Ez a funkció nekem nem működött.
atoi()
Karakter-lánc konvertálása int-té.
Szintaktika
(int) = atoi (char*)
char*: bemeneti karakterlánc
A funkció visszatérési típusa: int. - A karakterlánc egész-részét konvertálja (a tizedespont előtt) - Nem ügyel a túlcsordulásra
Példa
#include<stdlib.h> char buff1[]="12345.67"; int i; void setup() { Serial.begin(9600); } void loop() { i = atoi(buff1); Serial.print(" :"); Serial.println(i); delay(100000); }
A monitor tartalma:
:12345
itoa()
int konvertálása Karakter-lánc-cá.
Szintaktika
itoa(val, char*, radix)
val (int/long): bemeneti int / long
char*: kimeneti karakterlánc
radix: szükséges buffer mérete, 2..36
Példa
char buf[12]; // "-2147483648\0" lcd.printIn(itoa(random(1024)-512, buf, 10));
atof()
Karakter-lánc konvertálása float-tá.
Szintaktika
(float) = atof (char*)
char*: bemeneti karakterlánc
A funkció visszatérési típusa: float - A karakterlánc tartalmát konvertálja (a tizedesértékekkel együtt) - Nem ügyel a túlcsordulásra
Példaként lásd: atoi
atol()
Karakter-lánc konvertálása long-gá.
Szintaktika
(long) = atol (char*)
char*: bemeneti karakterlánc
A funkció visszatérési típusa: long - Nem ügyel a túlcsordulásra
Példaként lásd: atoi
strtod()
Karakter-lánc konvertálása double-é.
Szintaktika
(long) = double strtod(const char *str, char **endptr)
str*: bemeneti karakterlánc
endptr: pointer, ami a konvertált karakterlánc utáni részre mutat
A funkció visszatérési típusa: double. - Érvénytelen művelet esetén 0.0-val tér vissza.
Példa:
// példaprogram: OB121, http://www.ob121.com/doku.php?id=hu:arduino:reference char str[30] = "20.30300 This is test"; char *ptr; double ret; void setup() { Serial.begin(9600); } void loop() { ret = strtod(str, &ptr); Serial.println(ret); delay(10000); }
qsort()
Tömb tartalmának a sorbarendezése.
Szintaktika
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
A qsort egy felhívandó eljárás az alábbi paraméterekkel:
base: az első elemre mutató pointer
nitems: a tömbelemek száma
size: egy elem mérete (byte-ban) a tömbben
compar: ez a funkció hasonlítja össze a tömbelemeket
Az eljárásnak nincs visszatérési értéke.
Példa
// OB121.com példaprogram - Vámos Sándor (2019) // Tömb sorbarendezés alkalmazása az Arduino-n int values[] = { 88, 56, 100, 2, 25 }; int cmpfunc (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } void setup() { Serial.begin(9600); } void loop() { int n; Serial.println("before sorting:"); for( n = 0 ; n < 5; n++ ) { Serial.println(values[n]); } qsort(values, 5, sizeof(int), cmpfunc); Serial.println("after sorting:"); for( n = 0 ; n < 5; n++ ) { Serial.println(values[n]); } delay(100000); }