Forum: Mikrocontroller und Digitale Elektronik I2C SHT31 i2cmaster.h


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Alain F. (fox82)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht lesenswert
Hier die I2C Lib.

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

StromTuner

von Dennis P. (rs_freak93)


Bewertung
0 lesenswert
nicht lesenswert
Alles klar danke

von Richard B. (r71)


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

Ja...

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


Bewertung
0 lesenswert
nicht lesenswert
Richard B. schrieb:
> Ja...

;)

von Richard B. (r71)


Bewertung
0 lesenswert
nicht lesenswert
Patrick J. schrieb:
> ;)

Was soll das jetzt sein?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.