Lycée Condorcet de Schoeneck STS CIEL
TP Sujet : Traitement d’une trame ENOCEAN avec une carte
Arduino
Matériel et logiciel nécessaire :
Durée : 4h
Module CLICK ENOCEAN
CLICK shield
GROVE Shield ENOCEAN
Afficheur GROVE LCD RGB BACKLIGHT
Led GROVE
Clé USB EnOcean
Capteur de température EnOcean
Interrupteur EnOcean
Mise en situation
L’objectif est de réaliser un objet permettant la réception de trames EnOcean de types
4BS et 1BS :
Afficher sur un afficheur LCD la température mesurée par une sonde EnOcean
Commander l’allumage en tout ou rien d’un équipement (ici ce sera une Led) à partir
d’un interrupteur EnOcean
I. Etude des trames EnOcean
1. A l’aide du logiciel DolphinVIEW, relever les trames radio et série de la sonde de
température et compléter le tableau suivant.
Trames : 0080CAD1
Remarque : il est important pour la suite du TP de bien repérer les longueurs des trames séries
et les ID et Valeurs de données en faisant des copies d’écran de dolphinView :
1 Sélectionner le
bon port com et se 3 Aller dans trame
connecter analyzer
2 Sélectionner la
trame souhaitée
ANDRE Richard 1
Lycée Condorcet de Schoeneck STS CIEL
Sonde de température :
Type de trame (RPS,1BS ou 4BS 4 Byte communication
4BS)
Identifiant 0080cad1
Exemple de trame radio A5 08 28 17 81 00 80 CA D1 00
Longueur trame radio (nb 10 Octets
d’octets)
Exemple de trame série 55 00 0A 07 01 EB A5 08 28 17 81 00 80 CA D1 00 02 FF FF
FF FF 36 00 51
Longueur trame série (nb 24 Octets
d’octets)
2. A l’aide du profile du capteur de température, déterminer l’octet contenant
l’information de température et le mettre en évidence dans les trames du tableau
précédent.
La trame qui contient l’information de la température c’est dans les data ce sont
les chiffres suivant 08 28 17 81.
3. Déterminer l’équation à appliquer pour retrouver la valeur de température en
fonction de l’octet présent dans la trame :
DB1 (8 bits) = Temperature TMP
Échelle : 0 … 255 = 0 … 40 °C
DB 1
Temp ( ° C )= ∗40
255
Exemple avec ox17 = 23
23
Temp ( ° C )= ∗40=3.61° C
255
4. Effectuer
les mêmes opérations pour l’interrupteur EnOcean en complétant les tableaux ci-
dessous et en mettant en valeur l’octet contenant l’information d’appui sur
l’interrupteur EnOcean.
Identifiant (RPS,1BS ou 4BS) RPS
Exemple de trame radio F6 00 00 23 D1 00 20
Longueur trame radio (nb 7 Octets
d’octets)
Exemple de trame série 55 00 07 07 01 F6 00 00 23 D1 00 20 02 FF FF FF FF 34 00
XX
Longueur trame série (nb 21 Octets
ANDRE Richard 2
Lycée Condorcet de Schoeneck STS CIEL
d’octets)
ACTION VALEUR DE LA DONNEE
Appuis sur 1 10
droite
Relâché 00
Appuis sur 0 30
droite
Relâché 00
Appuis sur 1 50
gauche
II. Relâché 00 Programmation
Appuis sur 0 70
Etablir un programme gauche qui permettra de
remplir les fonctions Relâché 00 demandées en
procédant par étapes et en tenant compte
des remarques ci-dessous.
Remarque : Réception d’une trame série
La réception d’une trame série fonctionnera sur le principe de l’interruption. Une
interruption est déclenchée dès qu’une donnée est présente dans le buffer de réception.
Ce sous-programme lira alors la donnée et la rangera dans un tableau.
char trameRFID[50];
void setup() {
[Link](57600);
}
void loop() {
void serialEvent() //SP d’interruption du port série si une donnée est présente
{
delay(500);
int nb=[Link]();
for (int i = 0; i < nb; i++)
{
trameRFID[i] = [Link]();
}
Le traitement de la trame se fera ici ! Il faudra, à l’aide d’une structure conditionnelle,
vérifier si la trame reçue a la bonne longueur et est bien issue du capteur qu’on souhaite gérer
avant éventuellement de faire des actions …
}
Afficheur LCD Grove :
Installer, ci-nécessaire, la bibliothèque
suivante :
ANDRE Richard 3
Lycée Condorcet de Schoeneck STS CIEL
Pour déclarer un écran dans le programme :
Pour initialiser l’écran dans le « setup » :
(Dans cet exemple le fond sera bleu … (R,V,B))
Pour écrire et positionner le curseur, les commandes
habituelles sont valables.
Effectuer un compte rendu détaillé et complet. Bon
travail !
#include <Wire.h>
#include "rgb_lcd.h"
rgb_lcd ecran;
char trameRFID[50];
const int pinLed = 4;
void setup() {
[Link](57600);
[Link](16, 2);
pinMode(pinLed, OUTPUT);
[Link](0, 0);
[Link]("Bonjour");
}
void loop() {
}
void serialEvent() {
delay(500);
int nb = [Link]();
for (int i = 0; i < nb; i++) {
trameRFID[i] = [Link]();
}
if (nb == 24) {
unsigned char octetTemp = trameRFID[9];
float temperature = (255-octetTemp)*40.0/255.0;
ANDRE Richard 4
Lycée Condorcet de Schoeneck STS CIEL
[Link](0, 0);
[Link]("Temp: ");
[Link](temperature);
[Link](" C");
}
if (nb == 21) {
int donneeInter = trameRFID[13];
if (donneeInter == 10) {
digitalWrite(pinLed, HIGH);
}
else if (donneeInter == 30) {
digitalWrite(pinLed, LOW);
}
}
}
Programme bonus : Climatisation :
#include <Wire.h>
#include "rgb_lcd.h"
rgb_lcd ecran;
char trameRFID[50];
const int LED1 = 2; // LED température > 25
const int LED2 = 3; // LED température > 23
void setup() {
[Link](57600);
[Link](16, 2);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
[Link](0, 0);
[Link]("Bonjour");
}
void loop() {
}
void serialEvent() {
delay(500);
int nb = [Link]();
for (int i = 0; i < nb; i++) {
trameRFID[i] = [Link]();
ANDRE Richard 5
Lycée Condorcet de Schoeneck STS CIEL
// Trame température
if (nb == 24) {
unsigned char octetTemp = trameRFID[9];
float temperature = (255 - octetTemp) * 40.0 / 255.0;
// Affichage LCD
[Link]();
[Link](0, 0);
[Link]("Temp: ");
[Link](temperature);
[Link](" C");
// Conditions LEDs
if (temperature > 25) {
digitalWrite(LED1, HIGH);
} else {
digitalWrite(LED1, LOW);
if (temperature > 23) {
digitalWrite(LED2, HIGH);
} else {
digitalWrite(LED2, LOW);
}
}
}
ANDRE Richard 6