| calcola
| 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
| 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
| 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
| 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
--------------- 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
| 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
| 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
| 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
| |
| | |
|
Versione Mobile!
|
|
|
|
|
|
|