首页 > 解决方案 > ESP32 任务中的 RTC DS3231 在读取温度时导致 ESP 重启

问题描述

我正在创建一个与代码和触发器关联的任务。一切正常。在任务中,我阅读了一些传感器:

一切都按预期工作。但是,当我尝试读取 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;
}

标签: c++ctaskesp32freertos

解决方案


推荐阅读