nid69ita:
Forse dovresti specificare che stai usando una funzione fatta da qualcuno e che non è della libreria standard di Arduino: Arduino 1-Wire Tutorial
Comunque, copiala e fai una versione con nome diverso che manda su lcd.
Scusami...ma non ho mica scritto che è di mia invenzione. Questo è l'esempio da cui ho preso spunto da qui alla mia mancano parecchie cose che non mi servono e ho aggiunto altre parti stasera stesso. Inoltre sto adattando questo codice nel mio originale...questo è uno sketch che sto usando solo per far funzionare le sonde...comunque grazie!!!!
E senza un link a dove hai trovato quel codice, secondo te come fa uno a sapere che cosa è printTemperature ?
Ho dovuto cercarla in internet e dopo un pò ho trovato quel link e quindi ho capito a cosa ti riferivi.
Se dai più elementi per aiutarti è meglio. Ad esempio un link al codice che hai copiato. A meno che non stai usando codice standard di Arduino. Ma quel codice non lo è.
Da quel link ho preso un paio di righe che non sapevo scrivere. Il resto dalle librerie di arduino. Ho caricato la onewire,ho modificato il codice mi sono tirato fuori gli id e poi tramite quel link ho capito come dichiarare le variabili esadecimali. Ma sto usando l'esempio della libreria non il suo codice Scusami, hai ragione...devo dare più info possibili.
Figurati, non c'e' nulla da scusarsi.
Il mio è solo un appunto per tutti, come scritto nel regolamento. Date più informazioni possibili.
Non per rompere le scatole, ma per affrettare l'aiuto, più informazioni si hanno meglio è.
Soprattutto mettetevi nei panni di chi vi vuole aiutare ma non ha tutte le info.
Per ora mi rimane il serial.print solo per controllare i valori sul monitor, poi per alleggerire il codice lo eliminerò. Ora in pratica non mi stampa il valore sul display. Mi esce sulla prima riga TBA: e sulla seconda TCS:
C'entra la risoluzione della sonda?sul serial monitor tutto funziona con lo stesso codice!
Edit:Tutto risolto grazie
Edit2: Se dovesse servire a qualcuno il mio errore era qui: void loop(void) ho tolto il void dalle parentesi quindi così: void loop()
Rs125:
Edit2: Se dovesse servire a qualcuno il mio errore era qui: void loop(void) ho tolto il void dalle parentesi quindi così: void loop()
Beh, un errore particolare. Non pensavo desse di questi problemi, buono a sapersi.
Bravo, quando risolvi da solo, è utile scrivere la soluzione, altri possono così essere informati.
+1 Karma
Questi sono gli id delle due sonde collegate.
Ora queste due sonde sull'lcd mi stampano un valore con questa funzione:
void LcdTemperature(DeviceAddress deviceAddress) //Funzione che richiede ai dispositivi connessi i valori e li stampa sugli indirizzi su LCD
{ float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Errore falsa tempC");
} else {
lcd.print(tempC);
}
}
e poi:
sensors.requestTemperatures(); // Scarico le temperature dalle sonde
lcd.setCursor(0, 0); //Stampo la temperatura su LCD la temp del Bollitore Alto
lcd.print("BA:");
LcdTemperature(BollitoreAlto);
lcd.setCursor(8, 0); //Stampo la temperatura su LCD la temp del Bollitore Basso
lcd.print("/B:");
LcdTemperature(CollettoreSolare);
Ora questi due valori stampati li vorrei salvare in una variabile che arduino deve conoscere costantemente così da azionarmi un relè al cambio temperatura o meno.
Come posso fare?Ho provato a dichiarare le variabili ma non ci riesco.
In sostanza non riesco a capire come dire ad arduino che in collettore solare o bollitore alto c'è un valore con virgola e che quando uno dei due è maggiore dell'altro deve azionarmi il pin ditigale n.X.
Se faccio la funzione con if ed else mi calcola i valori id e non le temperature. Grazie
Ora nel programma potrai memoriazzare i valori temperatura e poi confrontarli:
lcd.setCursor(0, 0); //Stampo la temperatura su LCD la temp del Bollitore Alto
lcd.print("BA:");
TempBoll=LcdTemperature(BollitoreAlto);
lcd.setCursor(8, 0); //Stampo la temperatura su LCD la temp del Bollitore Basso
lcd.print("/B:");
TempColl=LcdTemperature(CollettoreSolare);
Ora nel programma potrai memoriazzare i valori temperatura e poi confrontarli:
lcd.setCursor(0, 0); //Stampo la temperatura su LCD la temp del Bollitore Alto
lcd.print("BA:");
TempBoll=LcdTemperature(BollitoreAlto);
lcd.setCursor(8, 0); //Stampo la temperatura su LCD la temp del Bollitore Basso
lcd.print("/B:");
TempColl=LcdTemperature(CollettoreSolare);
Mi da questo errore:
Funzione_Sensori.ino: In function 'void LcdTemperature(uint8_t*)':
Funzione_Sensori:63: error: return-statement with a value, in function returning 'void'
Se poi scrivo solo return; mi da quest'altro errore:
Funzione_Sensori.ino: In function 'void loop()':
Funzione_Sensori:76: error: void value not ignored as it ought to be
Funzione_Sensori:80: error: void value not ignored as it ought to be
selezionandomi questa parte di codice:
lcd.setCursor(0, 0); //Stampo la temperatura su LCD
lcd.print("BA:");
TempBollAlto=LcdTemperature(BollitoreAlto);
lcd.setCursor(8, 0); //Stampo la temperatura su LCD
lcd.print("/B:");
TempCollSolare=LcdTemperature(CollettoreSolare);
Secondo me quell'unico errore ne segnala 2. Il compilatore non capisce nella chiamata che fare, se fai return senza mettere float davanti si crea una situazione ambigua per lui.
nid69ita:
Secondo me quell'unico errore ne segnala 2. Il compilatore non capisce nella chiamata che fare, se fai return senza mettere float davanti si crea una situazione ambigua per lui.
Avevo quasi risolto...mi mancava la graffa al posto giusto. Questo ora funziona.
Ora sto cercando di capire come dire se la TempColl è maggiore di 6 gradi rispetto a TempBoll aziona il pin....
Edit: guarda un pò cosa ho fatto ora:
int X=5;
.....
if ((TempCollSol + X) > TempBollAlto){
Serial.print("il collettore è più caldo");
digitalWrite(9, HIGH); //Attivo la circolazione sul serpentino solare
} else if (TempCollSol < TempBollAlto){
Serial.print("il collettore è più freddo");
digitalWrite(9, LOW); //Disattivo la circolazione sul serpentino solare
} else {
digitalWrite(9, LOW); //Disattivo la circolazione sul serpentino solare
}
Edit:...fatto ora funziona
Ora devo creare un'altra funzione per il secondo relè. In sostanza devo impostare una variabile che corrisponde a una caldaia e che verrà costantemente confrontata con la caldaia per avere l'acqua calda in ogni istante della giornata
Edit2: fatto anche questo.
if (TempBollAlto >= caldaia){
Serial.print("Il bollitore è completo di ACS");
digitalWrite(8, HIGH); //Attivo la circolazione sul serpentino solare
} else if (TempCollSol <= TempBollAlto){
Serial.print("Il bollitore non ha l'ACS desiderata");
digitalWrite(8, LOW); //Disattivo la circolazione sul serpentino solare
} else {
digitalWrite(8, LOW); //Disattivo la circolazione sul serpentino solare
}
Ora il valore caldaia però deve poter essere variato da un potenziometro. Qui per me inizia ad essere difficoltoso.
Ecco il codice che ho fatto io...sarà pieno di errori ma nel serial monitor riesco ad ottenere 34 valori e potrei andare bene:
{
// letto l'input sul pin analogico 2:
int sensorValue = analogRead(A2);
// Converto la lettura analogica (compresa fra 0 - 1023)in un voltaggio tra (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
double tempdesiderata = (sensorValue / 30);
// Stampo sulla porta seriale il valore corrispondente.
Serial.print("Ecco la temperatura corrispondente: ");
Serial.println(tempdesiderata);
}
Ora dei valori compresi tra 0.00 e 0.34. Ho diviso per 30 per avere questi 30 valori e qui mi pare sia sbagliato ma non riesco a capire come poter fare.
Poi sto cercando di capire come dover confrontare questi 30 valori e associarli ad un valore di temperatura da stampare poi su lcd.
Sto facendo così...ma secondo me c'è un modo per ottimizzare il tutto. Ecco il codice completo di questa funzione:
{
// letto l'input sul pin analogico 2:
int sensorValue = analogRead(A2);
// Converto la lettura analogica (compresa fra 0 - 1023)in un voltaggio tra (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
double tempdesiderata = (sensorValue / 30);
// Stampo sulla porta seriale il valore corrispondente.
Serial.print("Ecco la temperatura corrispondente: ");
Serial.println(tempdesiderata);
if (tempdesiderata == 0){
caldaia = 30;
Serial.print ("La temperatura è 30 °C");
}else if (tempdesiderata == 1){
caldaia = 31;
Serial.print ("La temperatura è 31 °C");
}else{
Serial.print ("La temperatura è 00 °C");
}
}
Ho fatto giusto due valori e nel serial monitor ho le uscite corrette. Stavo cercando funzioni tipo array o case. Pensi che possa usarle?grazie