Въведение
Аналоговите температурни датчици продължават да бъдат широко използвани в електрониката благодарение на своята простота, надеждност и ниска цена. Един от най-популярните представители е LM35DZ, който предоставя линейно аналогово напрежение, пропорционално на измерената температура. За разлика от цифровите температурни сензори, LM35DZ не изисква специални комуникационни протоколи като I²C или OneWire – достатъчно е да бъде свързан към аналогов вход на микроконтролера. По този начин ще можем да прочетем lm35dz с Raspberry Pi Pico.
В тази статия ще разгледаме как да измерим температура с LM35 с Raspberry Pi Pico и MicroPython, използвайки аналогово-цифровия преобразувател (ADC). Първо ще покажем как се извършва директно измерване без допълнителна обработка, като ще пресметнем температурата както от 10-битова, така и от 12-битова ADC стойност. След това ще подобрим качеството на измерванията чрез използване на разработената в предходната статия библиотека Trimmed Mean Filter, която значително намалява влиянието на шума и случайните отклонения.
Свързване на LM35DZ към Raspberry Pi Pico

LM35DZ има три извода:
- Vs – захранване (+5 V или +3.3 V)
- Vout – аналогов изход
- GND – маса
Свързването към Raspberry Pi Pico е изключително лесно. Характеристиките и диаграмата на пиновете миже да видите от статията ни: Raspberry Pi Pico – Малък, но Мощен Микроконтролер.
| LM35DZ | Raspberry Pi Pico |
|---|---|
| Vs | 3.3V |
| GND | GND |
| Vout | GPIO26 (ADC0) |
LM35DZ генерира напрежение 10 mV за всеки градус Целзий.
Например:
| Температура | Изходно напрежение |
|---|---|
| 0°C | 0 V |
| 25°C | 0.25 V |
| 50°C | 0.50 V |
| 100°C | 1.00 V |
Това прави преобразуването към температура изключително лесно.
Изчитане на LM35DZ и преобразуване в температура
Следният пример използва директно ADC на Raspberry Pi Pico без никакво филтриране.
from machine import ADC
import time
adc = ADC(26)
ADC_REF = 3.3
while True:
raw16 = adc.read_u16()
raw12 = raw16 >> 4
raw10 = raw16 >> 6
voltage12 = raw12 * ADC_REF / 4095
voltage10 = raw10 * ADC_REF / 1023
temperature12 = voltage12 * 100
temperature10 = voltage10 * 100
print("---------------------------")
print("ADC 12-bit:", raw12)
print("ADC 10-bit:", raw10)
print("Temperature 12-bit:", round(temperature12,2),"°C")
print("Temperature 10-bit:", round(temperature10,2),"°C")
time.sleep(1)Обяснение на кода за измерване на температура с LM35DZ
Инициализация на ADC
adc = ADC(26) # GPIO26 (ADC0)Създаваме ADC обект, който използва GPIO26 (ADC0).
Прочитане на суровата стойност
raw16 = adc.read_u16() # връща 16-битова стойност в диапазона 0-65535:MicroPython винаги връща 16-битова стойност в диапазона 0-65535:
В действителност ADC на Raspberry Pi Pico има 12-битова разделителна способност, а останалите битове служат за мащабиране.
Получаване на 12-битов резултат
raw12 = raw16 >> 4 # преобразуване в 12-битов резултат 0-4095Получаваме диапазон: 0-4095 който представлява реалната разделителна способност на ADC.
Получаване на 10-битов резултат
raw10 = raw16 >> 6 # преобразуване в 10-битов резултат 0-1024Получаваме диапазон: 0-1023. Това е полезно, когато искаме съвместимост с Arduino Uno или други 10-битови микроконтролери.
Преобразуване в напрежение
За 12-битовото измерване:
voltage12 = raw12 * ADC_REF / 4095За 10-битовото:
voltage10 = raw10 * ADC_REF / 1023Използваме захранващо напрежение 3.3 V.
Пресмятане на температурата
LM35DZ генерира 10 mV = 1°C или 0.01 V = 1°C. Следователно:
temperature12 = voltage12 * 100и
temperature10 = voltage10 * 100Получаваме температурата директно в градуси Целзий “*C“.
Raspberry Pi Pico измерване на температура посредством LM35DZ с Trimmed Mean Filter
Следващият пример използва библиотеката medianFilter.py. Може да прочетете как работи този филтър и да свалите написаната от нас библиотека от статията ни: MicroPython и Raspberry Pi Pico Медианен и Trimmed Mean Filter библиотека и примерен код.
import time
from medianFilter import AnalogFilter
sensor = AnalogFilter(26)
ADC_REF = 3.3
while True:
adc12 = sensor.read_trim_median()
voltage = adc12 * ADC_REF / 4095
temperature = voltage * 100
print("------------------------")
print("ADC:", adc12)
print("Temperature:", round(temperature,2), "°C")
time.sleep(1)Обяснение на кода
Импортиране на библиотеката
from medianFilter import AnalogFilterИмпортираме разработената библиотека, която автоматично извършва филтрирането на аналоговите измервания.
Създаване на обект
sensor = AnalogFilter(26)Използваме GPIO26 като аналогов вход.
Използване на Trimmed Mean Filter
adc12 = sensor.read_trim_median()Тук библиотеката автоматично:
- прави 11 последователни измервания;
- сортира всички стойности;
- премахва трите най-ниски;
- премахва трите най-високи;
- осреднява петте централни стойности.
Получената стойност е значително по-стабилна в сравнение с еднократно измерване!
Преобразуване в напрежение
voltage = adc12 * ADC_REF / 4095Получаваме напрежението върху аналоговия вход.
Пресмятане на температурата
temperature = voltage * 100Тъй като LM35DZ има чувствителност 10 mV/°C, умножаваме напрежението по 100 и получаваме температурата.
Извеждане на резултатите
print("Temperature:", round(temperature,2), "°C")Температурата се извежда с точност до две цифри след десетичната запетая.
При реални измервания ще забележите, че показанията са значително по-плавни и стабилни спрямо директното прочитане на ADC.
Обобщение
В тази статия разгледахме два различни начина за измерване на температура с LM35DZ и Raspberry Pi Pico. Първият използва директно аналогово измерване, което е лесно за реализация и позволява да се работи както с 10-битови, така и с 12-битови стойности. Макар този подход да е напълно достатъчен за много приложения, резултатите могат да бъдат повлияни от електрически шум и случайни отклонения.
Във втората част интегрирахме библиотеката medianFilter.py, която използва алгоритъма Trimmed Mean Filter. Благодарение на филтрирането измерените стойности стават значително по-стабилни, без да е необходимо използването на допълнителни електронни компоненти.
Заключение
LM35DZ е един от най-лесните за използване аналогови температурни датчици и е отличен избор за проекти с Raspberry Pi Pico. Комбинацията между вградения ADC на микроконтролера и езика MicroPython позволява бързо и лесно реализиране на система за измерване на температура.
Добавянето на Trimmed Mean Filter повишава надеждността на измерванията, като намалява влиянието на случайния шум и краткотрайните пикове в аналоговия сигнал. Това е особено полезно при приложения за автоматизация, мониторинг на околната среда, метеорологични станции и IoT устройства, където стабилността на измерванията е от съществено значение.
Допълнителни ресурси: Truncated mean.
