Da char array a int variabile

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 ... ::slight_smile:

Guglielmo

Ciao Guglielmo grazie di avermi risposto,
sul master dove leggo il DS18B20 con una variabile float, poi uso una funzione

char Invio[4];
float Temp;//variabile leggo la temperatura
float getTemp();//funzione lego il sensore DS18B20
Temp = getTemp();//
dtostrf(Temp, 2, 2, Invio);

con questa mi arriva una stringa

TempS[4] = {0x31, 0x37, 0x2E, 0x34};

e qui non so come fare un confronto,
qualche suggerimento? grazie

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?

Guglielmo

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)

Allora, tu hai la temperatura che è già numerica, 'Temp' che è un 'float' ... perché diavolo devi andare a fare i confronti in formato ASCII ? ? ? :open_mouth: :open_mouth: :open_mouth:

Se vuoi accendere il LED quando la temperatura è superiore hai 22° scriverai semplicemente:

if (Temp >= 22.0) {
   digitalWrite(Led, 1);
} else {
   digitalWrite(Led, 0);
}

Guglielmo

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 :slightly_smiling_face:

Guglielmo

Guglielmo mille grazie
ora con quella funzione ho risolto,
ancora mille grazie

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.