Bonjour à tous,
Je débute sur Arduino et n'y touche pas souvent, j'ai certainement plein de conseil à prendre.
Je souhaite réaliser de la façon la plus simple possible un simulateur de capteur de gaz ( j'ai la doc intégrateur plutôt bien détaillée), ce dernier envoie des données via une liaison série avec une construction de trame bien spécifique :
Dans cette trame, certains paramètres resteront fixes, pour d'autres j'aurais besoin de les faire varier mais de façon cyclique (avec un simple delay() probablement )
j'ai un peu de mal a organisé mon code, et je ne voudrais pas perdre du temps bêtement
1 => comment je dois transmettre les données ? ( 1 à 1, par string...? ) pour le moment j'ai construit ma trame avec un tableau
2=> dans ma trame j'ai à la fois des valeurs sur 1 octet et sur 2 octets (dont une que je vais devoir faire varier) comment dois je configurer mon tableau si j'utilise cette solution ? je ne suis pas sur de retrouver mes 21 octets avec ma solution
3 => comment intégrer mes données variables dans ma trame ? dans loop() ou en créant des fonctionspécifiques()
Voila une ébauche, mais je suis loin d'être au bout ( ya certainement des coquilles n'hésitez pas si je suis pas sur le bon chemin) :
// Simulateur capteur multigas CO2 RS232
#include <SoftwareSerial.h>
SoftwareSerial RS232(10, 11); // RX, TX
unsigned char id = 0; // doit vaier de 0 à 9 en pour identifier trame x/10
byte tamp =0 ; // pour le calcul du chck
word m1; // variable de type word (2 Bytes)
word m2; // variable de type word (2 Bytes)
word m3; // variable de type word (2 Bytes)
word m4; // variable de type word (2 Bytes)
word m5; // variable de type word (2 Bytes)
byte sum =0 ; // pour le calcul du check sum uniquement pour la vérification
void setup() {
Serial.begin(9600);
RS232.begin (9600); //9600 selon doc
}
void loop() {
++ id %= 10 ; // fait varier id de 0 à 9 en continu
m1= 00; // restera fixe
m2= 489 ; // je vais devoir faire vairier cette valeur (courbe CO2)
m3 = 0000; // restera fixe
m4 = 0000; //restera fixe
m5 = 0000;// restera fixe
unsigned char frame[16];
frame[0] = 0xaa; /* Start flag 1 */
frame[1] = 0x55; /* Start flag 2 */
frame[2] = id; /* Command ID */ // doit varier de 0 à 9
frame[3] = 0x01 ; // STS byte 0 no breath 1 Breath restera fixe
frame[4] = m1 ; // waveform value 5 word
frame[5] = m2; //// waveform value 5 word
frame[6] = m3; // waveform value 5 word
frame[7] = m4; // waveform value 5 word
frame[8] = m5; // waveform value 5 word
frame[9] = 0xB5; // slow data byte 1
frame[10] = 0x00; // slow data byte 2
frame[11] = 0x00; // slow data byte 3
frame[12] = 0x00; // slow data byte 4
frame[13] = 0x00; // slow data byte 5 hi byte
frame[14] = 0xB5; // slow data byte 6 low byte
/*byte de chck */
for (int i = 2; i < 15; i++) {
tamp = tamp + frame[i];
frame[15] = ~(tamp) + 1; } // inverse de la somme des bytes de la trame pour avoir chksum = 0
/* vérification du chksum */
for (int i = 2; i < 16; i++) { /* Skip flag 1 and flag 2. */
sum += frame[i];
// Serial.println(frame[i]); // pour vérifier
}
/* Checksum OK - use frame */
if (!sum) { Serial.println("OKKKKKKK!");// pour vérifier
for (int i=0; i<16; i++){
if(i> 16){
i= 0; break;
}
RS232.write(frame[i]); // ecrit la trame de données sur le port série
Serial.println(frame[i],HEX); // pour vérifier
}
}
/* Bad checksum - discard frame */
else { //Serial.println("Pas bien!" ); // pour vérifier
}
}
Merci par avance pour votre aide si précieuse