arduino: sensori temperature, etc...

Tutto sull'Arduino e la sua grande famiglia... Atmel AVR, Microchip PIC, ecc...

Moderatori: ragno, tapino, alez, zulu, davidea

Rispondi
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

arduino: sensori temperature, etc...

Messaggio da ragno »

Ho realizzato per testare i sensori un micro rivelatore di temperature.

Caratteristiche:

2 sensori 1-wire (ds1820) in modalita' parassita.
1 74HC595 shift register per utilizzare solo 3 wire per pilotare un display lcd
1 lcd standard 16x2

Librerie:

Onewire: http://www.pjrc.com/teensy/td_libs_OneWire.html
ShiftOut: http://www.instructables.com/id/LCD-Shi ... r-Arduino/
Lcd: http://www.instructables.com/id/LCD-Shi ... r-Arduino/

Sketch:

Codice: Seleziona tutto

#include <OneWire.h>
#include <Lcd.h>
#include <ShiftOut.h>


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

ShiftOut sOut(8, 12, 11, 1);
Lcd lcd = Lcd(16, FUNCTION_4BIT | FUNCTION_2LINE | FUNCTION_5x11, &sOut);
 
void setup()
{
  // initialize inputs/outputs
  // start serial port
  Serial.begin(9600);
  
  lcd.set_ctrl_pins(CTRLPINS(1,2,3)); // RS->1, RW->2, E->3
  lcd.set_data_pins(_4PINS(4,5,6,7)); // D4->4, D5->5, D6->6, D7->7
 
  lcd.setup();
 
  lcd.clear();
}
 
void loop()
{
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
//      Serial.print("No more addresses.\n\n");
      Serial.println("------------------");
      ds.reset_search();
      delay(8000);
      //lcd.home();
      lcd.clear();
      return;
  }

//  Serial.print("R=");
//  for( i = 0; i < 8; i++) {
//    Serial.print(addr[i], 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.");
  }
  else if ( addr[0] == 0x28) {
      Serial.print("Device is a DS18B20 family device.");
  }
  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[i] = ds.read();
 //   Serial.print(data[i], HEX);
 //   Serial.print(" ");
 }
//  Serial.print(" CRC=");
 // Serial.print( OneWire::crc8( data, 8), HEX);
  Serial.println();
  //lcd.clear();

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  Serial.print("Temperatura: ");
  lcd.print("Temp.: ");

  if (SignBit) // If its negative
  {
     Serial.print("-");
     lcd.print("-");    
  }
  Serial.print(Whole);
  lcd.print(Whole);
    
  Serial.print(".");
  lcd.print(".");
  
  if (Fract < 10)
  {
     Serial.print("0");
     lcd.print("0");    
  }
  Serial.print(Fract);
  lcd.print(Fract);

  Serial.println();
  lcd.move_to(1,2);
  
    //lcd.home();
  //lcd.print((long)millis() / 1000);
}

arduino2009.jpg
arduino2009.jpg (56.69 KiB) Visto 3239 volte
I fili Blu, Rosso e Verde sono il collegamento dati al display. Rosa e Bianco: 5+ e GND.
La resistenza volante di pullup serve per l'alimentazione parassita dei DS1820 (fili rosso e nero volanti).
display.jpg
display.jpg (55.35 KiB) Visto 3239 volte
Temperatura esterna e interna (azz che freddo) :mrgreen:
Notare anche il trimmer per la regolazione del contrasto.

saluti
ragno
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: arduino: sensori temperature, etc...

Messaggio da alez »

Ho ordinato un po di roba ultimamente, diverse DS18S20

Grazie molto interessante il display 3 wire :idea1:





Riguardo alla tua proposta della sezione Arduino, io ti appoggio ma sto giro però diventi moderatore e la smetti di rompere :mrgreen:





P.s.: che freddo? ma non mi fare incaxxare :lol: qua hanno iniziato a girare i camion con gli scavatori per portare via i mucchi di neve che non si sciolgono (di giorno -2 di notte -13 da 2 settimane), ormai non si sa + dove metterla :D
Ciao alez
davidea
Messaggi: 1279
Iscritto il: 16 ago 2009, 13:32
Località: Palermo
Contatta:

Re: arduino: sensori temperature, etc...

Messaggio da davidea »

ragno ha scritto:Ho realizzato per testare i sensori un micro rivelatore di temperature.
display.jpg
Temperatura esterna e interna (azz che freddo) :mrgreen:
Notare anche il trimmer per la regolazione del contrasto.

saluti
ragno

cioe' neanche 14 gradi interno casa???? ma sei fuori??? :lol: io a casa mia ci sono solo 21 gradi!!!!
davidea
Messaggi: 1279
Iscritto il: 16 ago 2009, 13:32
Località: Palermo
Contatta:

