Tym razem zajmiemy się Raspberry Pi Pico, a dokładnie odczytem temperatury z czujnika zintegrowanego w RP2040. Pico posiada wewnętrzny czujnik temperatury podłączony do jednego z kilku specjalnych pinów zwanych ADC (konwerterami analogowo-cyfrowymi). W dalszej części wpisu odczytaną wartość temperatury wyświetlimy na wyświetlaczu I2C OLED.
Potrzebne komponenty
- RaspberryPi Pico lub odpowiednik z MCU RP2040
- Wyświetlacz OLED I2C
Czujnik temperatury RP2040
Wewnętrzny czujnik temperatury, jak już wcześniej wspomniałem jest podłączony do jednego z przetworników ADCe. W płytce Pico RP2040 piny ADC obsługują 12 bitów , co oznacza, że wartość może wynosić od 0 do 4095. Jednak kod MicroPython może skalować wartości ADC do zakresu 16-bitowego . Tak więc efektywnie uzyskujemy zakres od 0 do 65535 . Mikrokontroler pracuje z napięciem 3,3 V , co oznacza, że pin przetwornika ADC zwróci wartość 65535 po przyłożeniu do niego 3,3 V lub 0, gdy nie ma napięcia. Wszystkie wartości pośrednie możemy uzyskać, gdy napięcie przyłożone do pinu wynosi od 0 do 3,3 V .
Piny ADC na płycie Pico używają własnego schematu numeracji, zamiast iść według numeru pinu GPIO. Na powyższym schemacie pinów widać piny oznaczone ADC0, ADC1, ADC2 i ADC_VREF (technicznie ADC3), które są czterema dostępnymi z zewnątrz pinami ADC. Czujnik temperatury nie ma fizycznego pinu na płytce, ale jest dostępny jako ADC4, ku naszej uciesze.
Odczytywanie wartości temperatury za pomocą MicroPython
Jako edytora MicroPython dla RPI Pico osobiście od jakiegoś czasu wykorzystuje edytor thonny do pobrania z https://thonny.org/. Po podłączeniu skopiuj poniższy kod i naciśnij przycisk uruchom.
Kod programu
import machine
import utime
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)
while True:
reading = sensor_temp.read_u16() * conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
print(temperature)
utime.sleep(2)
Małe objaśnienie kodu wykorzystanego powyżej tu jest wskazane.
import machine
import utime
sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)
Najpierw importujemy machine oarz utime. Moduł machine udostępnia nam klasę ADC() do pracy z pinami ADC.
reading = sensor_temp.read_u16() * conversion_factor
Jeśli odczytamy wartość temperatury, otrzymasz liczbę całkowitą z zakresie od 0 do 65535. Więc musimy przekonwertować tę wartość na skalę stopni Celsjusza lub Fahrenheita. Czujnik temperatury w RPi Pico działa poprzez dostarczenie na pin ADC4 napięcia proporcjonalnego do temperatury. Z danych wynika, że temperatura 27 stopni Celsjusza dostarcza napięcie 0,706V. Z każdym dodatkowym stopniem napięcie spada o 1,721 mV lub jak kto woli 0,001721V.
Pierwszym krokiem w konwersji 16-bitowej temperatury jest przekształcenie jej z powrotem na wolty, co odbywa się w oparciu o maksymalne napięcie 3,3 V używane przez płytkę Pico. Dzięki tej konwersji wartość temperatury ma wartość od 0 do 3,3. Znowu musimy wykonać drugą konwersję, która wyświetli temperaturę w tym przypadku w stopniach Celsjusza.
temperature = 27 - (reading - 0.706)/0.001721
Dla chętnych poniżej konwersja, która wyświetli temperaturę w tym przypadku w stopniach Fahrenheita.
fahrenheit_degrees = celsius_degrees * 9 / 5 + 32