sht10 leggere la temperatura del sensore in I2C bus

salve. sapete aiutarmi per usare l'I2C bus per quanto riguarda il sensore di temperatura / umidità sht 10. su internet non ho trovato un gran che. ho trovato 2 librerie specifiche di questo sensore ma volevo sapere se potevo andare a un livello più diretto usando solo la libreria write. non voglio usare una libreria specifica perché mi serve per capire come usare in generale l'I2C. seconda piccola domanda sullo stesso collegamento data clock posso collegare anche un sensore di pressione che anche lui va in I2C bus senza usare altre porte?

Prima di tutto devi capire come funziona I2C ... che è un BUS e su cui puoi mettere più devices ... ciascuna con il suo indirizzo logico. Comincia a leggere QUI ...

Poi ... se ti studi il datasheet del SHT10 ... usi la libreria Wire e ci parli ;)

E SI, come detto, sul bus I2C puoi mettere più devices !

Guglielmo

ma quello non e' un I2C l'I2C riconosce e indirizza il componente attraverso il suo Address, ma quel sensore non ce l'ha. Quindi forse puoi anche provare ad usarlo con la Wire, ma sicuramente non ci puoi collegare piu' niente nel BUS

Brunello: ma quello non e' un I2C ...

Azz ... lo sapevo che non dovevo fidarmi ... :~

sapete aiutarmi per usare l'I2C bus per quanto riguarda il sensore di temperatura / umidità sht 10.

e guardare sul datasheet ... :roll_eyes: :roll_eyes: :roll_eyes:

Però Brunello, il datasheet, pagina 5/12, dice chiaramente :

The sensor cannot be addressed by I2C protocol; however, the sensor can be connected to an I2C bus without interference with other devices connected to the bus. The controller must switch between the protocols.

... quindi ... sembrerebbe che sullo stesso bus lo puoi usare ... XD

Guglielmo

effettivamente , come spesso accade, hai ragione tu

The subsequent command consists of three address bits (only ‘000’ is supported)

quindi un indirizzo teorico ce l'ha, anche se e' 000 (Si, anche controllando il grafico della fig.17)

Brunello:
quindi un indirizzo teorico ce l’ha, anche se e’ 000

Azz … è una bella porcheria
… 000 è un indirizzo riservato del bus I2C … è il “general call address” (… tipo broadcast ;)) ed è usato per varie funzioni, incluso il “Software Reset” :~ :~ :~

Per precisione :

The general call address is for addressing every device connected to the I2C-bus at the same time. However, if a device does not need any of the data supplied within the general call structure, it can ignore this address by not issuing an acknowledgment. If a device does require data from a general call address, it acknowledges this address and behave as a slave-receiver. The master does not actually know how many devices acknowledged if one or more devices respond. The second and following bytes are acknowledged by every slave-receiver capable of handling this data. A slave who cannot process one of these bytes must ignore it by not-acknowledging.

Guglielmo

questa non la sapevo

