Witam
Czy uruchamiał ktoś czujniki jakości powietrza SGP40 lub BME680,
szukałem w Internecie przykładów ale nie ma nic w Bascomie
Pozdrawiam
Czujniki jakości powietrza SGP40 i BME680
-
elektronik
- Posty: 1
- Rejestracja: 20 cze 2018, 21:07
- niveasoft
- Posty: 1266
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Czujniki jakości powietrza SGP40 i BME680
Tych nie znam. Coś tam działałem z PMS1003
- Karlos128@nos
- Posty: 64
- Rejestracja: 18 sie 2015, 13:32
Re: Czujniki jakości powietrza SGP40 i BME680
Witaj, SGP40 to czujnik jakości powietrza (VOC) na I²C, więc w Bascomie trzeba ogarnąć komunikację I²C, inicjację i odczyt danych.
SGP40 jest trochę specyficzny, bo wymaga wysłania odpowiedniej komendy startu pomiaru (measure_raw), a potem odczytuje się dane (2 bajty + CRC).
Poniżej masz prostą inicjalizację i przykład odczytu surowej wartości z SGP40 w Bascomie. Zakładam, że masz już skonfigurowaną magistralę I²C (np. Soft I2C lub sprzętową).
Adres SGP40 na I²C: 0x59 (czyli 0xB2 do zapisu, 0xB3 do odczytu w formacie 8-bitowym)
wypróbuj ten kawałek i ewentualnie rozbuduj:
nie mam czujnika więc nie mam na czym wyprubować.
jak byś potrzebował to mam kody działające za to do ENS160 lib AHT21 tego moduliku walającego się po alle-drogo.
SGP40 jest trochę specyficzny, bo wymaga wysłania odpowiedniej komendy startu pomiaru (measure_raw), a potem odczytuje się dane (2 bajty + CRC).
Poniżej masz prostą inicjalizację i przykład odczytu surowej wartości z SGP40 w Bascomie. Zakładam, że masz już skonfigurowaną magistralę I²C (np. Soft I2C lub sprzętową).
Adres SGP40 na I²C: 0x59 (czyli 0xB2 do zapisu, 0xB3 do odczytu w formacie 8-bitowym)
wypróbuj ten kawałek i ewentualnie rozbuduj:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $lib "i2c_twi.lbx" ' jeśli używasz sprzętowego I2C
- Const Sgp40_addr = &H59 ' 7-bitowy adres SGP40
- '--- Zmienna na wynik ---
- Dim Raw_voc As Word
- '--- Bufor na dane ---
- Dim Buf(3) As Byte
- '--- Funkcja do wysłania komendy MeasureRaw ---
- Sub Sgp40_measure_raw()
- I2cstart
- I2cwbyte Sgp40_addr * 2 ' Adres + Write (0xB2)
- I2cwbyte &H26 ' Komenda MSB
- I2cwbyte &H0F ' Komenda LSB
- I2cwbyte &H00 ' RH MSB (wilgotność, 0 - domyślnie)
- I2cwbyte &H00 ' RH LSB
- I2cwbyte &H00 ' CRC RH
- I2cwbyte &H00 ' Temp MSB (temperatura, 0 - domyślnie)
- I2cwbyte &H00 ' Temp LSB
- I2cwbyte &H00 ' CRC Temp
- I2cstop
- End Sub
- '--- Funkcja do odczytu wyniku ---
- Sub Sgp40_read_raw()
- Waitms 30 ' Czas pomiaru (min. 20ms)
- I2cstart
- I2cwbyte Sgp40_addr * 2 + 1 ' Adres + Read (0xB3)
- Buf(1) = I2crbyte(1) ' MSB
- Buf(2) = I2crbyte(1) ' LSB
- Buf(3) = I2crbyte(0) ' CRC
- I2cstop
- Raw_voc = Makeint(Buf(1), Buf(2)) ' Składamy wynik
- End Sub
- '--- Przykład użycia ---
- Call Sgp40_measure_raw()
- Call Sgp40_read_raw()
- Print,"Wartosc: "; Raw_voc
jak byś potrzebował to mam kody działające za to do ENS160 lib AHT21 tego moduliku walającego się po alle-drogo.
- Karlos128@nos
- Posty: 64
- Rejestracja: 18 sie 2015, 13:32
Re: Czujniki jakości powietrza SGP40 i BME680
A tu masz do wszelakiej przeróbki i modyfikacji tak z marszu do BME680, z tym że ten kawałek kodu walnął mi mój asystent AI i nie ręczę że będzie dobry ale jest za to punkt wstępu, ja tak robię od dłuższego czasu
Wyniki są surowe – do przeliczenia na °C, %RH, hPa potrzebne są stałe kalibracyjne z czujnika (to trochę więcej kodu, ale mogę dorzucić, jeśli chcesz).
Odczyt gazu (VOC) wymaga dodatkowych rejestrów i przeliczeń – na początek polecam skupić się na temp/wilgotności/ciśnieniu.
kod:
a tu masz :
Wyniki są surowe – do przeliczenia na °C, %RH, hPa potrzebne są stałe kalibracyjne z czujnika (to trochę więcej kodu, ale mogę dorzucić, jeśli chcesz).
Odczyt gazu (VOC) wymaga dodatkowych rejestrów i przeliczeń – na początek polecam skupić się na temp/wilgotności/ciśnieniu.
kod:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '--- Adres czujnika BME680 (zmień na 0x77 jeśli masz podciągnięty SDO do VCC) ---
- Const BME680_ADDR = &H76
- '--- Bufory ---
- Dim Buf(8) As Byte
- Dim Temp_raw As Long
- Dim Press_raw As Long
- Dim Hum_raw As Word
- '--- Inicjalizacja magistrali I2C ---
- Config Twi = 400000
- '--- Funkcja do odczytu rejestru ---
- Sub BME680_ReadReg(byval reg As Byte , byref val As Byte)
- I2cstart
- I2cwbyte BME680_ADDR * 2
- I2cwbyte reg
- I2cstart
- I2cwbyte BME680_ADDR * 2 + 1
- val = I2crbyte(0)
- I2cstop
- End Sub
- '--- Funkcja do zapisu rejestru ---
- Sub BME680_WriteReg(byval reg As Byte , byval val As Byte)
- I2cstart
- I2cwbyte BME680_ADDR * 2
- I2cwbyte reg
- I2cwbyte val
- I2cstop
- End Sub
- '--- Inicjalizacja BME680 ---
- Sub BME680_Init()
- ' Soft reset
- Call BME680_WriteReg(&HE0, &HB6)
- Waitms 10
- ' Ustawienie oversamplingu i trybu pracy
- Call BME680_WriteReg(&H74, &H10) ' Tryb sleep, osrs_t=1x
- Call BME680_WriteReg(&H72, &H01) ' osrs_h=1x
- Call BME680_WriteReg(&H75, &H24) ' osrs_p=1x, filter=2
- ' Tryb forced (pojedynczy pomiar)
- Call BME680_WriteReg(&H74, &H11)
- End Sub
- '--- Odczyt danych ---
- Sub BME680_ReadData()
- ' Odczytaj 8 bajtów od rejestru 0x1D (temp, press, hum)
- I2cstart
- I2cwbyte BME680_ADDR * 2
- I2cwbyte &H1D
- I2cstart
- I2cwbyte BME680_ADDR * 2 + 1
- For i = 1 To 8
- If i < 8 Then
- Buf(i) = I2crbyte(1)
- Else
- Buf(i) = I2crbyte(0)
- End If
- Next
- I2cstop
- ' Składamy surowe dane (przykładowo, uproszczone)
- Press_raw = (Buf(1) * 65536) + (Buf(2) * 256) + (Buf(3) And &HF0)
- Temp_raw = (Buf(4) * 65536) + (Buf(5) * 256) + (Buf(6) And &HF0)
- Hum_raw = (Buf(7) * 256) + Buf(8)
- End Sub
- '--- Przykład użycia ---
- Call BME680_Init()
- Waitms 100
- Call BME680_ReadData()
- Lcd "Traw:" ; Temp_raw ; "Praw:" ; Press_raw ; "Hraw:" ; Hum_raw
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Uproszczony przelicznik (na start, do testów)
- ' Założenie: Temp_raw, Press_raw, Hum_raw już odczytane
- '--- Temperatura ---
- ' Temp_raw to 20-bitowa liczba, trzeba przesunąć o 4 bity w prawo
- Dim Temp_C As Single
- Temp_C = (Temp_raw / 16.0 - 51200) / 100
- '--- Ciśnienie ---
- ' Press_raw to 20-bitowa liczba, przesuwamy o 4 bity w prawo
- Dim Press_hPa As Single
- Press_hPa = (Press_raw / 16.0) / 100
- '--- Wilgotność ---
- Dim Hum_perc As Single
- Hum_perc = Hum_raw / 1024.0 * 100
- Lcd "T:" ; Fusing(Temp_C , "#.##") ; "C"
- Lcd " P:" ; Fusing(Press_hPa , "#.##") ; "hPa"
- Lcd " H:" ; Fusing(Hum_perc , "#.##") ; "%"
