Forum: Mikrocontroller und Digitale Elektronik I2C SHT31 i2cmaster.h


von Alain F. (fox82)


Lesenswert?

Hallo Zusammen,

habe mir ein kleines Board mit ATMEGA328P, SHT31 Sensor und einem 
Arduino OLED Display gebaut.

So Display funktioniert! Ich versuche über den I2C Bus die Werte vom 
Sensor auszulesen. Dies klappt irgendwie nicht ganz. Ich bekomme für 
alle data 0-5 die Zahl 17476 zurück.

Wer hat eine Idee?

1
#include "i2cmaster.h"
2
3
#define SHT31    0x44      // I2C Address A of SHT31
4
5
//------------------------------------------------------------------------
6
  //            SHT31
7
  //------------------------------------------------------------------------
8
9
10
  // SHT31 I2C address is 0x44(68)
11
  unsigned int data[6];
12
13
  i2c_init();                                // init I2C interface
14
  i2c_start(SHT31+I2C_WRITE);
15
16
  i2c_write(0x2C);
17
  i2c_write(0x06);
18
  i2c_stop();
19
20
  _delay_ms(300);
21
22
  i2c_init();                                // init I2C interface
23
  i2c_start(SHT31+I2C_WRITE);
24
  i2c_stop();
25
26
27
//  i2c_init();
28
  // Read 6 bytes of data
29
  // temp msb, temp lsb, temp crc, hum msb, hum lsb, hum crc
30
  i2c_rep_start(SHT31+I2C_WRITE);
31
32
33
  data[0] = ((uint8_t)i2c_readAck())<<8;
34
  data[0]|= i2c_readAck();
35
  data[1] = ((uint8_t)i2c_readAck())<<8;
36
  data[1]|= i2c_readAck();
37
  data[2] = ((uint8_t)i2c_readAck())<<8;
38
  data[2]|= i2c_readAck();
39
  data[3] = ((uint8_t)i2c_readAck())<<8;
40
  data[3]|= i2c_readAck();
41
  data[4] = ((uint8_t)i2c_readAck())<<8;
42
  data[4]|= i2c_readAck();
43
  data[5] = ((uint8_t)i2c_readAck())<<8;
44
  data[5]|= i2c_readNak();
45
46
  
47
  i2c_stop();
48
49
50
  char char_data0[20];
51
  itoa( data[0], char_data0, 10 ); 
52
  
53
  char char_data1[20];
54
  itoa( data[1], char_data1, 10 ); 
55
  
56
  char char_data2[20];
57
  itoa( data[2], char_data2, 10 ); 
58
  
59
  char char_data3[20];
60
  itoa( data[3], char_data3, 10 );
61
  
62
  char char_data4[20];
63
  itoa( data[4], char_data4, 10 );
64
   
65
  char char_data5[20];
66
  itoa( data[5], char_data5, 10 );

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

i2c_rep_start(SHT31+I2C_WRITE);


  data[0] = ((uint8_t)i2c_readAck())<<8;
  data[0]|= i2c_readAck();


Wenn man lesen will nimmt man bestimmt nicht I2C_WRITE.

von Alain F. (fox82)


Lesenswert?

OK ist geändert auf i2c_rep_start(SHT31+I2C_READ);

Jetzt gibt es aber kein Display Update mehr...

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Alain F. schrieb:
> i2c_stop();
>
> //  i2c_init();
>   // Read 6 bytes of data
>   // temp msb, temp lsb, temp crc, hum msb, hum lsb, hum crc
>   i2c_rep_start(SHT31+I2C_WRITE);

Wieso eigentlich STOP und darauf folgend ein REPEAT-START?
Ok, unterm Strich sind START und REPEAT-START 100% identisch (auf dem 
Bus kommt das Gleiche an), aber 'mit Sinn und Verstand' ist Das nicht, 
eher C&P.

Von einem Init eines Display sehe ich in dem Code Nichts.
Ebenfalls dürften, irgendwo, auch Spezialitäten des verwendeten µC 
includiert werden - sehe ich auch Nichts von.

Auch beziehst Du Dich auf die Header-Datei XYZ.h, Welche nur includiert 
wird, also mit dem eigentlichen Problem wohl wenig bis Nichts zu tun 
hat.

Meine Frage:
Ist das Programm ggf. doch etwas umfangreicher, als hier gezeigt?
(ein einfaches Ja würde, theoretisch, schon reichen, aber nicht wirklich 
helfen)

MfG

von Wolfgang (Gast)


Lesenswert?

Alain F. schrieb:
> #define SHT31    0x44      // I2C Address A of SHT31

> i2c_start(SHT31+I2C_WRITE);

Bist du sicher, dass du den SHT31 mit dem I2C_Start-Aufuf überhaupt 
erreichst. Laut Datenblatt liegt der auf 0x44 (ADDR an Gnd) bzw. 0x45 
(ADDR an VCC). So wie du den Aufruf gemacht hast versuchst du es auf 
0x22.

Guck dir mal den Unterschied zwischen I2C-Adresse und dem für deinen 
Funktionsaufruf erforderlichen Argument an. So ist das jedenfalls 
sinnfrei.
http://www.nxp.com/documents/user_manual/UM10204.pdf

von Alain F. (fox82)


Lesenswert?

Wolfgang, ADDR ist auf GND = 0x44.
Wieso ist der Aufruf auf 0x22? Ich habe ja i2c_start(SHT31+I2C_WRITE);

Ich versuche eigentlich diesen Code hier zu transerieren:
https://github.com/ControlEverythingCommunity/SHT31/blob/master/Arduino/SHT31.ino

von Wolfgang (Gast)


Lesenswert?

Alain F. schrieb:
> Wieso ist der Aufruf auf 0x22? Ich habe ja i2c_start(SHT31+I2C_WRITE);