(per il prossimo karma devi aspettare un'ora)

Brunello: (per il prossimo karma devi aspettare un'ora)

:grin: :grin: :grin: :grin: :grin:

Guglielmo

riguardando meglio vedo che parlano di 3 bit "000" ora, dato che in I2C un address e' composto da 7 bit....

vabbe' andiamo a cena che e' meglio

Brunello: riguardando meglio vedo che parlano di 3 bit "000" ora, dato che in I2C un address e' composto da 7 bit....

Si, ma come dicevi ... anche dal grafico si capisce che comunque ... l'address è 0x00 ... :~

Guglielmo

calma ... non vi seguo già più .... cosa devo usare per scrivere il comando: per esempio

Measure Temperature 00011 
Measure Relative Humidity 00101

ilmandorlone: calma ... non vi seguo già più .... cosa devo usare per scrivere il comando:

Come ti dicevo tocca che ti studi come funziona l'I2C e che ti studi la classe Wire ...

Poi dovrai fare un qualche cosa del tipo (... vado a naso ma devi studiare il datasheet, capire le tempistiche e verificare il tutto) :

Wire.beginTransmission(0x00);  // ... a quanto sembra ha indirizzo 0x00
Wire.write(0x05);              // Comando 00101
Wire.endTransmission();        // chiude la trasmissione del comando
delay(100);                    // Dice che ci vogliono 80 msec a 12 bit, ne aspetti 100 per sicurezza
Wire.requestFrom(0x00, 2);     // vuoi leggere DUE bytes in arrivo dal device 0x00
byte1 = Wire.read();           // leggi il primo byte
byte2 = Wire.read();           // leggi il secondo byte

... ripeto, tutto questo a spanne, senza aver provato quel componente e solo seguendo un po' figura 17 del datasheet. Probabilmente lo devi modificare/adattare/verificare ... :roll_eyes:

Guglielmo

no niente =(
i 2 byte sono sempre 255 e 255.
collegamenti controllati resistenza di pull-up messa condensatore già presente nel mio mini modulo quindi non saprei proprio cosa ha che non va … :frowning:
grazie comunque dell’aiuto che mi state dando.

  1. ti sei studiato la Wire ?
  2. ti sei studiato il datasheet ?
  3. hai controllato i codici di errore di ritorno ?
  4. hai cercato di adattare il codice ?

… o ti sei limitato a fare copia/incolla ??? :roll_eyes:

Guglielmo

no niente

Lascia perdere, con la wire non ci riuscirai mai quando invii

Wire.beginTransmission(0x00);  // ... a quanto sembra ha indirizzo 0x00
Wire.write(0x05);              // Comando 00101
Wire.endTransmission();        // chiude la trasmissione del comando

invii 0000000 0 00000101 e poi aspetta una segnale di ACK che non arrivera' mai

a lui serve solo 000 00101 e proseguendo nello sketch e' pure peggio

Brunello: invii 0000000 0 00000101 e poi aspetta una segnale di ACK che non arrivera' mai

... perché ? A pagina 7/12, figura 17 ... mi sembra che gli ACK ci siano sempre, quello che è opzionale è la trasmissione del CRC :roll_eyes:

Dicono chiaramente che è compatibile con il protocollo I2C, anche se ... gestendosi da soli due pin, magari si fa prima :grin:

Guglielmo

gpb01: Dicono chiaramente che è compatibile con il protocollo I2C, anche se ... gestendosi da soli due pin, magari si fa prima :grin:

Guglielmo

ci ho messo del mio anche se il codice che ho fatto vi farà ridere o provato a generare i livelli che sono spiegati nel datasheet impostando un delay di 10us per avere una frequenza di 100KHz. purtroppo non sono in grado di farlo andare :( scusate anche la banalità del mio programma

int clk = 13;
int data = 12;


void setup() {             

  Serial.begin(9600);  
  
  pinMode(clk, OUTPUT);
  pinMode(data, OUTPUT);
}

void loop() {
  //setup
  digitalWrite(clk, LOW);
  digitalWrite(data, HIGH);
  delay(100);
  
  //START
  digitalWrite(clk, HIGH);
  delayMicroseconds(5);
  digitalWrite(data, LOW);
  delayMicroseconds(5);
  digitalWrite(clk, LOW);
  delayMicroseconds(5);
  digitalWrite(clk, HIGH);
  delayMicroseconds(5);
  digitalWrite(data, HIGH);
  delayMicroseconds(5);
  digitalWrite(clk, LOW);
  delayMicroseconds(5);
  digitalWrite(data, LOW);
  delayMicroseconds(10);
  
  //A2
  digitalWrite(clk, HIGH);
  delayMicroseconds(10);
  digitalWrite(clk, LOW);
  delayMicroseconds(10);
  //A1
  digitalWrite(clk, HIGH);
  delayMicroseconds(10);
  digitalWrite(clk, LOW);
  delayMicroseconds(10);
  //A0
  digitalWrite(clk, HIGH);
  delayMicroseconds(10);
  digitalWrite(clk, LOW);
  delayMicroseconds(10);
  
  //C4
  digitalWrite(clk, HIGH);
  delayMicroseconds(10);
  digitalWrite(clk, LOW);
  delayMicroseconds(10);
  //C3
  digitalWrite(clk, HIGH);
  delayMicroseconds(5);
  digitalWrite(clk, LOW);
  delayMicroseconds(5);
  //C2
  digitalWrite(clk, HIGH);
  digitalWrite(data, HIGH);
  delayMicroseconds(10);
  digitalWrite(clk, LOW);
  digitalWrite(data, LOW);
  delayMicroseconds(10);
  //C1
  digitalWrite(clk, HIGH);
  delayMicroseconds(10);
  digitalWrite(clk, LOW);
  delayMicroseconds(10);
  //C0
  digitalWrite(clk, HIGH);
  digitalWrite(data, HIGH);
  delayMicroseconds(10);
  digitalWrite(clk, LOW);
  digitalWrite(data, LOW);
  delayMicroseconds(10);
  //ACK
  digitalWrite(clk, HIGH);
  digitalWrite(data, HIGH);
  delayMicroseconds(10);
  digitalWrite(clk, LOW);
  digitalWrite(data, LOW);
  delayMicroseconds(10);
  
  
  pinMode(data, INPUT);
  delay(100);
  
  
  int x=12; //leggi 12 bit
  while(x>0){
    //bit
    digitalWrite(clk, HIGH);
    delayMicroseconds(5);
    
    //leggo il valore
    Serial.println(digitalRead(data));
    
    digitalWrite(clk, LOW);
    delayMicroseconds(5);
    
    x--;
  }
  
  
  delay(1000);
  
}

Hai già visto QUESTA libreria ? :)

Guglielmo

(più o meno ho risolto) non sono riuscito ancora a farlo andare ma sicuramente ho capito che non è un vero I2C bus me l'ha confermato uno che l'ha dovuto implementare a mano in assemby con micro frescale. come faccio a creare il mio segnale riproducendo quello del datasheet ?? è giusta la mia idea di usare i delay e alzare o abbasare il valore del'uscita come ho fatto nel codice che ho postato?

Scusa .. ma ... hai visto il mio post qua sopra ??? :astonished: :astonished: :astonished:

Guglielmo