2025-05-20 09:41:22 +08:00
|
|
|
|
#include "wendu.h"
|
|
|
|
|
|
2025-04-16 09:58:09 +08:00
|
|
|
|
// 添加温度阈值变量(默认值)
|
|
|
|
|
float temp_lower_limit = 15.0f; // 默认下限温度15℃
|
|
|
|
|
float temp_upper_limit = 20.0f; // 默认上限温度20℃
|
|
|
|
|
|
2025-05-20 09:41:22 +08:00
|
|
|
|
// 定义常量
|
2025-04-16 09:58:09 +08:00
|
|
|
|
#define BALANCE_R 10000.0f // 10K分压电阻
|
|
|
|
|
#define NTC_R25 10000.0f // NTC在25℃时的电阻值,假设是10K NTC
|
|
|
|
|
#define BETA 3950.0f // B值,需要根据您的NTC型号修改
|
|
|
|
|
#define KELVIN_OFFSET 273.15f
|
|
|
|
|
|
2025-05-20 09:41:22 +08:00
|
|
|
|
float voltage = 0.0f, temperature = 0.0f;
|
|
|
|
|
void Save_Temp_Limits_To_EEPROM(float lower, float upper)
|
|
|
|
|
{
|
|
|
|
|
// 保存温度阈值
|
|
|
|
|
Save_Float_To_EEPROM(TEMP_LOWER_LIMIT_ADDR,lower);
|
|
|
|
|
Save_Float_To_EEPROM(TEMP_UPPER_LIMIT_ADDR,upper);
|
|
|
|
|
Inf_AT24C02_WriteByte(TEMP_FLAG_ADDR,TEMP_FLAG_VAL);
|
|
|
|
|
}
|
|
|
|
|
// 从EEPROM加载温度阈值
|
|
|
|
|
void Load_Temp_Limits_From_EEPROM(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t flag = Inf_AT24C02_ReadByte(TEMP_FLAG_ADDR);
|
|
|
|
|
if(flag==TEMP_FLAG_VAL)
|
|
|
|
|
{
|
|
|
|
|
temp_lower_limit = Read_Float_From_EEPROM(TEMP_LOWER_LIMIT_ADDR);
|
|
|
|
|
temp_upper_limit = Read_Float_From_EEPROM(TEMP_UPPER_LIMIT_ADDR);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Save_Temp_Limits_To_EEPROM(temp_lower_limit,temp_upper_limit);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//实现更新函数
|
|
|
|
|
void Update_Temp_Limits(float lower, float upper)
|
|
|
|
|
{
|
|
|
|
|
temp_lower_limit = lower; // 更新下限
|
|
|
|
|
temp_upper_limit = upper; // 更新上限
|
|
|
|
|
Save_Temp_Limits_To_EEPROM(lower, upper); // 保存到EEPROM
|
|
|
|
|
}
|
|
|
|
|
void Print_Temperature(uint16_t *data)
|
2025-04-16 09:58:09 +08:00
|
|
|
|
{
|
|
|
|
|
const float CALIBRATION_FACTOR = 0.6f;
|
|
|
|
|
|
2025-05-20 09:41:22 +08:00
|
|
|
|
// 直接使用data[1]作为ADC值(ADC_IN4通道)
|
|
|
|
|
uint16_t adc_value = data[0];
|
2025-04-16 09:58:09 +08:00
|
|
|
|
|
2025-05-20 09:41:22 +08:00
|
|
|
|
// 转换为电压值,并应用校准系数
|
|
|
|
|
voltage = (float)adc_value * (3.3f / 4096.0f) * CALIBRATION_FACTOR;
|
|
|
|
|
|
|
|
|
|
// 计算NTC电阻值
|
|
|
|
|
// 如果NTC接VCC(上拉)用这个:
|
|
|
|
|
float ntc_r = BALANCE_R * voltage / (3.3f - voltage);
|
|
|
|
|
|
|
|
|
|
// 如果NTC接地(下拉)用这个:
|
|
|
|
|
// float ntc_r = BALANCE_R * (3.3f - voltage) / voltage;
|
|
|
|
|
|
|
|
|
|
// 计算温度
|
|
|
|
|
temperature = 1.0f / (log(ntc_r/NTC_R25)/BETA + 1.0f/(25.0f + KELVIN_OFFSET)) - KELVIN_OFFSET;
|
|
|
|
|
// printf("T: %.2f°C\r\n", temperature);
|
2025-04-16 09:58:09 +08:00
|
|
|
|
|
2025-05-20 09:41:22 +08:00
|
|
|
|
// 控制加热膜逻辑
|
|
|
|
|
// 使用可调节的温度阈值进行控制
|
|
|
|
|
if (temperature < temp_lower_limit) {
|
|
|
|
|
// 温度低于下限,开启加热
|
|
|
|
|
Control_Heater(1);
|
|
|
|
|
//printf("温度%.2f低于%.2f℃,开启加热\n", temperature, temp_lower_limit);
|
|
|
|
|
}
|
|
|
|
|
else if (temperature > temp_upper_limit) {
|
|
|
|
|
// 温度高于上限,关闭加热
|
|
|
|
|
Control_Heater(0);
|
|
|
|
|
//printf("温度%.2f高于%.2f℃,关闭加热\n", temperature, temp_upper_limit);
|
2025-04-16 09:58:09 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|