Re: arduino: sensori temperature, etc...

Messaggio da davidea »

aggiungo a scanso di equivoci, "hai il banchetto di lavoro elettronico fuori casa?"
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: arduino: sensori temperature, etc...

Messaggio da ragno »

davidea ha scritto:
ragno ha scritto:Ho realizzato per testare i sensori un micro rivelatore di temperature.
display.jpg
Temperatura esterna e interna (azz che freddo) :mrgreen:
Notare anche il trimmer per la regolazione del contrasto.

saluti
ragno

cioe' neanche 14 gradi interno casa???? ma sei fuori??? :lol: io a casa mia ci sono solo 21 gradi!!!!
Si, caro, c'e' poco da ridere: lo scorso anno, a luglio, ho avuto 150 cm di acqua che oltre al resto m'allegato la centrale termica. Visto che il problema a livello territoriale non e' stato risolto, l'impianto non e' stato sostituito. Ho solo una stufa a pellet e mi devo accontentare.

ciao
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
von fritz
Messaggi: 1479
Iscritto il: 18 gen 2007, 23:33

Re: arduino: sensori temperature, etc...

Messaggio da von fritz »

Hello
alez ha scritto:
Riguardo alla tua proposta della sezione Arduino, io ti appoggio ma sto giro però diventi moderatore e la smetti di rompere :mrgreen:


P.s.: che freddo? ma non mi fare incaxxare :lol: qua hanno iniziato a girare i camion con gli scavatori per portare via i mucchi di neve che non si sciolgono (di giorno -2 di notte -13 da 2 settimane), ormai non si sa + dove metterla :D
Appoggio, solo se @ragno fa il mod :twisted:

bye
VDRBOX-HD : in pensione!
ALTRO : freerunner (openmoko) ; nokia n900 ; 2 seagate dockstar, samsung ps64d8000, diversi dispositivi ARM (Allwinner, Amlogic) ;)
Don't feed the trolls non alimentate sistemi proprietari ;)

Linux rulez! :)
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: arduino: sensori temperature, etc...

Messaggio da ragno »

vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: arduino: sensori temperature, etc...

Messaggio da alez »

Con quella temperatura si conserva bene e rimane + giovane :D








P.s.: a me 21 gradi inizierebbero già a dare fastidio, ora che ho il piccolo tengo a 20 di giorno ma di notte lascio scendere a 17, ritengo che sia + sano
Ciao alez
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: arduino: sensori temperature, etc...

Messaggio da ragno »

vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
alez
Messaggi: 3074
Iscritto il: 09 mag 2007, 17:11

Re: arduino: sensori temperature, etc...

Messaggio da alez »

Ciao alez
davidea
Messaggi: 1279
Iscritto il: 16 ago 2009, 13:32
Località: Palermo
Contatta:

Re: arduino: sensori temperature, etc...

Messaggio da davidea »

ragno ha scritto: Si, caro, c'e' poco da ridere: lo scorso anno, a luglio, ho avuto 150 cm di acqua che oltre al resto m'allegato la centrale termica. Visto che il problema a livello territoriale non e' stato risolto, l'impianto non e' stato sostituito. Ho solo una stufa a pellet e mi devo accontentare.

ciao

non ti invidio, io ho 13 gradi in veranda, (dove ho fatto gli stampati) e per me e' gia' freddo!
stasera siamo stati fuori, siamo tornati e il termo segnava 19 gradi, ho acceso la caldaia!
stai a piano terra?
@alez , io preferisco il caldo , anche molto, pero' ti diro' a roma questa settimana in albergo ho sentito mooolto caldo, il termostato non era settabile sotto i 23! la sera per rinfrescare un po' aprivo 10 minuti la finestra.
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: arduino: sensori temperature, etc...

Messaggio da ragno »

Aggiungo per rientrare in tema che,per la gestione parallela seriale del display, ho provato anche:

https://nodeload.github.com/marcmerlin/ ... all/master
https://bitbucket.org/fmalpartida/new-liquidcrystal/
http://arduinoshiftreglcd.googlecode.co ... .09.tar.gz

provando cablaggi differenti, senza riuscire a cavare un ragno dal buco. In rete ci sono numerosi esempi....
Insomma il display sono riuscito a farlo funzionare solo con la lib indicata nel primo messaggio.

Interessante e' sarebbe anche la versione 2 wire (con data e enable sulla stessa linea)...
La lib LCD e' molto minimale, ma comunque per il momento mi accontento.

ciao
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: arduino: sensori temperature, etc...

Messaggio da ragno »

