print("Hello, ESP32!")
from machine import Pin, PWM, ADC
import time
import math
class NTC10K:
def __init__(self, pin_num, r_ref=10000, beta=3950, ntc_r=10000, t_nominal=25):
self.adc = ADC(Pin(pin_num))
self.adc.atten(ADC.ATTN_11DB) # Full range 0-3.3V
self.r_ref = r_ref # Reference resistor value (10K)
self.beta = beta # Beta coefficient
self.ntc_r = ntc_r # NTC nominal resistance at 25°C
self.t_nominal = t_nominal # Nominal temperature
def read_temp(self):
# Read ADC value (0-4095 for ESP32)
adc_value = self.adc.read()
if adc_value == 0:
return float('inf') # Avoid division by zero
# Calculate voltage (ESP32 ADC range is 0-3.3V)
v_out = 3.3 * adc_value / 4095
# Calculate NTC resistance
ntc_resistance = self.r_ref * v_out / (3.3 - v_out)
# Calculate temperature using Steinhart-Hart equation
steinhart = math.log(ntc_resistance / self.ntc_r) / self.beta
steinhart += 1.0 / (self.t_nominal + 273.15)
temp_k = 1.0 / steinhart
temp_c = temp_k - 273.15
return temp_c
# Инициализация устройств
sensor1 = NTC10K(33) # Пин для первого датчика NTC
sensor2 = NTC10K(32) # Пин для второго датчика NTC
motor = Pin(25, Pin.OUT)
buzzer = PWM(Pin(26), freq=2000, duty=0)
led = Pin(27, Pin.OUT)
# Параметры управления
motor_state = False
prev_temp = sensor1.read_temp()
last_time = time.time()
# Пороговые значения
NORMAL_ON = 20 # Включение при нормальном режиме
NORMAL_OFF = 10 # Выключение при нормальном режиме
FAST_ON = 15 # Включение при быстром нагреве
FAST_OFF = 10 # Выключение при быстром нагреве
ALARM_TEMP = 90 # Температура тревоги
while True:
current_time = time.time()
temp1 = sensor1.read_temp()
temp2 = sensor2.read_temp()
temp_diff = temp1 - temp2
# Расчет скорости нагрева
heating_rate = (temp1 - prev_temp) / (current_time - last_time) if current_time != last_time else 0
# Определение режима работы
if heating_rate >= 1: # Быстрый нагрев
on_threshold = FAST_ON
off_threshold = FAST_OFF
mode = "БЫСТРЫЙ"
else: # Нормальный нагрев
on_threshold = NORMAL_ON
off_threshold = NORMAL_OFF
mode = "НОРМАЛЬНЫЙ"
# Управление мотором
if not motor_state and temp_diff > on_threshold:
motor.value(1)
motor_state = True
elif motor_state and temp_diff <= off_threshold:
motor.value(0)
motor_state = False
# Сигнализация
alarm = temp1 >= ALARM_TEMP
led.value(alarm)
buzzer.duty(512 if alarm else 0)
# Вывод информации
print("\n" + "="*50)
print(f"Режим: {mode} | Нагрев: {heating_rate:.2f}°C/сек")
print(f"Температуры: {temp1:.1f}°C / {temp2:.1f}°C")
print(f"Разница: {temp_diff:.1f}°C | Пороги: ВКЛ>{on_threshold}°C, ВЫКЛ<={off_threshold}°C")
print(f"Мотор: {'ВКЛ' if motor_state else 'ВЫКЛ'}")
print(f"Тревога: {'АКТИВНА' if alarm else '---'}")
print("="*50)
# Обновление данных
prev_temp = temp1
last_time = current_time
time.sleep(1)