c++ - ESP32 任务中的 RTC DS3231 在读取温度时导致 ESP 重启
问题描述
我正在创建一个与代码和触发器关联的任务。一切正常。在任务中,我阅读了一些传感器:
- DHT11 的温度/湿度
- 读取 MQ-2 气体传感器
- 读取我不记得型号的水传感器
一切都按预期工作。但是,当我尝试读取 RTC DS3231 的温度时,ESP32 会重新启动。在任务之外,在循环或设置中,阅读会完美地进行。
我已经尽我所能,但我找不到我正在犯的错误。有人可以检查我的代码吗?
bool CONFIG_TASK_SEGURANCA(){
if (xTaskCreatePinnedToCore(SEGURANCA_Task, "SEGURANCA_Task", 4096, NULL, 0, &seguranca_TaskHandle, 0) != pdTRUE)
return false;
seguranca_Ticker.attach(seguranca_intervaloLeituraTASK, SEGURANCA_triggerTask);
return true;
}
void SEGURANCA_triggerTask(){
if (seguranca_TaskHandle != NULL)
xTaskResumeFromISR(seguranca_TaskHandle);
}
void SEGURANCA_Task(void* pvParameters){
while (1){
if (seguranca_tasksEnabled)
SEGURANCA_AtualizarDados();
vTaskSuspend(NULL);
}
}
bool SEGURANCA_AtualizarDados()
{
// --------------- DHT11
if (DHT11_habilitado)
{
TempAndHumidity newValues = DHT11.getTempAndHumidity();
if (DHT11.getStatus() != 0)
return false;
DHT11_Humidade = newValues.humidity;
DHT11_Temperatura = newValues.temperature;
DHT11_IndiceCalor = DHT11.computeHeatIndex(newValues.temperature, newValues.humidity);
DHT11_PontoOrvalho = DHT11.computeDewPoint(newValues.temperature, newValues.humidity);
String comfortStatus;
switch (cf) {
case Comfort_OK:
DHT11_comfortStatus = F("AGRADAVEL");
break;
case Comfort_TooHot:
DHT11_comfortStatus = F("MUITO QUENTE");
break;
case Comfort_TooCold:
DHT11_comfortStatus = F("MUITO FRIO");
break;
case Comfort_TooDry:
DHT11_comfortStatus = F("MUITO SECO");
break;
case Comfort_TooHumid:
DHT11_comfortStatus = F("MUITO HUMIDO");
break;
case Comfort_HotAndHumid:
DHT11_comfortStatus = F("QUENTE E HUMIDO");
break;
case Comfort_HotAndDry:
DHT11_comfortStatus = F("QUENTE E SECO");
break;
case Comfort_ColdAndHumid:
DHT11_comfortStatus = F("FRIO E HUMIDO");
break;
case Comfort_ColdAndDry:
DHT11_comfortStatus = F("FRIO E SECO");
break;
default:
DHT11_comfortStatus = F("INDETERMINADO");
break;
};
}
// --------------- MQ2
if (MQ2_habilitado)
{
if (gpio_get_level(PIN_MQ2_IDF) == 0)
MQ2_TEMfumo = 1;
else
MQ2_TEMfumo = 0;
}
// --------------- SENSOR DE AGUA
if (sAgua_habilitado)
{
if (gpio_get_level(PIN_sAGUA_IDF) == 0)
sAgua_TEMvazamento = 1;
else
sAgua_TEMvazamento = 0;
}
// --------------- TEMPERATURA DO SISTEMA (DS3231)
/*
*** CAUSE ESP RESTART
RtcTemperature temperatura;
temperatura = RTC_DS3231.GetTemperature();
float aaa = temperatura.AsFloatDegC();
*/
/*
*** CAUSE ESP RESTART
RtcTemperature temperatura;
temperatura = RTC_DS3231.GetTemperature().AsFloatDegC();
float aaa = temperatura.AsFloatDegC();
*/
/*
*** CAUSE ESP RESTART
RtcTemperature temperatura;
temperaturaDS3231 = RTC_DS3231.GetTemperature().AsFloatDegC();
char buf[6];
snprintf(buf, sizeof(buf), "%01d", temperaturaDS3231);
*/
/*
*** CAUSE ESP RESTART
int RTC_DS3231_temperatura;
RtcTemperature temperatura;
temperatura = RTC_DS3231.GetTemperature().AsFloatDegC();
char buf[3];
snprintf(buf, sizeof(buf), "%01d", temperaturaDS3231);
sscanf(buf, "%d", &RTC_DS3231_temperatura);
*/
return true;
}
解决方案
推荐阅读
- node.js - 从 nodejs 启动交互式 ssh
- python - 熊猫在两个条件下像 SUMIFS 一样出色
- angularjs - 声明前使用的变量“Foo”。两个类相互依赖
- elixir - Elixir Phoenix.Route.NoRouteError
- vb.net - 如何在 SSRS 自定义代码中访问包含的文本框
- excel - 我的代码未在必填表中输入字段
- python - 如何获取python中给定输入文件的所有列表的所有标记的长度?
- javascript - 抓取页面以获取编码的 javascript 链接
- php - 为什么 $this->db->affected_rows() 返回 0?
- wpf - WPF ObjectDataProvider 参数