Obsługa czujnika SH21

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Obsługa czujnika SH21

Post autor: Michał6201 » 03 maja 2020, 12:20

Cześć

Chciałem sprawdzić jak działa czujnik SHT21 i jest problem, bo pokazuje cały czas temperaturę 0,0oC i wilgotność 0,0%
Nie wiem czy jest błąd jakiś w programie, a czy czujnik uszkodzony.
Bardzo proszę o weryfikację tego kodu:
  1. ' OBSŁUGA CZUJNIKA SHT21
  2.  
  3.  
  4.   $regfile = "m8adef.dat"
  5. $crystal = 8000000
  6.  '$baud = 19200
  7.  
  8. ' Konfiguracja LCD 2X16
  9.     Config Lcdpin = Pin , E = PortD.0 , Rs = PortD.1 , Db7 = PortD.2 , Db6 = PortD.3 , Db5 = PortD.4 , Db4 = PortD.5
  10.     Config Lcd = 16x2
  11.       Cursor Off
  12.     Cls
  13.  
  14.  
  15.  
  16. Config Scl = Portc.5
  17. Config Sda = Portc.4
  18. Config I2cdelay = 10   '100KHz clock
  19. I2cinit
  20.  
  21. Dim Data1 As Byte
  22. Dim Data2 As Byte
  23. Dim Datat As Word
  24. Dim Datah As Word
  25. Dim Crc As Word
  26. Dim T As Single
  27. Dim H As Single
  28.  
  29. Do
  30.  
  31. '***********************************Temperatura*********************************
  32. I2cstart
  33. I2cwbyte &H80                                               'Adres SHT21
  34. I2cwbyte &HE3                                               'Wybór pomiaru temperatury w trybie normalnym
  35. Waitms 100                                                  'Odczekaj 100ms
  36. I2cstart
  37. I2cwbyte &H81                                               'Odczytaj wynik pomiaru
  38. I2crbyte Data1 , Ack                                        'Odbierz dane
  39. I2crbyte Data2 , Ack                                        'Odbierz dane
  40. I2crbyte Crc , Nack                                         'Odbierz sume kontrolną
  41. I2cstop                                                     'Zatrzymaj magistralę
  42.  
  43. 'Przeliczanie wartości T
  44. Datat = Data1
  45. Shift Datat , Left , 8
  46. Datat = Datat + Data2
  47. T = Datat * 175.72
  48. T = T / 65536
  49. T = T - 46.85
  50.  
  51. '************************************Wilgotoność********************************
  52. I2cstart
  53. I2cwbyte &H80                                               'Adres SHT21
  54. I2cwbyte &HE5                                               'Wybór pomiaru wilgotności w trybie normalnym
  55. Waitms 100                                                  'Odczekaj 100ms
  56. I2cstart
  57. I2cwbyte &H81                                               'Odczytaj wynik pomiaru
  58. I2crbyte Data1 , Ack                                        'Odbierz dane
  59. I2crbyte Data2 , Ack                                        'Odbierz dane
  60. I2crbyte Crc , Nack                                         'Odbierz sume kontrolną
  61. I2cstop                                                     'Zatrzymaj magistralę
  62.  
  63. 'Przeliczanie wartości H
  64. Datah = Data1
  65. Shift Datah , Left , 8
  66. Datah = Datah + Data2
  67. H = Datah * 125
  68. H = H / 65536
  69. H = H - 6
  70.  
  71. T = Fusing(t , "#.##")
  72. H = Fusing(h , "#.#")
  73.  
  74. Locate 1 , 1
  75. Lcd "Temp:" ; t ; " oC "
  76. Locate 2 , 1
  77. Lcd "Humi:" ; h ; "%"
  78.  
  79.  
  80. Loop
  81. END                                                    'Koniec pętli Do...Loop
Awatar użytkownika
Oldman
Posty: 61
Rejestracja: 19 cze 2019, 11:15

Re: Obsługa czujnika SH21

Post autor: Oldman » 03 maja 2020, 14:22

W oryginalnym kodzie (_Duch) w pętli na końcu jest jeszcze Wait 1. Spróbuj dopisać.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Obsługa czujnika SH21

Post autor: niveasoft » 03 maja 2020, 14:55

