Bonjour
Je fais un échange de données entre un Nano et un Mega.
Ceci avec des STRUCT comme on m'avais indiqué de faire.
Dans le sens Nano vers mega pas de problème.
Dans le sens mega vers nano, ça merdoie.
c.a.d: la valeur que j'envoie du mega est reçue correctement quelques secondes, et après
ça indique -13608 (toujours cette valeur).
Je précise que c'est sur la même ligne TX/RX.
que j'essaie de passer un float ou un int idem même problème, seule la valeur finale change.
Problème de timing ? de mémoire tampon du nano? ou mon code?
code mega
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
// Réception sur Mega 2560
// SDA=20 SCL=21
// Serial 1 (TX 18, RX 19)
LiquidCrystal_I2C lcd(0x3F, 20, 4);
int envoi1 = 196; //test envoi vers ch1
float envoi2 = 14.5;
int envoi3 = 123;
int envoi4 = 456;
struct Receivedech1
{
float tempch1; //temperature
float consch1; // consigne
int statusch1; // status
};
struct Sendversch1 // Infos a envoyer vers CH1
{
int send1;
//float send2;
//int send3;
//int send4;
};
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
lcd.init(); //initialise le lcd
lcd.clear();
lcd.backlight();
}
void loop() {
Receivedech1 dech1;
if (Serial1.available())
{
Serial1.readBytes((byte *)&dech1, sizeof dech1);
Serial.println(dech1.tempch1, 1); // temperature
Serial.println(dech1.consch1, 1); // consigne
Serial.println(dech1.statusch1);// status
}
Sendversch1 depart;
depart.send1 = envoi1;
//depart.send2 = envoi2;
//depart.send3 = envoi3;
//depart.send4 = envoi4;
//serial.println(depart.se1,1);
Serial1.write((byte *)&depart, sizeof depart);
lcd.setCursor(0, 0);
lcd.print(dech1.tempch1, 1);
lcd.setCursor(0, 1);
lcd.print(dech1.consch1, 1);
lcd.setCursor(15, 1);
lcd.print(dech1.statusch1);
lcd.setCursor(0, 2);
lcd.print(depart.send1, 1);
/*
lcd.setCursor(10, 2);
lcd.print(depart.send2, 1);
lcd.setCursor(0, 3);
lcd.print(depart.send3);
lcd.setCursor(10, 3);
lcd.print(depart.send4);
*/
}
code nano
// +++++ NANO Oldbootloader +++
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <SoftwareSerial.h>
const byte BROCHE_ONEWIRE = 2; // DS18B20
#define One_WIRE_BUS1 2
OneWire oneWire1(One_WIRE_BUS1);
DallasTemperature sensors1(&oneWire1);
LiquidCrystal_I2C lcd(0x27, 20, 4);
int potarPin = A0; // Potar valeur de consigne
int potarValue = 0;
float tempch1 = 0; // Temperature chambre 1
float cons = 0; // Consigne
float val = 0; // Valeur potar pour consigne
int hystplus = 10;
int hystmoins = 3;
struct Sendversch2 // Infos a envoyer vers CH2
{
float send1;
float send2;
int send3;
//int send4;
};
struct receive // données recues de CH2
{
int recept1;
//float recept2;
//int recept3;
//int recept4;
};
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
sensors1.begin();
//sensors1.setResolution(12);
lcd.init(); //initialise le lcd
lcd.clear();
lcd.backlight();
}
void loop() {
// +++++ Lecture temperature sur ds18b20 résolution a 12 +++++
sensors1.requestTemperatures();
float tempch1 = sensors1.getTempCByIndex(0);
//int resolv1=sensors1.getResolution();
// ++++ Lecture valeur potar +++
potarValue = analogRead(potarPin);
val = potarValue * (30.0 / 1023.0); // force la valeur entre 0 et 30
// +++++ Emission données vers CH2 +++++
Sendversch2 valeurs;
valeurs.send1 = tempch1;
valeurs.send2 = val;
valeurs.send3 = hystplus;
//valeurs.send4 = hystmoins;
mySerial.write((byte *)&valeurs, sizeof valeurs);
//+++++ Reception données de CH2 +++++
receive recu;
if (mySerial.available())
{
mySerial.readBytes((byte *)&recu, sizeof recu);
Serial.println(recu.recept1, 1);
// Serial.println(recu.recept2, 1);
//Serial.println(recu.recept3);
//Serial.println(recu.recept4);
}
lcd.setCursor(0, 0);
lcd.print("T");
lcd.setCursor(1, 0);
lcd.print((char)223);
lcd.setCursor(2, 0);
lcd.print("=");
lcd.setCursor(3, 0);
lcd.print(tempch1, 1);
lcd.setCursor(7, 0);
lcd.print((char)223);
lcd.setCursor(9, 0);
lcd.print("C=");
lcd.setCursor(11, 0);
lcd.print(cons, 1);
lcd.setCursor(15, 0);
lcd.print((char)223);
lcd.setCursor(0, 1);
lcd.print("Val=");
lcd.setCursor(4, 1);
lcd.print(val, 1);
lcd.setCursor(8, 1);
lcd.print((char)223);
lcd.setCursor(10, 1);
lcd.print(recu.recept1, 1);
/*
lcd.setCursor(10, 1);
if (etat == HIGH) {
lcd.print("Marche");
}
if (etat == LOW) {
lcd.print("Arret ");
}
*/
// EEPROM.get(0, mem);
//Serial.println(tps2);
//Serial.println(flag);
//Serial.println(val);
//Serial.println(cons);
//Serial.println(resolv1);
}
Merci de votre intérêt