[INFO] Les variables Arduino

Forum de support et d'échange sur la carte Akeru (carte compatible Arduino développée par Snootlab et intégrant la technologie Sigfox) et du shield Akene pour Arduino (shield pour Arduino développée par Snootlab et intégrant la technologie Sigfox)

[INFO] Les variables Arduino

Message non lude Florian » Ven 6 Juin 2014 15:28

MAJ le 29.07.2016 pour la sortie de la librairie Akeru v4 >> Voir post suivant

Bonjour,

Vous trouverez dans ce topic, quelques explications sur les variables Arduino. Les différents types, leurs tailles... Et une première approche avec la carte Akeru. Afin d'apprendre à formater nos variables pour l'envoi sur le réseau Sigfox.


- Qu'est ce qu'une variable?

C'est une façon de nommer et de stocker une valeur pour une utilisation ultérieure par le programme. Exemple d'utilisation : les valeurs d'un capteur, le résultat d'un calcul...


- Comment déclarer une variable?

Pour définir une variable, il faut lui attribuer un type, la nommer et l'initialiser (facultatif).
Exemple:
Code: Tout sélectionner
int Temperature;
int Lumiere = 0;

Pour la première déclaration son type est un ENTIER (int) et elle se nomme "Temperature".
Pour la deuxième, type ENTIER, nom "Lumiere" et on initialise sa valeur à 0.


- Quels sont les différents types?

    - boolean
    - char
    - byte
    - int
    - unsigned int
    - long
    - unsigned long
    - float (nombres à virgule)
    - double (nombres à virgule)

BOOLEAN

Ne peut prendre que deux valeurs : TRUE ou FALSE (VRAI ou FAUX), 1 ou 0 (HIGH ou LOW).
Un boolean occupe deux octets (16 bits) de mémoire.
______________________________

CHAR

Il contient une valeur correspondant à un caractère. Les caractères unitaires sont écrits entre apostrophes. Exemple: Pour un caractère, 'A'. Les chaînes de caractères sont écrites entre guillemets, par exemple "ABC".
Un char représente un octet de mémoire (8 bits).
Les caractères sont stockés de la même façon que les nombres : à chaque caractère correspond une valeur numérique comprise entre 0 et 127.
______________________________

BYTE

Déclare une variable de type octet (8 bits) qui stocke un nombre entier non-signé, soit une valeur de 0 à 255.
______________________________

INT

Les int sont les variables type de base pour le stockage de nombres.
Ils stockent une valeur sur 2 octets, soit des valeurs allant de - 32 768 à 32 767.
______________________________

UNSIGNED INT

Le type unsigned int (entiers non signés) est le même que le type int.
C'est à dire qu'il stocke sur 2 octets. Cependant, au lieu de stocker des valeurs négatives, unsigned int stocke de 0 à 65535.
______________________________

LONG

Le type long est de taille élargie pour le stockage de nombre entiers, sur 4 octets (32 bits), de -2 147 483 648 à + 2 147 483 647.
______________________________

UNSIGNED LONG

Le type unsigned long(long non signé) est le même que le type long.
C'est à dire qu'il stocke sur 4 octets. Cependant, au lieu de stocker des valeurs négatives, unsigned long stocke de 0 à 4 294 967 295.
______________________________

FLOAT

Ce sont les nombres à virgules. Les nombres à virgule sont souvent utilisés pour l'expression des valeurs analogiques et continues.
Ils peuvent prendre des valeurs de 3.4028235E+38 à -3.4028235E+38. Ils sont stockés sur 4 octets (32 bits) de mémoire.
______________________________

DOUBLE

Le type double dans le langage Arduino est le même que les variables de type float, sans gain de précision.
______________________________

Voilà pour ce qui est des différents types de variable et leurs tailles.


________________________________________________________________________________________________________________

En ce qui concerne l'Akeru.

Lorsque vous voulez envoyer une donnée via l'Akeru vous devez rentrer dans votre programme la ligne de code suivante.
Code: Tout sélectionner
Akeru.send(&VARIABLE, sizeof(VARIABLE));

Il suffit juste de rentrer le nom de votre variable en lieu et place du mot "VARIABLE".
Par exemple pour une variable:
Code: Tout sélectionner
int Temperature;