Aggiornamento: dopo un po' di prove sono riuscito a realizzare lo schema 2Wire (solo 2 pin per pilotare il display)

Lo schema 2WIRE e' questo:
Immagine

N.B. per il contrasto (VO) si puo' utilizzare un altro pin (analogico) e regolare la tensione via software:

Codice: Seleziona tutto

#define   CONTRAST_PIN   9
#define   CONTRAST       90
[.....]
pinMode(CONTRAST_PIN, OUTPUT);
analogWrite (CONTRAST_PIN, CONTRAST);
Oppure utilizzare, come nel mio caso, un trimmer nella solita configurazione.
LCD_schem.png
LCD_schem.png (31.26 KiB) Visto 3103 volte
Le librerie compatibili (uso questa, non ho capito qual'e' la differenza):
https://bitbucket.org/fmalpartida/new-l ... l/overview

oppure

https://github.com/marcmerlin/NewLiquidCrystal

Nuovo sketch (ho commentato con //// le differenze rispetto alla vecchia, attualmente 6674 bytes, potrebbe girare con un atmega8 senza bootloader):

Codice: Seleziona tutto

#include <OneWire.h>
////#include <Lcd.h>
////#include <ShiftOut.h>

#include <Wire.h>
#include <LiquidCrystal_SR.h>

LiquidCrystal_SR lcd(7,8,TWO_WIRE);
//                   | | + enable
//                   | \-- Clock Pin
//                   \---- Data/Enable Pin


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

////ShiftOut sOut(8, 12, 11, 1);
////Lcd lcd = Lcd(16, FUNCTION_4BIT | FUNCTION_2LINE | FUNCTION_5x11, &sOut);
 
void setup()
{
  
    // initialize inputs/outputs
  // start serial port
  Serial.begin(9600);
  
  ////lcd.set_ctrl_pins(CTRLPINS(1,2,3)); // RS->1, RW->2, E->3
  ////lcd.set_data_pins(_4PINS(4,5,6,7)); // D4->4, D5->5, D6->6, D7->7
 
  //lcd.setup();
 
  //lcd.clear();
  lcd.begin(24,2);               // initialize the lcd
  lcd.home ();                   // go home
  lcd.print("wait...");
  delay(1000);    
  lcd.home ();        
}
 
void loop()
{
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
//      Serial.print("No more addresses.\n\n");
      Serial.println("------------------");
      ds.reset_search();
      delay(30000);
      //lcd.home();
      lcd.clear();
      return;
  }

//  Serial.print("R=");
//  for( i = 0; i < 8; i++) {
//    Serial.print(addr[i], 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.");
  }
  else if ( addr[0] == 0x28) {
      Serial.print("Device is a DS18B20 family device.");
  }
  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[i] = ds.read();
 //   Serial.print(data[i], HEX);
 //   Serial.print(" ");
 }
//  Serial.print(" CRC=");
 // Serial.print( OneWire::crc8( data, 8), HEX);
  Serial.println();
  //lcd.clear();

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  if (SignBit) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

  Whole = Tc_100 / 100;  // separate off the whole and fractional portions
  Fract = Tc_100 % 100;

  Serial.print("Temperatura: ");
  lcd.print("Temp.: ");

  if (SignBit) // If its negative
  {
     Serial.print("-");
     lcd.print("-");    
  }
  Serial.print(Whole);
  lcd.print(Whole);
    
  Serial.print(".");
  lcd.print(".");
  
  if (Fract < 10)
  {
     Serial.print("0");
     lcd.print("0");    
  }
  Serial.print(Fract);
  lcd.print(Fract);

  Serial.println();
  ////lcd.move_to(1,2);
  lcd.setCursor ( 0,2 ); // go to position

    //lcd.home();
  //lcd.print((long)millis() / 1000);
}

Immagine prossimamente...

saluti
ragno
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Avatar utente
ragno
Messaggi: 3017
Iscritto il: 20 gen 2007, 09:43
Località: Marte e dintorni
Contatta:

Re: arduino: sensori temperature, etc...

Messaggio da ragno »

arduino:
IMG149_1.jpg
IMG149_1.jpg (42.03 KiB) Visto 3095 volte
display:
IMG150_1.jpg
IMG150_1.jpg (33.01 KiB) Visto 3095 volte
breadboard:
IMG151_1.jpg
IMG151_1.jpg (56.6 KiB) Visto 3095 volte
vdr: 1.4.7+extpatch54 (pensionata), 1.7.27 (yavdr 0.4)
Percorri la via che porta al sole,
e non camminare sui sentieri oscuri.

E quando penso che sia finita,
è proprio allora che comincia la salita.
Rispondi