Mi to zwyczajnie szkoda czasu na gdybanie i od razu podłączyłbym jakiś terminal. Bascom ma wbudowaną obsługę błędu ostatniej instrukcji. Można sprawdzić czy układ w ogóle odpowiada. Można zobaczyć jakie dane odbiera i wszystko trwa kilka minut....
Można to samo wyrzucić na LCD...a jak układ nie odpowiada to można przeskanować wszystkie adresy...znowu kilka minut i gotowe.
  1. I2cstart
  2. I2cwbyte &H80                                               'Adres SHT21
  3. If Err = 0 Then
  4.    I2cwbyte &HE3                                               'Wybór pomiaru temperatury w trybie normalnym
  5.    Waitms 100                                                  'Odczekaj 100ms
  6.    I2cstart
  7.    I2cwbyte &H81                                               'Odczytaj wynik pomiaru
  8.    I2crbyte Data1 , Ack                                        'Odbierz dane
  9.    I2crbyte Data2 , Ack                                        'Odbierz dane
  10.    I2crbyte Crc , Nack                                         'Odbierz sume kontrolną
  11.  
  12.    Print Data1
  13.    Print Data2
  14.    Print Crc
  15. Else
  16.  Print "Brak ukladu"
  17. End If
  18.    I2cstop                                                  'Zatrzymaj magistralę
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Obsługa czujnika SH21

Post autor: Michał6201 » 04 maja 2020, 23:58

Dziękuję za kod :)

Trochę zmieniłem, bo chciałem to wyświetlić na lcd
  1. ' TEST CZUJNIKA SHT21
  2.  
  3.  
  4.   $regfile = "m8adef.dat"
  5. $crystal = 8000000
  6.  '$baud = 19200
  7.  
  8.  
  9.   ' Konfiguracja LCD 2X16
  10.     Config Lcdpin = Pin , E = PortD.0 , Rs = PortD.1 , Db7 = PortD.2 , Db6 = PortD.3 , Db5 = PortD.4 , Db4 = PortD.5
  11.     Config Lcd = 16x2
  12.       Cursor Off
  13.     Cls
  14.  
  15. $lib "i2c_twi.lbx"
  16.            Config Scl = Portc.5
  17. Config Sda = Portc.4
  18.       I2cinit
  19.     Config Twi = 100000
  20.  
  21. Dim Data1 As Byte
  22. Dim Data2 As Byte
  23. Dim Datat As Word
  24. Dim Datah As Word
  25. Dim Crc As Word
  26. Dim T As Single
  27. Dim H As Single
  28. Dim Wart As String * 4
  29.  Dim Warh As String * 4
  30.  
  31.  Do
  32.  
  33.  
  34.  
  35.  
  36.      I2cstart
  37.     I2cwbyte &H80                                               'Adres SHT21
  38.     If Err = 0 Then
  39.        I2cwbyte &HE3                                               'Wybór pomiaru temperatury w trybie normalnym
  40.        Waitms 100                                                  'Odczekaj 100ms
  41.        I2cstart
  42.        I2cwbyte &H81                                               'Odczytaj wynik pomiaru
  43.        I2crbyte Data1 , Ack                                        'Odbierz dane
  44.        I2crbyte Data2 , Ack                                        'Odbierz dane
  45.        I2crbyte Crc , Nack                                         'Odbierz sume kontrolną
  46.  
  47.       ' Print Data1
  48.       ' Print Data2
  49.       ' Print Crc
  50.  
  51.     Else
  52.      'Print "Brak ukladu"
  53.  
  54.       Locate 1 , 2
  55.       Lcd "Brak ukladu"
  56.  
  57.  
  58.     End If
  59.        I2cstop                                                  'Zatrzymaj magistralę
  60.  
  61.  Loop
  62.  end
Niestety po wrzuceniu kodu do procka, na lcd pojawia się napis - "Brak układu"

Czyli uszkodzony czujnik?

Napięcie dochodzi do niego. Zasilam go +3,3V, i2c jest przekonwertowane tranzystorami BSS138 do +5V,b o takim napięciem zasilam procka.
Na nóżce SCL czujnika mam 0,55V, a na SDA 3,3V.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Obsługa czujnika SH21

Post autor: niveasoft » 05 maja 2020, 9:38

