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ó.

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

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.

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

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

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

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

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

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