Scrittura codice per impianto birra cerco collaboratori Monza/Milano

Trovato un pò di tempo ho messo insieme un pò di righe di codice per il controllo

Nella foto la linea rossa è la temperatura rilevata (simulata al momento da una funzione)
La linea centrale gialla è la temperatura impostata e l'altra linea celeste è il valore del controllo pid .

ora mi manca di prendere l'arduino attaccare sonda e relè e vedere come si comporta in una situazione reale.

MrLofraz:
Ma per piastra riscaldante in vetro ceramica, intendi quello portatili Niky?

ma sei sicuro che per scaldare e tenere a temperatura un po di brodo ci va tanto studio?

va bene tenerere a bada un altoforno che produce/costa milioni di euro bisogna essere previdenti,

ma per queste cose le soluzioni sono gia state trovate e collaudate

Rieccomi, scusate per l'assenza prolungata ma ,ho passato 4 giorni di passione!
Niky, l'hai presa proprio sul serio 'sta cosa! :grin:

No è una vita che devo finire quel coso e non ho mai trovato tempo, ora che ci ho rimesso le mani non farmi cambiare idea!!!!
Parte del progetto la riutilizzero anche per un sistema di cottura a bassa temperatura che volevo fare da tempo.
Non tutti sanno che 'il brodo' cotto a bassa temperatura è mooolto più buono! XD

Allora, partiamo dal principio.....
Non riesco a leggere nemmeno una temperatura a seriale.
Sonda ds18b20 e arduino uno rev3.
Come si scrive il codice?

MrLofraz:
Sonda ds18b20 e arduino uno rev3.
Come si scrive il codice?

ciao,
scaricati OneWire.zip da:
http://www.pjrc.com/teensy/td_libs_OneWire.html
una volta decompresso deve essere messo nella cartella libraries.
Dopo aver rilanciato Arduino nel menu file => esempi => OneWire troverai:
L' esempio DS18x20_Temperature bello e pronto

Luca

Ho caricato quella libreria, ma il risultato è che legge una temperatura maggiore di circa 3°C rispetto ad un termometro a mercurio che ritengo affidabile.
Provando poi a collegare la sonda in parasite mode, la situazione peggiora ancora di più.
Poi, siccome dovrò visualizzare la temperatura su un display, cosa si può togliere dal codice, in maniera di visualizzare soltanto "temperatura = 26,5" (es.)?

Il codice è questo

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10); // on pin 10

void setup(void) {
// initialize inputs/outputs
// start serial port
Serial.begin(9600);
}

void loop(void) {
byte i;
byte present = 0;
byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
Serial.print("No more addresses.\n");
ds.reset_search();
return;
}

Serial.print("R=");
for( i = 0; i < 8; i++) {
Serial.print(addr*, HEX);*

  • Serial.print(" ");*
  • }*
  • if ( OneWire::crc8( addr, 7) != addr[7]) {*
  • Serial.print("CRC is not valid!\n");*
  • return;*
  • }*
  • if ( addr[0] == 0x10) {*
  • Serial.print("Device is a DS18S20 family device.\n");*
  • }*
  • else if ( addr[0] == 0x28) {*
  • Serial.print("Device is a DS18B20 family device.\n");*
  • }*
  • else {*
  • Serial.print("Device family is not recognized: 0x");*
  • Serial.println(addr[0],HEX);*
  • return;*
  • }*
  • ds.reset();*
  • ds.select(addr);*
  • ds.write(0x44,1); // start conversion, with parasite power on at the end*
  • delay(1000); // maybe 750ms is enough, maybe not*
  • // we might do a ds.depower() here, but the reset will take care of it.*
  • present = ds.reset();*
  • ds.select(addr); *
  • ds.write(0xBE); // Read Scratchpad*
  • Serial.print("P=");*
  • Serial.print(present,HEX);*
  • Serial.print(" ");*
  • for ( i = 0; i < 9; i++) { // we need 9 bytes*
    _ data = ds.read();_
    _ Serial.print(data*, HEX);
    Serial.print(" ");
    }
    Serial.print(" CRC=");
    Serial.print( OneWire::crc8( data, 8), HEX);
    Serial.println();
    }*_

è meglio se lo racchiudi tra i tag "code"