Rozumiem, że masz rezystory podciagające?
Osobiście przeleciałbym wszystkie adresy bo czasami niektóre układy mają inne adresy w zalezności np. od konfiguracji pinów. Ten układ po prostu może być pod innym adresem.
Poniżej taki skaner. On się zatrzyma jak coś znajdzie i wtedy chyba wciskałem przycisk by znaleźc kolejny układ więc tam trochę musisz pozmieniać.
  1. Sub Scan_i2c()
  2.  
  3.    Dim B As Byte , Lock As Byte
  4.  
  5.    Portc.0 = 1
  6.  
  7.    Locate 1 , 1 : Lcd "Scanning.."
  8.    Print "Scanning"
  9.    For B = 0 To 254 Step 2                                  'for all odd addresses
  10.      I2cstart                                               'send start
  11.      I2cwbyte B                                             'send address
  12.      If Err = 0 Then                                        'we got an ack
  13.  
  14.         Locate 2 , 1 : Lcd "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
  15.         Print "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
  16.  
  17.         'Locate 3 , 1 : Lcd " Push switch..."
  18.         Lock = 1
  19.         Do
  20.  
  21.          If Pinc.0 = 0 Then
  22.           Wait 1
  23.           Lock = 0
  24.          End If
  25.  
  26.         Loop Until Lock = 0
  27.  
  28.      End If
  29.      I2cstop                                                'free bus
  30.    Next
  31.  
  32.    Portc.0 = 0
  33.  
  34.  
  35.    '&H1A DEC26   GYRO
  36.    '&HD0 DEC208  RTC
  37.    '&HEC DEC236  BME
  38.  Cls
  39. End Sub
Oryginalny skaner adresów I2c jest chyba w Helpie pod tytułem zblizonym do "Using the I2C protocol"
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Obsługa czujnika SH21

Post autor: Michał6201 » 06 maja 2020, 0:07

Tak, rezystory są podciągnięte na liniach i2c.

Wrzuciłem taki kod do procka:
  1. ' SKANER I2C
  2.  
  3.  
  4.   $regfile = "m8adef.dat"
  5. $crystal = 8000000
  6.  '$baud = 19200
  7.  
  8. ' Konfiguracja LCD 2X16
  9.     Config Lcdpin = Pin , E = PortD.0 , Rs = PortD.1 , Db7 = PortD.2 , Db6 = PortD.3 , Db5 = PortD.4 , Db4 = PortD.5
  10.     Config Lcd = 16x2
  11.       Cursor Off
  12.     Cls
  13.   $lib "i2c_twi.lbx"
  14.            Config Scl = Portc.5
  15. Config Sda = Portc.4
  16.       I2cinit
  17.     Config Twi = 100000
  18.  
  19.  
  20.         ' Sub Scan_i2c()
  21.  
  22.        Dim B As Byte , Lock As Byte
  23.  
  24.         Config Portc.0 = Input : Portc.0 = 1 : S1 Alias PinC.0
  25.     do
  26.  
  27.  
  28.  
  29.        Locate 1 , 1 : Lcd "Scanning.."
  30.        'Print "Scanning"
  31.        For B = 0 To 254 Step 2                                  'for all odd addresses
  32.          I2cstart                                               'send start
  33.          I2cwbyte B                                             'send address
  34.          If Err = 0 Then                                        'we got an ack
  35.  
  36.             Locate 2 , 1 : Lcd "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
  37.             'Print "Slv.at: &H" ; Hex(b) ; " (" ; B ; ")"
  38.  
  39.             'Locate 3 , 1 : Lcd " Push switch..."
  40.             Lock = 1
  41.             Do
  42.  
  43.              If S1 = 0 Then
  44.               Wait 1
  45.               Lock = 0
  46.              End If
  47.  
  48.             Loop Until Lock = 0
  49.  
  50.          End If
  51.          I2cstop                                                'free bus
  52.        Next
  53.  
  54.        S1 = 0
  55.  
  56.  
  57.        '&H1A DEC26   GYRO
  58.        '&HD0 DEC208  RTC
  59.        '&HEC DEC236  BME
  60.      Cls
  61.  
  62.      Loop
  63.      end
  64.  
  65.   '  End Sub
Na wyświetlaczy jedynie widać napis Scaning..
Nic więcej się nie wyświetla, nawet po dłuższej chwili czekania.
Naciskanie przycisku S1 też nic nie zmienia.
ODPOWIEDZ