Una buona giornata.
Vi chiedo cortesemente un aiuto,
Co Arduino nano e HC05 Master un DS18B20 sto rilevando la temperatura esterna,
al’ interno altro nano HC05 slave un display,
il tutto funziona correttamente,
ora però io volevo fare un confronto con la temperatura per poi accendere un led,
visto che i dati arrivano in formato HEX, mi serve trasformarli in numeri int,
ho cercato in rete ma non sono riuscito a trovare nulla,
vi posto il codice in questione,
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#define Led 4
const int rxpin = 10; //Qui va tx bluetooth
const int txpin = 11; //Qui va Rx bluetooth
SoftwareSerial Sleiv(rxpin, txpin);
LiquidCrystal_I2C lcd(0x3F, 20, 4);
void Dati_Canc();
char TempS[4];
char dato_P;
char Dato;
byte i;
void setup() {
Serial.begin(9600);
Sleiv.begin(9600);
lcd.init();
lcd.backlight(); //per attivare la retro inluminazione
pinMode(Led, OUTPUT);
digitalWrite(Led, 0);
lcd.clear();
}
void loop() {
if (Sleiv.available() > 0) {
for (i = 0; i < 4; i++) {
TempS[i] = Sleiv.read(); //Leggo i dati
delay(100);
}
lcd.setCursor(0, 0);
lcd.print("C");
lcd.write(223);
lcd.setCursor(3, 0);
for (i = 0; i < 4; i++) { //Dati a display
lcd.print(TempS[i]);
}
//if (Sleiv.available() > 0) { //Mando i dati sulla serial nativa
//Serial.println(Sleiv.read());
//}
//Serial.print("Temp ");
//Serial.println(TempS);
/******da HEX a INT*****************/
Dato = TempS[0] ;//mi salvo il primo numero HEX
Dato &=0x0F; //lo trasformo
dato_P = TempS[1] ; //salvo la seconda cifra)
dato_P &=0x0F; //la trasformo
//qui il problema come unire le due cifre?
/*************************************************/
Sleiv.end();
Dati_Canc();
} else {
Sleiv.end();
Sleiv.begin(9600);
}
Sleiv.begin(9600);
delay(100);
}
void Dati_Canc() {
for (byte i = 0; i < 4; i++) {
TempS[i] = 0x00;
}
}
quello che son riuscito a fare salvare e trasformare le prime due cifre in Dato e dato_P,
ora non so come unirle, e qui vi chiedo un aiuto,
spero di essermi spiegato,
Scusa, vedo che fai un ciclo per stampare un carattere per volta il contenuto di tempS ...
... ma se l'array TempS lo fai di un carattere più lungo e nell'ultimo carattere metti fisso il valore 0x00 non fai altro che avere una stringa classica del 'C' che puoi stampare con una sola lcd.print() senza dover fare il ciclo for.
Una volta che hai il valore in una stringa classica del C, la sua conversione in numero è semplice ...
Mi fai un esempio di cosa contiene TempS? Che valori ci sono detro i 4 caratteri? Ovvero, quel ciclo di lettura Sleiv.read(), che tipo di caratteri ritorna? .... perché, secondo me, ti stai solo complicando la vita ... :
Scusa, ma tu hai già il valore numerico in una variabile 'float' di nome 'Temp' ... perché non usi quello per fare il confronto e vuoi invece fare strane cose con una varibile che contiene l'equivalente in ASCII (0x31 è '1', 0x37 è '7', 0x2E è il punto decimale, 0x34 è il '4')? Con cosa devi confrontare il valore?
Ciao Guglielmo
senza dubbio tu hai ragione, solitamente io facevo cosi
indent preformatted text by 4 spacesif (TempS >= 22) {
digitalWrite(Led, 1);
} else {
digitalWrite(Led, 0);
}
ed il led si accendeva a 22°,
ora invece non va non si accende, oppure si accende anche con 12°
dova sto sbagliando?
(con il nuovo editor spero di non aver commesso errori)
Aspetta ... ho riletto tutto il codice ... dimmi se ho capito bene ...
Tu da un lato leggi il sensore di temperatura ed hai la variabile 'float', la trasformi in una serie di caratteri e la trasmetti dall'altro lato dove ti arrivano solo 4 caratteri che rappresentano in ASCII la temperatura, quindi, dove hai il LCD e vuoi fare i confronti hai solo la temperatura in formato carattere, giusto?
Allora, se è così, come ti ho detto TempS DEVE essere lungo un carattere in più e l'ultimo carattere DEVE essere 0x00 che indica la fine della stringa classica del 'C'. Una volta che hai questa situazione, semplicemente, senza complicarti la vita, con la funzione atof() trasformi la tua string TempS di nuovo in un float Temp e lavoro direttamente con il float