Bè, non conosco la libreria, ma nel tuo codice non vedo la conversione, quindi immagino sia nella libreria. dovresti aprire il file della libreria e trovare la riga di conversione, li sicuramente ci trovi il valore da cambiare per 'tarare' la sonda.
Per la stampa dei valori è abbastanza intuitivo, ogni riga Serial.print() stampa qualcosa, se Serial.println() stampa e poi va a capo. Individua le righe che non vuoi e le 'commenti' mettendo // all'inizio della riga. modifica poi la riga che ti stampa la temperatura e scrivici quello che vuoi.

Perdonami, la conversione sta nello sketch di esempio, che tu hai tagliato, o non hai postato completamente.
alla fine dello sketch dovresti avere questo:

  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");

dove la riga 'celsius = (float)raw / 16.0;' ti da il risultato che viene stampato. basta che alla fine dellì'operazione aggiungi '- 3.0' e sei a posto.

il codice l'ho preso da qui.

Ciao!

dab77:
basta che alla fine dellì'operazione aggiungi '- 3.0' e sei a posto.

Ciao!

Pensi veramente che sottraendo 3 gradi così a muzzo si risolva il problema??

se vuoi fae le cose fatte bene, prendo un cubetto di ghiaccio e fai la misura, (0°), poi prendi una trazza di acqua calda e fai la prova (confronto col mercurio), poi una misura a temperatura ambiente sempre a confronto con il termometro a mercurio.

se in tutti i casi l'errore è 3gradi, allora sì, è così semplice. Altrimenti devi trovare la curva (o la retta) che unisce i punti trovati, e poi il valore che leggerai lo metterai nella funzione curva/retta e otterrai come risultato la temperatura vera.

La dalla DS18b20 è una sonda di precisione che restituisce direttamente il valore in gradi celsius.

Tratto dal datasheets , pagina 3 di 22:

The DS18B20 output temperature data is calibrated in degrees Celsius.

Per esperienza mia, sono tutte abbastanza precise ed uno scostamento di 3 gradi è inammissibile.
Secondo me il test fornito da MrLofraz è inattendibile.

@Lesto: ritengo che sia impossibile che in tutto il range misurabile ci possa essere uno scostamento costante di 3 gradi.

Prova ad utilizzare la libreria presente a questo indirizzo con relativo esempio , è sicuramente più completa : DallasTemperature library

Poi se non ricordo male la sonda che hai tu è quella rivestita di plastica, potrebbe essere quello il problema , un cattivo trasferimento termico tra l'involucro e il sensore potrebbe esserne la causa, ma se fosse questo non ha sicuramente un andamento lineare nel tempo.

Prova ad immergere entrambi i termometri in acqua fredda e a lasciarli li per un pò di tempo,il valore della tua sonda dovrebbe decrescere nel tempo fino a stabilizzarsi ad un valore comuque non corretto (più alto della T reale).

@MrLofraz: lascia perdere il parasite mode per ora, t'infogni di più e basta!

mah,... un terrmometro ambientale che sballa di 3 gradi deve finire in posto solo
la pattumiera

niki77:
@Lesto: ritengo che sia impossibile che in tutto il range misurabile ci possa essere uno scostamento costante di 3 gradi.

anche io, ma magari è un "semplice" errore di calibrazione dalla fabbrica..

Come si può notare QUI gli scostamenti rilevati su un campione di 35 sonde (10 DS18s20 e 25 DS18b20) sono irrisori, o perlomeno molto al di sotto di quanto ci serve.

Alla fine le librerie ti servono tutte e due.
Sia quella indicata da Nik77 --> http://download.milesburton.com/Arduino/MaximTemperature/DallasTemperature_372Beta.zip
Che quella di llluca --> http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip
Infatti la libreria di Miles si appoggia alla OneWire (sempre di Miles).

Il codice di esempio (preso sempre dalla wiki di Miles) è:

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));  
}

Per il collegamento ricordati la resistenza di pull-up sul pin centrale.

gingardu:
terrmometro ambientale che sballa di 3 gradi

secondo me l' errore dovrebbe trovarsi:

if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }

cece99:
Scusate, eh, cosa centra sto PID?
non basta rilevare la temperatura con un sensorino e accendere e spegnere il riscaldatore per mantenere la temperatura prefissata? :grin:

Ma infatti...

http://www.arduino.cc/playground/Main/BarebonesPIDForEspresso

altri interessanti risultati cercando "arduino pid temperatura".