Buongiorno, sto (inutilmente!!) cercando di trasferire il valore di pressione da un sensore BME280 ad un visore a 4 display TM1637.
Ho provato a trasferire in un array il valore di pressione moltiplicato per 1000 e trasferirlo ai singoli display in binario e esadecimale (codificando i singoli numeri in una tabella) con encodeDigit senza alcun risultato positivo.
Provato il seguente programma (che funziona digitando il numero) ottenento (col valore in variabile) solo 4 zeri.
#include <Arduino.h>
#include <TM1637Display.h>
#include <Wire.h>
#include <BMx280I2C.h>
#define I2C_ADDRESS 0x76
// Module connection pins (Digital Pins)
#define CLK 3
#define DIO 4
float pres;
int prex;
BMx280I2C bmx280(I2C_ADDRESS);
// The amount of time (in milliseconds) between tests
#define TEST_DELAY 1000
TM1637Display display(CLK, DIO);
void setup()
{
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };
display.setBrightness(0x0f);
// All segments on
display.setSegments(data);
delay(TEST_DELAY);
display.clear();
Wire.begin();
bmx280.begin();
bmx280.resetToDefaults();
bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
}
void loop()
{
bmx280.measure();
do {
delay(100);
} while (!bmx280.hasValue());
pres = bmx280.getPressure();
prex = int(pres * 1000);
display.showNumberDec(prex, true);
delay(TEST_DELAY);
display.showNumberDec(301, true); // Expect: 0301
}
Purtroppo non ho altre idee, qualcuno può indirizzarmi sulla giusta strada o indicarmi dove sbaglio?
Grazie
Enrico
PS: i valori ottenuti dal sensore, se inviati a seriale appaioni e sono corretti.
Scusa, fammi capire meglio cosa vuoi ottenere... Intanto magari postando l'output seriale e dicendo quindi cosa vedi sul display (perché "senza alcun risultato positivo" non dà informazioni).
Tu "pres" l'hai definita "int", quindi dato che la getPressure() restituisce un float, prendi solo il valore intero ma se poi lo moltiplichi per 1000 di fatto potrai avere solo valori interi di pressione 0, 1000, 2000, eccetera fino a 32000 (dato che un "int" può avere un valore massimo di 32767).
Tu hai un display a 4 cifre, per cui fammi un esempio: dato un certo valore di getPressure() quale risultato vuoi ottenere sul display? In base a questo posso darti una risposta.
Purtroppo utilizzo un at85, per cui non posso verificare direttamente la seriale; comunque ho un secondo sensore collegato ad un nano che mi dà 952 (il float -0,952- moltiplicato per 1000 e traformato in int -prex-).
Sul display dovrebbe comparire 952, come sulla seriale. I collegamenti sono OK, scambiando i sensori il risultato NON cambia.
Se ottieni 0000 forse la colpa è nel cast "int()" che fai, che forza la moltiplicazione tra interi (e su Attiny qualcosa deve esserci di diverso).
Ho finito le idee, intanto prova a fare così:
Scusa ma avevo capito che compariva 0000, invece non mostra nulla, come se fosse spento?
Certo che se sul Nano funziona (confermi?), deve essere qualcosa legato all'Attiny o meglio alla libreria, ma non capisco cosa possa essere.
Io farei qualche altra prova per cercare di capire.
Ad esempio, prova a caricare l'esempio della libreria ("TM1637Test.ino") e vedi se funziona tutto come previsto nei commenti (hai visto mai che qualcosa della libreria non funziona correttamente su Attiny).
Io però su Wokwi ho cercato di simulare la cosa (rimuovendo la parte del sensore di pressione perché non c'è nell'emulatore), ed a me funziona:
Prova a copiare e caricare sul tuo Attiny quel codice e vedi se funziona. Se funziona ma rimettendo la libreria del sensore di pressione torna a non funzionare, il problema potrebbe essere quello.
Fammi sapere.
Per far comparire qualcosa ho dovuto eliminare le riche che si riferiscono al 280.
Partendo dal fondo solo dopo aver eliminato le righe 280 nel loop sono comparsi dei valori (errati); ad eliminazione completa i dati sono corretti anche con setSegments se dati in esadecimale.
Mi è venuto il dubbio che possa dipendere anche dallo AT85, settimana prossima provo con un MiniPro o un Nano.
Tu hai un programma al post1
Che compila e comanda correttamente i display
Ha solo un errore di calcolo, anzi nemmeno, solo di conversione int float
E invece di mettere a posto una riga hai cominciato una danza infernale, tra librerie e cambi di schede e poi non s iu perché ho smesso di seguirti, troppo casino
Ti conviene fermarti e ripartire del post 1
Metti a posto il casting e hai finito
Se invece vuoi proseguire in quel ginepraio che ti sei costruito da te non hai da fare altro che cambiare di nuovo MCU e display e librerie...
Ah
Ricorda di cambiare ogni tanto anche la toolchain, altrimenti rischi di trovare "involontariamente" la soluzione in pochi mesi
PS: x C1P8, non ho capito, il programma indicato, utilizzando AT85, NON visualizzava la pressione (scopo dello stesso), ma solo l'intero (301) inserito SOLO per controllo.