Eben.

Ich kenne jetzt die von dir verwendete I2C-Bibliothek nicht, aber bei 
den meisten Bibliotheken erwartet die i2c_start()-Funktion als Argument 
das komplette erste Byte der I2C-Übertragung, also in den oberen 7 Bit 
die I2C-Adresse und im LSB das R/W-Bit.

von Alain F. (fox82)


Angehängte Dateien:

Lesenswert?

Hier die I2C Lib.

von Wolfgang (Gast)


Lesenswert?

Alain F. schrieb:
> Hier die I2C Lib.

Dann guck dir dort mal den Beispiel-Code an. Dort ist die Adresse des 
24C02 als 0xA2 angegeben. Das ist eine 8 Bit Angabe, die wenig mit der 
Adressdefinition nach I2C-Spezifikation (7 Bit) zu tun hat.

Du muss für deinen Funktionsaufruf die im Datenblatt angegebene Adresse 
mit 2 multiplizieren.

Versuch es mal mit
1
i2c_start(0x88 + I2C_WRITE);

von Alain F. (fox82)


Lesenswert?

Hallo Wolfang,

ok danke! Ja jetzt werden die Werte auf dem Display angezeigt. Jedoch 
mit hohen Schwankungen und es macht noch nicht viel Sinn.....muss dass 
mal untersuchen jetzt.

von Alain F. (fox82)


Lesenswert?

Geschafft!
1
  // SHT31 I2C address is 0x44 8bit daher als Adresse 0x88 nehmen!!!
2
  unsigned data[6];
3
4
  i2c_init();                                // init I2C interface
5
  i2c_start(SHT31+I2C_WRITE);
6
7
  i2c_write(0x2C);
8
  i2c_write(0x06);
9
  i2c_stop();
10
11
  _delay_ms(300);
12
13
  //i2c_init();                                // init I2C interface
14
  //i2c_start(SHT31+I2C_WRITE);
15
  //i2c_stop();
16
17
18
  i2c_init();
19
  // Read 6 bytes of data
20
  // temp msb, temp lsb, temp crc, hum msb, hum lsb, hum crc
21
  //i2c_rep_start(SHT31+I2C_READ);
22
  i2c_rep_start(SHT31+I2C_READ);
23
24
  data[0]= i2c_readAck();
25
  data[1]= i2c_readAck();  
26
  data[2]= i2c_readAck();
27
  data[3]= i2c_readAck();
28
  data[4]= i2c_readAck();
29
  data[5]= i2c_readNak();  
30
  i2c_stop();
31
32
33
34
  char char_data0[20];
35
  itoa( data[0], char_data0, 10 ); 
36
  
37
  char char_data1[20];
38
  itoa( data[1], char_data1, 10 ); 
39
  
40
  char char_data2[20];
41
  itoa( data[2], char_data2, 10 ); 
42
  
43
  char char_data3[20];
44
  itoa( data[3], char_data3, 10 );
45
  
46
  char char_data4[20];
47
  itoa( data[4], char_data4, 10 );
48
   
49
  char char_data5[20];
50
  itoa( data[5], char_data5, 10 );
51
52
53
54
55
56
  float temp2 = (data[0] * 256) + data[1];
57
  float cTemp2 = -45.0 + (175.0 * temp2 / 65535.0);
58
  float fTemp2 = (cTemp2 * 1.8) + 32.0;
59
  float humidity2 = (100.0 * ((data[3] * 256.0) + data[4])) / 65535.0;
60
61
  char char_cTemp2[20];
62
  itoa( cTemp2, char_cTemp2, 10 ); 
63
  char char_RH2[20];
64
  itoa( humidity2, char_RH2, 10 ); 
65
66
  strcpy(char_cTemp2, char_cTemp2);
67
  strcat(char_cTemp2, " °C");
68
 
69
  strcpy(char_RH2, char_RH2);
70
  strcat(char_RH2, " %RH");

: Bearbeitet durch User
von Dennis P. (rs_freak93)


Lesenswert?

Guten Morgen,

kann mir jemand von euch nochmal erklären, warum ich als Adresse die 
0x88 verwende und nicht die 0x44??

Wäre euch echt sehr dankbar darüber??

Mit freundlichen Grüßen
Dennis

von waki (Gast)


Lesenswert?

Wolfgang schrieb:
> Dann guck dir dort mal den Beispiel-Code an. Dort ist die Adresse des
> 24C02 als 0xA2 angegeben. Das ist eine 8 Bit Angabe, die wenig mit der
> Adressdefinition nach I2C-Spezifikation (7 Bit) zu tun hat.

Die i2c Adresse sind die ersten 7 bit von den ersten 8 die übertragen 
werden. Das letzte gibt an, ob geschrieben oder gelesen wird.
Wenn die die Adresse in die 8 bit "hineinschreibst", also um 1 bit nach 
links verschiebst entspricht das einer Multiplikation mit 2.

Das kommt jetzt stark auf die verwendete Bibliothek an, ob du die 
Adresse um 1 Bit shiften musst oder nicht.

von Axel R. (Gast)


Lesenswert?

0100 0100 =0x44
1000 1000 =0x88
dann kommt lesen/schreiben hinzu
1000 1001<-
1000 1000

StromTuner

von Dennis P. (rs_freak93)


Lesenswert?

Alles klar danke

von Richard B. (r71)


Lesenswert?

Patrick J. schrieb:
> Ist das Programm ggf. doch etwas umfangreicher, als hier gezeigt?

Ja...

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Richard B. schrieb:
> Ja...

;)

von Richard B. (r71)


Lesenswert?

Patrick J. schrieb:
> ;)

Was soll das jetzt sein?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.