Se sei già registrato           oppure    

Orario: 19/04/2024 00:32:26  

 

Energia Alternativa ed Energia Fai Da Te > Arduino

VISUALIZZA L'ALBUM

Pagine: (3)   1   2   [3]    (Ultimo Msg)


Arduino - LCD 16X2 - controllo temperatura
FinePagina

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 11/02/2018 07:59:35

Mi ero scordato di questa discussione, più tardi ti posto un codice per leggere le sonde della dallas e fare quello che ti suggerivo.
Spero di non scordarmene



---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 11/02/2018 08:55:06

Usa questo codice per trovare il numero seriale I2C della sonda termica:


#include "OneWire.h"


//Dico setto come pin per la onewire il pin11 (pwm!!!)
OneWire  ds(2); 


void setup()
{
//Apro la comunicazion seriale
  Serial.begin(9600);
   }
 
 
 
 
 void loop()
{ 
   
  
  byte i;
  byte present = 0;
  byte numero = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
   
   if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  switch (addr[0]) {
    case 0x10:
      type_s = 1;
      break;
    case 0x28:
      type_s = 0;
      break;
    case 0x22:
      type_s = 0;
      break;
    default:
      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
  
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  
  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;
  numero = addr [1], DEC;

    Serial.print("Codice sonda =");
    Serial.write(' ');
    Serial.print(numero);
    Serial.print("  Temperatura = ");
    Serial.print(celsius);
    Serial.print(" C");
    Serial.println();
     
}



Mediante circuito con resistenza e corretta alimentazione collega una sonda termica alla volta al pin digitale 2 o altro pin, in tal caso ricordati di modificare l'istruzione all'inizio mettendo il numero del pin utilizzato.

Lancia il codice, con questa istruzione

celsius = (float)raw / 16.0;

leggerà il valore della temperatura della sonda e lo chiama celsius. Con questa istruzione

numero = addr [1], DEC;

leggerà il numero decimale del seriale della sonda.
Dopo ti scriverà a monitor seriale, il numero della sonda e la temperatura.

Annota il numero della sonda, cambia tra una sonda e l'altra, ma potrai trovarne due uguali i numeri sono massimo 225, scegline due con numero diverso.

A questo punto aggiungi al tuo codice il pezzo di sopra e modificato in questo modo:


#include "OneWire.h"


//Dico setto come pin per la onewire il pin11 (pwm!!!)
OneWire  ds(2); 


void setup()
{
//Apro la comunicazion seriale
  Serial.begin(9600);
   }
 
 
 
 
 void loop()
{ 
   
  
  byte i;
  byte present = 0;
  byte numero = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
   
   if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  switch (addr[0]) {
    case 0x10:
      type_s = 1;
      break;
    case 0x28:
      type_s = 0;
      break;
    case 0x22:
      type_s = 0;
      break;
    default:
      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
  
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  
  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;
  numero = addr [1], DEC;
    
    
    Serial.print("  Temperatura ");
    if (numero == 12) {
    Serial.print("casa " );
    
   }
   
    if (numero == 251) {
    Serial.print("ripostiglio ");
    
    }
        
    Serial.print(celsius);
    Serial.print(" C");
    Serial.println();
     
}

 


Dove in base al codice potrai far apparire la corrispondenza. I valori vanno sostituiti con quelli giusti ed i nomi che ho scelto sono casuali.

Chiaramente è un esempio potrai anche assegnare i valori a delle variabili, aggiungere delle condizioni che se non legge i codici attesi ti faccia apparire a monitor qualcosa tipo errore sonda o altro, oppure se il codice legge male le sonde vede i valori 200 o 87, allora gli puoi fare una istruzione che se legge tali valori ti fa apparire qualcosa per indicarlo, io faccio scrivere ND, non disponibile.



Modificato da calcola - 11/02/2018, 08:58:51


---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 11/02/2018 09:04:16

Quello di sopra è un esempio che usa solo la libreria OneWire, ma si può fare anche in altro modo, dove si usa la libreria della dallas, si fa leggere tutto il seriale e poi si pongono le condizioni desiderate.

Purtroppo in questo momento sono fuori sede e non ho possibilità di postarti un esempio.



---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

sabin

Avatar
MegaWatt


Gruppo:Utente
Messaggi:522

Stato:



Inviato il: 11/02/2018 11:03:25


CITAZIONE

Mediante circuito con resistenza e corretta alimentazione collega una sonda termica alla volta al pin digitale 2 o altro pin, in tal caso ricordati di modificare l'istruzione all'inizio mettendo il numero del pin utilizzato.


Grazie per i consigli, più tardi leggerò con più attenzione.
Sono in attesa che mi arrivino i sensori.
Intanto ho fatto la scheda, l'ho provata con due sensori cablati e funziona,
allego l'immagine.



Immagine Allegata: 180200_schema.jpg
 
ForumEA/S/180200_schema.jpg



---------------
Inverter UPS Power Star W7 (onda pura) ingresso 24 v... 220V 2 Kw con spunto da 6 Kw? (direi 3Kw)
Pannelli 11,1 mq. Wp 1320 (x120 Wp mq)... n° 5 monoc. 72 celle 750 Wp (SO) su MPPT SolarMate 40A
n° 3 polic. 60 celle 570 Wp (Sud) su PWM 30A... batterie: 2 coppie SMA (trazione) 24V 120 Ah C/10 (+ 2 avviamento 70Ah)
Switch enel/batterie con Arduino Pro Mini

 

sabin

Avatar
MegaWatt


Gruppo:Utente
Messaggi:522

Stato:



Inviato il: 11/02/2018 20:47:44

Ho provato il codice, ho visto il numero che distingue i sensori.
Vedo anche che legge un sensore ad ogni loop, ma non ho capito dove avviene la scelta.

Ho provato a ritagliare la parte essenziale del codice per leggere i DS18B20,
è venuto fuori questo


#include "OneWire.h"


//Dico setto come pin per la onewire il pin11 (pwm!!!)
OneWire  ds(2); 
int giro = 0;

void setup()
{
//Apro la comunicazion seriale
  Serial.begin(9600);
   }
 
 
 
 
 void loop()
{ 
   
  byte i;  
  byte present = 0;
  byte numero = 0;
  byte data[12];
  byte addr[8];
  float celsius;
   
   if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      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
  
  for ( i = 0; i < 9; i++) {           // servono 9 bytes
    data[i] = ds.read();
  }

// << >> operatore di spostamento bit a bit spostano il valore alla loro sinistra dal numero di bit alla loro destra

  unsigned int raw = (data[1] << 8) | data[0];
  
	  
  celsius = (float)raw / 16.0;
  numero = addr [1], DEC;
    
//   -----  Print  -----
    
    Serial.print("  Temperatura ");
    if (numero == 116) {
    Serial.print("sens. 116.. " );
    
   }
   
    if (numero == 174) {
    Serial.print("  sens. 174.. ");
    
    }
        
    Serial.print(celsius);
    Serial.print(" C");
	Serial.println();
  
 giro ++;     
    Serial.print("loop n. ");
    Serial.print(giro);
	Serial.println();

}


La lettura dei due sensori che ho, avviene come la versione intera del tuo codice.

Interessante anche questo codice che riconosce il tipo di sensore,
e visualizza una strina numerica. La seconda coppia di numero esadecimale contiene in numero che riconosce il sensore.

// https://gist.github.com/kjordahl/1002726

/* Nome: onewire.pde
 Leggi i dati da più sensori digitali di temperatura DS18x20
 DS18B20 
 DS18S20 
 * Rileva il numero e il tipo di sensori, e se ognuno utilizza la potenza parassita
 * Gestisce agevolmente il collegamento / scollegamento dei sensori (ma non lo farà
   rilevare nuovi sensori dopo l'inizializzazione)
 Basato su sample.pde dalla libreria OneWire (v2.0),
 copyright Jim Studt, Paul Stoffregen, Robin James e altri
 Richiede OneWire 
 Kelsey Jordahl
 kjordahl@alum.mit.edu
 http://kjordahl.net
 Data e ora:  
*/

#include 

#define ONEWIREPIN   2		/* OneWire bus on digital pin 7 */
#define MAXSENSORS   4		/* Maximum number of sensors on OneWire bus */

// Model IDs
#define DS18S20      0x10
#define DS18B20      0x28
#define DS1822       0x22

// OneWire commands
#define CONVERT_T       0x44  // Tells device to take a temperature reading and put it on the scratchpad
#define COPYSCRATCH     0x48  // Copy EEPROM
#define READSCRATCH     0xBE  // Read EEPROM
#define WRITESCRATCH    0x4E  // Write to EEPROM
#define RECALLSCRATCH   0xB8  // Reload from last known
#define READPOWERSUPPLY 0xB4  // Determine if device needs parasite power
#define ALARMSEARCH     0xEC  // Query bus for devices with an alarm condition

class Sensor /* hold info for a DS18 class digital temperature sensor */
{
 public:
  byte addr[8];
  boolean parasite;
  float temp;

};


int HighByte, LowByte, TReading, SignBit, Tc_100;
byte i, j, sensors;
byte present = 0;
boolean ready;
int dt;
byte data[12];
byte addr[8];
OneWire ds(ONEWIREPIN);		// DS18S20 Temperature chip i/o
Sensor DS[MAXSENSORS];		/* array of digital sensors */




void setup(void) {
  // initialize inputs/outputs
  // start serial port
  Serial.begin(9600);
  sensors = 0;
  Serial.println("Searching for sensors...");
  while ( ds.search(addr)) {
    if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n");
      break;
    }
  Serial.println("  seconda cifra esadecimale, num. sensore");
    delay(1000);
    ds.write(READPOWERSUPPLY);
    boolean parasite = !ds.read_bit();
    present = ds.reset();
    Serial.print("temp");
    Serial.print(sensors,DEC);
    Serial.print(": ");
    DS[sensors].parasite = parasite;
    for( i = 0; i < 8; i++) {
      DS[sensors].addr[i] = addr[i];
      Serial.print(addr[i], HEX);
      Serial.print(" ");
    }
    //Serial.print(addr,HEX);
    if ( addr[0] == DS18S20) {
      Serial.print(" DS18S20");
    }
    else if ( addr[0] == DS18B20) {
      Serial.print(" DS18B20");
    }
    else {
      Serial.print(" unknown");
    }
    if (DS[sensors].parasite) {Serial.print(" parasite");} else {Serial.print(" powered");}
    Serial.println();
    sensors++;
  }
  Serial.print(sensors,DEC);
  Serial.print(" sensors found");
  Serial.println();
  for (i=0; i



---------------
Inverter UPS Power Star W7 (onda pura) ingresso 24 v... 220V 2 Kw con spunto da 6 Kw? (direi 3Kw)
Pannelli 11,1 mq. Wp 1320 (x120 Wp mq)... n° 5 monoc. 72 celle 750 Wp (SO) su MPPT SolarMate 40A
n° 3 polic. 60 celle 570 Wp (Sud) su PWM 30A... batterie: 2 coppie SMA (trazione) 24V 120 Ah C/10 (+ 2 avviamento 70Ah)
Switch enel/batterie con Arduino Pro Mini

 

calcola
GigaWatt


Gruppo:Utente
Messaggi:4435

Stato:



Inviato il: 11/02/2018 22:40:19

Si, l'unico modo per ottenere quanto ti sei prefissato é quello di lavorare con il seriale delle sonde.



---------------
Impara l'arte e mettila da parte
14 pannelli da 100w, inverter kemapower 3kw, regolatore morningstar tristar ts60, banco batterie n.1 di 12 elementi 2v 480Ah C5 corazzate per trazione pesante, banco batterie n.2 di 400Ah in C5 formato da 24 elementi 2V 200Ah corazzate al gel per fotovoltaico in due serie da 12 elementi, centralina di gestione impianto autoprodotta.

 

sabin

Avatar
MegaWatt


Gruppo:Utente
Messaggi:522

Stato:



Inviato il: 27/04/2018 21:59:59

Da un po di giorni la caldaia a legna si sta riposando, e sto cambiando il quadretto con sensori analogigi, con uno che dovrebbe gestire 4 sensori digitali DS18B20.
Ma è spuntato un problema, che forse è riconducibile alla lunghezza dei cavi.
Ogni sensore ha un cavo di circa 4 metri.
Se collego solo tre sensori, funziona (basta che scollego uno qualsiasi dei 4 e funziona).

Nella breadboard il codice funziona.
I 4 sensori vengono letti.

Nel quadro ho provato vari codici per la ricerca dei sensori ma se sono collegati tutti e 4 non trovano nulla.

Ho trovato una discussione su un problema simile
"massima lunghezza one wire bus"
http://forum.arduino.cc/index.php?topic=138077.0
..... avevi ragione!! Ho messo una resistenza di pull-up da 1 K anzichè da 4.7 K e tutto sembra funzionare. La distorsione c'e' ancora ma meno di prima e comunque i sensori rispondono. Rimane il dubbio che forse un doppino telefonico funziona meglio di un cavo schermato! provero' in seguito.....


Per fare un'ipotesi estrema.
Se nella breadboard (sensori senza cavo) mettessi una resistenza di pull-up da 1 K anziché da 4.7 K
Si potrebbe danneggiare Arduino?



---------------
Inverter UPS Power Star W7 (onda pura) ingresso 24 v... 220V 2 Kw con spunto da 6 Kw? (direi 3Kw)
Pannelli 11,1 mq. Wp 1320 (x120 Wp mq)... n° 5 monoc. 72 celle 750 Wp (SO) su MPPT SolarMate 40A
n° 3 polic. 60 celle 570 Wp (Sud) su PWM 30A... batterie: 2 coppie SMA (trazione) 24V 120 Ah C/10 (+ 2 avviamento 70Ah)
Switch enel/batterie con Arduino Pro Mini

 
 InizioPagina
 

Pagine: (3)   1   2   [3]    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum