Buongiorno a tutti, sto cercando di sviluppare una stazione meteo che dovrà visualizzare i dati di temperatura, umidità e pressione (in seguito anche l'orario) utilizzando un sensore BMP + AHT. Il programma funziona e sulla seriale mi dà i dati corretti; questi vengono inviati via I2C a 3 AT85 che comandano dei display TM1637; qui scatta il problema di cui non sono riuscito a scoprire la causa, infatti i dati rilevati sulla seriale sono:

Mentre sui singoli TM mi vengono visualizzati:

dove il solo dato corretto è quello della pressione.
Il programma master (ancora da rifinire) è:
#include <Wire.h>
#include <BMx280I2C.h>
#include <SparkFun_Qwiic_Humidity_AHT20.h>
#define I2C_ADDRESS 0x77
AHT20 aht;
BMx280I2C bmx280(I2C_ADDRESS);
double prex_cum, temp_cum, humd_cum;
double prex_old, temp_old, humd_old;
double prex, temp, humd;
int prex1, temp1, humd1;
int cont = 0;
byte dato1[4]; //dato da inviare - pressione
byte dato2[4]; //dato da inviare - temperatura
byte dato3[4]; //dato da inviare - umidità
int el = 0;
int u_s, d_s, u_m, d_m, u_h, d_h, f, u_t, d_t, t, vuoto;
byte digits[11] = {
B01111110, // 0
B00110000, // 1
B01101101, // 2
B01111001, // 3
B00110011, // 4
B01011011, // 5
B01011111, // 6
B01110000, // 7
B01111111, // 8
B01111011, // 9
B00000001 // "-"
};
void setup() {
Serial.begin(9600);
Wire.begin();
bmx280.begin();
bmx280.resetToDefaults();
bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);
bmx280.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);
if (aht.begin() == false)
{
Serial.println("AHT20 non trovato. Controllare collegamenti.");
while (1);
}
Serial.println("AHT20 attivato.");
}
void loop() {
richiestaDati();
prex1 = (prex / 100) ;
dato1[3] = (prex1 % 10);
dato1[2] = ((prex1 / 10 ) % 10 );
dato1[1] = ((prex1 / 100) % 10 );
dato1[0] = ((prex1 / 1000) % 10 );
delay(200);
temp1 = (temp * 100);
dato2[3] = (temp1 % 10);
dato2[2] = ((temp1 / 10 ) % 10 );
dato2[1] = ((temp1 / 100) % 10 );
dato2[0] = ((temp1 / 1000) % 10 );
delay(200);
humd1 = (humd * 100);
dato3[3] = (humd1 % 10);
dato3[2] = ((humd1 / 10) % 10);
dato3[1] = ((humd1 / 100) % 10);
dato3[0] = ((humd1 / 1000) % 10);
delay(200);
// Trasmette i dati
if (cont > 0) {
Wire.beginTransmission(0x08);
Serial.print("Pressione: ");
Wire.write(dato1[0]); // BLU
Serial.print(dato1[0]);
Wire.write(dato1[1]);
Serial.print(dato1[1]);
Wire.write(dato1[2]);
Serial.print(dato1[2]);
Wire.write(dato1[3]);
Serial.println(dato1[3]);
Wire.endTransmission(0x08);
delay(200);
Wire.beginTransmission(0x09);
Serial.print("Temperatura: ");
Wire.write(dato2[0]); // GIALLO
Serial.print(dato2[0]);
Wire.write(dato2[1]);
Serial.print(dato2[1]);
Wire.write(dato2[2]);
Serial.print(dato2[2]);
Wire.write(dato2[3]);
Serial.println(dato2[3]);
Wire.endTransmission(0x09);
delay(200);
Wire.beginTransmission(0x0A);
Serial.print("Umidità: ");
Wire.write(dato3[0]); // VERDE
Serial.print(dato3[0]);
Wire.write(dato3[1]);
Serial.print(dato3[1]);
Wire.write(dato3[2]);
Serial.print(dato3[2]);
Wire.write(dato3[3]);
Serial.println(dato3[3]);
Wire.endTransmission(0x0A);
cont = 0;
delay(1000);
}
cont ++;
Serial.println("");
}
void richiestaDati() {
bmx280.measure();
do {
delay(50);
} while (!bmx280.hasValue());
prex = bmx280.getPressure();
if (aht.available() == true){
//Get the new temperature and humidity value
temp = aht.getTemperature();
humd = aht.getHumidity();
}
delay(2000);
}
mentre gli slave utilizzano:
/* Slave Receive
* Modello per lo slave su AT85
*/
#include "Wire.h"
#include <TM1637Display.h>
#include <Arduino.h>
#define CLK 3
#define DIO 4
int tem[4] ;
int temperatura = 0;
TM1637Display display(CLK, DIO);
void setup() {
display.setBrightness(2);
Wire.begin(0x09);
Wire.onReceive(riceviDati);
delay(100);
}
void loop() {
}
void riceviDati() {
byte temp1 = Wire.read();
byte temp2 = Wire.read();
byte temp3 = Wire.read();
byte temp4 = Wire.read();
tem[0] = temp1;
tem[1] = temp2;
tem[2] = temp3;
tem[3] = temp4;
temperatura = ((tem[0] * 1000) + (tem[1] * 100) + (tem[2] * 10) + tem[3])- 500;
display.showNumberDecEx(temperatura, (0x80 >> 1), false);
}
Qualcuno mi saprebbe indirizzare su come risolvere le discrepanze? Dove sbaglio?
Saluti + grazie
Enrico