Bonjour à tous,
j'ai reviens un peu sur ce sujet, j'ai a peu près réussi a faire ce que je voulais et l'afficher sur le lecteur série, à savoir
- capter la trame
- isoler les octets qui m'intéresse
- faire des conversions
Alors c'est certainement pas optimisé, mais c'est fonctionnel.
#include <SoftwareSerial.h>
SoftwareSerial RS232(10, 11); // RX, TX //
const uint8_t flag1 = 0xAA;
const uint8_t flag2 = 0x55;
byte frame[19]; // sans les flags
bool frameRecue() {
static enum : uint8_t { F1,
F2,
TRAME } etape = F1;
bool receptionOK = false;
static uint8_t compteur = 0;
if (RS232.available() == 0) return false; // rien à lire
uint8_t recu = RS232.read();
switch (etape) {
case F1:
if (recu == flag1) etape = F2;
break;
case F2:
if (recu == flag2) {
compteur = 0;
etape = TRAME;
} else if (recu != flag1) {
etape = F1;
}
break;
case TRAME:
frame[compteur++] = recu;
receptionOK = (compteur >= sizeof frame);
if (receptionOK) etape = F1; // on se prépare à recevoir la prochaine trame
}
return receptionOK;
}
void setup() {
Serial.begin(115200);
Serial.println();
RS232.begin(9600); //9600 selon doc
Serial.println(F("Prêt à recevoir des trames"));
}
int valCO2() {
if (frameRecue()) {
int id = frame[0];
float waveform0 = word(frame[2], frame[3]); // CO2 en %vol valeur HD dispo sur chaque trame 0- 2500 pour 0,00- 25,00%
uint16_t CO2exp; //CO2 expiré en %VOL sur 1 octet 0-250 pour 0 à 25%
int Patm; // valeur HD de Patm en Kpa 500 à 1300 pour 50.0 à 130.0 Kpa
int PmmHg; // valeur convertie en mmHg
if (id == 0x03) Patm = word(frame[16], frame[17]);
PmmHg = ((Patm * 7.5) / 10); // conversion Kpa en mmHg
if (id == 0x01) {
CO2exp = (frame[12] / 10 * PmmHg) / 100; // conversion CO2exp de %vol à mmHg
}
float P_CO2 = ((waveform0 / 100) * PmmHg) / 100; // conversion CO2 HD de %vol à mmHg
int CO2;
CO2 = (P_CO2 * 100) / 100; // juste pour afficher un entier
return (CO2);
//return (CO2exp) // je ne sais pas encore laquelle des deux je vais utilisé
}
}
void loop() {
Serial.print("CO2:");
Serial.println(valCO2());
}
Mon souci maintenant, je voudrais afficher ma valeur sur un petit afficheur Oled 0,91 type SSD1306" acheté sur Ali, pour ca j'utilise la bibli U8G2.h => la seule que j'ai réussi a faire fonctionner avec mon afficheur (celle adafruit ne fonctionne pas)
mais a partir du moment ou j'intègre de l'affichage, ma fonction initiale me retourne des valeurs incohérentes.
Au niveau de l'affichage ca va...enfin ce sont les mêmes valeurs que dans le lecteur série
pour exemple :
#include <SoftwareSerial.h>
SoftwareSerial RS232(10, 11); // RX, TX // true pour logic RS232/TTL
#include <Arduino.h> //getsion aff
#include <U8g2lib.h> //getsion aff
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
const uint8_t flag1 = 0xAA;
const uint8_t flag2 = 0x55;
byte frame[19]; // sans les flags
bool frameRecue() {
static enum : uint8_t { F1,
F2,
TRAME } etape = F1;
bool receptionOK = false;
static uint8_t compteur = 0;
if (RS232.available() == 0) return false; // rien à lire
uint8_t recu = RS232.read();
switch (etape) {
case F1:
if (recu == flag1) etape = F2;
break;
case F2:
if (recu == flag2) {
compteur = 0;
etape = TRAME;
} else if (recu != flag1) {
etape = F1;
}
break;
case TRAME:
frame[compteur++] = recu;
receptionOK = (compteur >= sizeof frame);
if (receptionOK) etape = F1; // on se prépare à recevoir la prochaine trame
}
return receptionOK;
}
int valCO2() {
if (frameRecue()) {
int id = frame[0];
float waveform0 = word(frame[2], frame[3]); // CO2 en %vol valeur HD dispo sur chaque trame 0- 2500 pour 0,00- 25,00%
uint16_t CO2exp; //CO2 expiré en %VOL sur 1 octet 0-250 pour 0 à 25%
int Patm; // valeur HD de Patm en Kpa 500 à 1300 pour 50.0 à 130.0 Kpa
int PmmHg; // valeur convertie en mmHg
if (id == 0x03) Patm = word(frame[16], frame[17]);
PmmHg = ((Patm * 7.5) / 10); // conversion Kpa en mmHg
if (id == 0x01) {
CO2exp = (frame[12] / 10 * PmmHg) / 100; // conversion CO2exp de %vol à mmHg
}
float P_CO2 = ((waveform0 / 100) * PmmHg) / 100; // conversion CO2 HD de %vol à mmHg
int CO2;
CO2 = (P_CO2 * 100) / 100; // juste pour afficher un entier
return (CO2);
}
}
void setup() {
u8g2.begin(); //Start Screen
Serial.begin(115200);
Serial.println();
RS232.begin(9600); //9600 selon doc
Serial.println(F("Prêt à recevoir des trames"));
}
void loop() {
Serial.println(valCO2());
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_timB18_tr);
u8g2.drawStr(1, 25, "Co2: ");
u8g2.setFont(u8g2_font_timB10_tr);
u8g2.drawStr(85, 25, "mmHg");
u8g2.sendBuffer();
u8g2.setFont(u8g2_font_timB18_tr);
u8g2.setCursor(55, 25);
u8g2.print(valCO2());
u8g2.sendBuffer();
delay(10);
}
1ere question , est t'il possible d'exploiter sur Arduino, la lecture série et en plus affiché via un protocole I2C ?
2e question, est ce que ca peut être simplement lié à la structure de mon code ?
Merci pour vos retours