Go Down

Topic: Sensore di temperatura DTH11 via I2C (Read 2392 times) previous topic - next topic

mrboss

Salve a tutti,

sono alle prese con automazione e arduino.
Al momento attuale il mio progetto controlla 6 uscite di arduino oltre a leggere tre sensori di temperatura, il tutto via web interfacciando arduino con un db attraverso PHP.
Singolarmente tutto funziona, ma adesso ho la necessità di "remotizzare" ingressi e uscite in diverse stanze della casa.
In pratica ho pensato di utilizzare tre PCF8574A, 8 port expander, uno per ogni stanza, ai quali collegare i sensori di temperatura.
Ora il problema:
Come si fa a definire i pin del PCF?
Mi spiego meglio:
se scrivo #define pin_out_a 3 sto definendo il pin digitale 3 di arduino.
Se scrivo #define pin_out_b 14 definisco il pin analogico 1 come digitale.
Assumendo che il port expander si chiama exp_a come si fa a definire i pin di quest'ultimo?
La necessità nasce dal fatto che il DTH11, sensore che uso per la temperatura, ha bisogno di un pin definto per la lettura dei dati.
Grazie a quanti sapranno aiutarmi.

PaoloP

Ti rimando a questo sito che spiega il funzionamento dell'integrato --> http://www.laurtec.it/brief-notes/programmazione-pic/125-bn0013-it-pcf8574-i2c-io-expander-libreria-ed-utilizzo
Qui c'è un tutorial --> http://garagelab.com/profiles/blogs/tutorial-arduino-i-o-port-expander-with-pcf8574

mrboss

Beh, io ho spostato il post in questa sezione e leggendo il tuo commento inizio a credere di non essermi spiegato bene.
Ho già implementato sia il PCF che i sensori.
Il mio unico problema e come fare a dire al sensore che è collegato all' ingresso 1 del PCF.

Posto il codice che sto utilizzando:
Al momento se collego il sensore (one wire) all'ingresso analogico 1 della board, abilitato come ingresso digitale, legge i dati e funziona tutto.
Ma vorrei farlo leggere dal PCF.

Code: [Select]
#include <PCF8574.h> // Required for ... all
#include <Wire.h> // Required for I2C communication
#include <dht11.h> // Required for sensor communication
dht11 DHT11; // Create object from DHT11 class
PCF8574 expander; // Create object from PCF8574 class

#define DHT11PIN 14; // define the pin where is connected the sensor. In this case pin Analog 1 (like digital) of arduino UNO.

void setup(){

Serial.begin(9600);
  expander.begin(0x38); //init PCF address
  expander.pinMode(7,OUTPUT); // Setup pin D7 as output
  expander.pinMode(1,INPUT); // Setup pin D1 as input

  Serial.println("DHT11 TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);
  Serial.println();
 
  }



void loop(){

expander.blink(7,5,200);
delay(1000);
 
int chk = DHT11.read(DHT11PIN);

  Serial.print("Read sensor: ");
  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }

  Serial.print("Humidity (%): ");
  Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");
  Serial.println((float)DHT11.temperature, 2);
delay(2000);

} // Loop forever

Testato

mmm, non so se si puo' usare come dici tu,

l'expander legge/scrive l'intero byte, e lo riversa sul bus i2c.
tu vuoi attaccare un sensore 1 wire, che e' si digitale, ma usa un protocollo seriale, su un pin, e poi leggerlo con i2c.
Ma il valore rilevato sara' 0 o 1 in base all'istante di trasmissione.
dovresti sincronizzare le letture su i2c con la trasmissione 1wire, ed in un determinato tempo inserire i dati rilevati su un solo pin dell'expander in un buffer, per poi interpretarli.

spero in due soluzioni per te,
1) che io mi sbagli  :)
2) se non mi sbaglio, che qualcuno abbia scritto una libreria per gestire il tutto

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

ibbba

#4
Aug 05, 2012, 05:50 pm Last Edit: Aug 05, 2012, 06:24 pm by ibbba Reason: 1
purtroppo è non possibile collegare il DHT su una uscita/ingresso del port expander,quindi ti conviene usare un pin diretto dall'arduino per sfruttare la libreria ed il protocollo di comunicazione con il medesimo.


mrboss

Ciao e grazie ad entrambi,

Quote
1) che io mi sbagli 
2) se non mi sbaglio, che qualcuno abbia scritto una libreria per gestire il tutto


@Testato:
1 - hai  capito benissimo   :)
2 - qualcuno ha sicuramente scritto qualcosa. :D

esiste il DS1624 che è un misuratore di temperatura su I2C.
Avendo visto questo ho pensato che potesse essere possibile farlo con i componenti staccati, un bridge i2c e un sensore temperatura.
Ma devo ammettere che non sono un granchè in lettura datasheet & Co.
E poi il tutto lo avevo nel cassetto della scrivania, il DS avrei dovuto acquistarlo e costicchia un po...

Speriamo che qualcun'altro abbia avuto già la stessa esperienza...

ibbba

...ti conviene fare tutto su bus I2C...il port expander non è implementabile in comunicazioni complesse per sua stessa natura (vedi funzionamento ingressi sul datasheet)

rizz

Perdonate.. non so se avete risolto ma per quello che mi riguarda sto progettando proprio una cosa simile.
http://forum.arduino.cc/index.php?topic=252807.0

Ciao

Go Up