On aura,
Code: Tout sélectionner
Akeru.send(&Temperature, sizeof(Temperature));


Rien de monstrueux là-dedans.
Ensuite, une fois votre donnée envoyée, il va falloir dire à Actoboard ce qu'il va recevoir pour qu'il puisse la déchiffrer.
Une fois sur Actoboard, cliquez sur "+ New Data Source" pour ajouter un modem.
News.PNG
News.PNG (6.81 Kio) Vu 2668 fois

Normalement, on vous demande un nom, le numéro du modem, code PAC et un "Data Format".
DataFormat.PNG
DataFormat.PNG (1.72 Kio) Vu 2668 fois

Dans cette case, vous devrez renseigner le nom de la variable, son type et sa taille, sous la forme suivante :
Code: Tout sélectionner
Nom_Variable::Type:Taille

Ceci va permettre à Actoboard de déchiffrer les données envoyées par le modem. Il aura le nom, son type et la taille. Les deux derniers paramètres lui permettent de savoir quand commence l'information et quand elle se finit. Il peut donc distinguer les envois.

Pour synthétiser voilà ce qu'on aurait avec l'exemple de la température.

On déclare notre variable;
Code: Tout sélectionner
int Temperature = 0;

On l'envoie;
Code: Tout sélectionner
Akeru.send(&Temperature, sizeof(Temperature));

On paramètre Actoboard;
Code: Tout sélectionner
Temperature::int:8

On devrait recevoir la valeur 0.

Dernier détail.
Il faut savoir qu'un type int et uint (unsigned int) peut mesurer 8, 16 ou 32 bits.
Un float 32 ou 64 bits.
Et un bool, un simple octet soit 8 bits.


Voilà, c'est tout pour cette petite mise à jour.
Florian
 
Messages: 75
Inscription: Mer 24 Juil 2013 17:36

Re: [INFO] Les variables Arduino

Message non lude tomsoft » Ven 6 Juin 2014 16:06

Je reitère ma demande pour que si on soit obligé de passer par actobord, ce passage soit "transparant" -> ne pas etre obliger de specifier le format des données pour que la callback soit apellée. Exemple: si on fait un codage variable, ou si on a plusieurs applications....

Est ce que ce changement est prevu? ( a priori une ligne de code à changer!) si oui, quand....
tomsoft
 
Messages: 8
Inscription: Lun 19 Mai 2014 10:05

Re: [INFO] Les variables Arduino

Message non lude swallez » Lun 9 Juin 2014 16:42

tomsoft a écrit:Est ce que ce changement est prevu? ( a priori une ligne de code à changer!) si oui, quand....


C'est fait, une nouvelle version d'Actoboard a été déployée, et le format des données n'est plus obligatoire.
swallez
 
Messages: 1
Inscription: Mer 16 Oct 2013 10:55

Re: [INFO] Les variables Arduino

Message non lude tomsoft » Mar 10 Juin 2014 18:01

Super merci!
tomsoft
 
Messages: 8
Inscription: Lun 19 Mai 2014 10:05

[UPDATE] Les variables Arduino v2 (lib Akeru v4)

Message non lude Laetitia » Ven 29 Juil 2016 16:19

MAJ le 29.07.2016 pour la sortie de la librairie Akeru v4

