LM35DZ и Raspberry Pi Pico Измерване на температура чрез MicroPython и Trimmed Mean Filter

LM35DZ и Raspberry Pi Pico Измерване на температура чрез MicroPython и Trimmed Mean Filter

Въведение

Аналоговите температурни датчици продължават да бъдат широко използвани в електрониката благодарение на своята простота, надеждност и ниска цена. Един от най-популярните представители е 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 – Малък, но Мощен Микроконтролер.

LM35DZRaspberry Pi Pico
Vs3.3V
GNDGND
VoutGPIO26 (ADC0)

LM35DZ генерира напрежение 10 mV за всеки градус Целзий.

Например:

ТемператураИзходно напрежение
0°C0 V
25°C0.25 V
50°C0.50 V
100°C1.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.

Translate »