from machine import ADC, Pin
import time
import math
# --- Configurações do Sensor ---
ADC_PIN = 34 # Pino GPIO 34 para leitura analógica
SERIES_RESISTOR = 10000.0 # Resistor fixo em série (em Ohms) - Use o valor que você está usando
NOMINAL_RESISTANCE = 10000.0 # Resistência nominal do NTC a 25°C (em Ohms)
NOMINAL_TEMPERATURE = 25.0 # Temperatura nominal para NOMINAL_RESISTANCE (em Celsius)
BETA_VALUE = 3950.0 # Coeficiente Beta (B) do seu NTC (verifique o datasheet do seu sensor)
TEMPERATURE_OFFSET = 273.15 # Converter Celsius para Kelvin
# --- Configuração do ADC ---
# O pino 34 do ESP32 é o ADC1_CH6
adc = ADC(Pin(ADC_PIN))
# O ESP32 tem uma resolução de 12 bits (0-4095) por padrão para alguns pinos
# Vamos usar 12 bits para consistência, mas o GPIO 34 no ESP32-WROOM-32 geralmente tem 12 bits.
# O ADC do ESP32-S2/S3 pode ter 13/14 bits.
adc.width(ADC.WIDTH_12BIT)
adc.atten(ADC.ATTN_11DB) # Atenuação de 11dB para range de 0-3.3V (valor típico)
# --- Funções ---
def read_temperature():
"""Lê o valor do ADC e calcula a temperatura em Celsius usando a Equação Beta."""
# 1. Lê o valor do ADC (0 - 4095)
adc_value = adc.read()
# 2. Calcula a tensão (Voltage) no pino ADC
# V_in = V_ref * (ADC_value / 4095)
# V_ref (tensão de referência) é o 3.3V do ESP32
voltage = 3.3 * (adc_value / 4095.0)
# 3. Calcula a Resistência do NTC (R_ntc)
# R_ntc = R_s * (V_ref / V_in - 1)
# Onde R_s é o SERIES_RESISTOR
if voltage == 0: # Evita divisão por zero se a leitura for 0
resistance = 0
else:
# Fórmula do divisor de tensão: V_out = V_ref * R2 / (R1 + R2)
# Onde V_out é a voltage e R2 é o R_ntc.
# R_ntc = R_s / (V_ref/V_in - 1)
resistance = SERIES_RESISTOR / ((3.3 / voltage) - 1)
# 4. Converte a Resistência para Temperatura em Kelvin usando a Equação Beta
# T_k = 1 / [ (1/T0) + (1/Beta) * ln(R/R0) ]
# Constante para a equação Beta
t_0 = NOMINAL_TEMPERATURE + TEMPERATURE_OFFSET # T0 em Kelvin
# Calcula o termo logarítmico: ln(R/R0)
try:
ln_ratio = math.log(resistance / NOMINAL_RESISTANCE)
except ValueError:
# Lidar com erros de domínio (p.ex., log de número negativo ou zero)
print("Erro: Resistência inválida para o log.")
return None, None
# Termo da Equação Beta
inv_t_k = (1.0 / t_0) + (1.0 / BETA_VALUE) * ln_ratio
# T_k (Temperatura em Kelvin)
t_k = 1.0 / inv_t_k
# 5. Converte Kelvin para Celsius
t_celsius = t_k - TEMPERATURE_OFFSET
return adc_value, t_celsius
# --- Loop Principal ---
print("Iniciando leitura do NTC 10k no pino GPIO 34...")
print("---------------------------------------------")
try:
while True:
adc_val, temp_c = read_temperature()
if temp_c is not None:
print(f"Valor ADC: {adc_val} | Resistência: {temp_c:.0f} Ohms | Temperatura: {temp_c:.2f} °C")
else:
print("Não foi possível calcular a temperatura.")
time.sleep(2) # Pausa de 2 segundos entre as leituras
except KeyboardInterrupt:
print("\nPrograma interrompido pelo usuário.")