À partir de la version 4 de la librairie Akeru, les données sont envoyées sous la forme d'un objet String et non plus d'une simple variable (ou d'une structure struct). Ces données devant être transmises sous forme hexadécimale, il faudra les convertir avant l'envoi.

Cette mise à jour traitera uniquement l'envoi des données via Akeru, les parties du tutoriel sur les variables Arduino et le paramétrage Actoboard restent valides.

    - Envoi d'une seule variable -
Mieux vaut un exemple qu'un grand discours :

Code: Tout sélectionner
int data = 42; // déclaration de la variable à envoyer
String dataString = Akeru.toHex(data); // conversion en hexadécimal
Akeru.sendPayload(dataString); // envoi de la donnée

Cette méthode est valide pour tous les types de variables cités plus haut (boolean, char, byte, int, unsigned int, long, unsigned long, float, double).

Cas particulier lorsque vous souhaitez envoyer une chaîne de caractères sous la forme d'un tableau de char : il faut indiquer la longueur de la chaîne de caractères à convertir. On utilise pour cela la fonction sizeof() comme on le faisait avec l'ancienne version de la librairie :

Code: Tout sélectionner
char data[] = "Bonjour"; // déclaration de la chaîne de caractères à envoyer
String dataString = Akeru.toHex(data, sizeof(data)); // conversion en hexadécimal
Akeru.sendPayload(dataString); // envoi de la donnée

    - Envoi de plusieurs variables -
La procédure ne change pas, il faut toujours collecter les données, les convertir puis les envoyer sur le réseau. Cependant il faut regrouper les données dans un seul String, en prenant bien garde à ce que la taille totale des données envoyées ne dépasse pas 12 octets. L'utilisation des objets String rend l'opération plus simple avec les opérations et fonctions qui leur sont associées :

Code: Tout sélectionner
// On peut convertir des données brutes, non déclarées en tant que variables :
String entier = Akeru.toHex(42);
String pi = Akeru.toHex(3.141592);
String phi = Akeru.toHex(1.618);

String data = entier + pi + phi; // On met le tout ensemble, dans l'ordre indiqué.

Akeru.sendPayload(data); // Et on envoie !

ou encore :

Code: Tout sélectionner
String data = Akeru.toHex(42);
String pi = Akeru.toHex(3.141592);
String phi = Akeru.toHex(1.618);

// On ajoute progressivement les données les unes à la suite des autres
data.concat(pi);
data.concat(phi);

Akeru.sendPayload(data); // puis on envoie

    - Remarque sur la gestion des variables Arduino -
Lors des tests de développement de la librairie, je me suis aperçue que certains types de variable étaient équivalents ! Je finirai donc cette mise à jour par un récapitulatif des types "réels" de variables disponibles :
  • Pour les entiers :
    • 8 bits non signé : unsigned char
    • 8 bits signé : char (voir note ci-dessous), byte
    • 16 bits non signé : word, unsigned int, boolean (ça semble étrange mais les booléens sont bien codés sur 2 octets)
    • 16 bits signé : int, short
    • 32 bits non signé : unsigned long
    • 32 bits signé : long, word (Arduino Due et Zero uniquement)
  • Pour les flottants :
    • 32 bits : float, double
    • 64 bits : double (Arduino Due et Zero uniquement)

Note : les char permettent de stocker des nombre sur 8 bits et sont donc pratique pour traiter de petites valeurs (comprises entre -128 et 127). Il est tout à fait possible de réaliser les mêmes opérations avec des char qu'avec n'importe quel autre type de variable. Mais les valeurs positives correspondent également à des caractères ASCII, imprimables tels quels sur le moniteur série grâce à la fonction Serial.print() ou Serial.println(). Pour obtenir le même résultat à partir d'un autre type de variable il faut utiliser la fonction Serial.write(). Démonstration :

Code: Tout sélectionner
void setup()
{
  char L = 0x4C; // Valeur hexadécimale de 'L'
  char R = 'R';  // Caractère lui-même
  byte l = 0x6C; // Valeur hexadécimale de 'l'
  byte r = 'r';  // Caractère lui-même
 
  Serial.begin(9600);

  Serial.println("--- PRINT ---");
  Serial.print("premier char : ");
  Serial.print(L);
  Serial.print(", deuxieme char : ");
  Serial.println(R);
  Serial.print("premier byte : ");
  Serial.print(l);
  Serial.print(", deuxieme byte : ");
  Serial.println(r);
 
  Serial.println("--- WRITE ---");
  Serial.print("premier char : ");
  Serial.write(L);
  Serial.print(", deuxieme char : ");
  Serial.write(R);
  Serial.print("\npremier byte : ");
  Serial.write(l);
  Serial.print(", deuxieme byte : ");
  Serial.write(r);
}

void loop()
{
}

Sortie du moniteur série :

output_byte_and_char.jpg
output_byte_and_char.jpg (61.25 Kio) Vu 957 fois
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 294
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse


Retourner vers Akeru et Akene

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron