Sensor de temperatura DS18B20 e Modulo RTC

Olá pll,
mais uma vez recorro aqui ao forum para uma ajudinha, (aí o que seria de mim sem o forum :wink: ).
Tenho um sensor de temperatura que me indica a temperatura Máxima do dia e a temperatura Mínima do dia, e como também tenho um modulo RTC queria "registar" a hora em que é atingida a temperatura máxima e o mesmo com a mínima.

As varias partes do código são:

Declaração de variaveis:
float tempSala;
    float tempAqua;

    float max_temp_aquario_dia = -100.0;                    
    float max_temp_aquario_ever = -100.0;                  
    float min_temp_aquario_dia = 100.0;                    
    float min_temp_aquario_ever = 100.0;                
    float max_temp_sala_dia = -100.0;                  
    float min_temp_sala_dia = 100.0;                     
    unsigned char flag_temp = 0;

    int menuEcra = 0;          
    int horaTempMaxAqua;
    int minutoTempMaxAqua;
    int horaTempMinAqua;
    int minutoTempMinAqua;
    int horaTempMaxSala;
    int minutoTempMaxSala;
    int horaTempMinSala;
    int minutoTempMinSala;

    boolean passaInfoTempMaxMin = false; 
    boolean temperaturasActuais = false;
    boolean temperaturasMaximas = false;
    boolean temperaturasMinimas =false;
    boolean temperaturasMaxMinHorasAquario = false;
    unsigned long tempoInfo = 0;

    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    DeviceAddress aquaThermometer = { 0x28, 0xF8, 0x62, 0x47, 0x05, 0x00, 0x00, 0x0C };  
    DeviceAddress salaThermometer = { 0x28, 0x3E, 0x08, 0x5C, 0x05, 0x00, 0x00, 0x21 };

FUNÇÃO TEMPERATURA:
void printTemperature(DeviceAddress deviceAddress)
{        //float tempC = sensors.getTempC(deviceAddress);
         float tempSala= sensors.getTempC(salaThermometer);
         float tempAqua= sensors.getTempC(aquaThermometer);
         if (tempSala == -127.00)
            {Serial.print("Erro ao ler temperatura !");
             lcd.clear();
             MostraInfo(TARGET, 0, 0, "Erro temperatura");}
         else
            {Serial.print("Temperatura: ");
             //lcd.setCursor(8,1);
             //lcd.print("  ");
            lcd.setCursor(10, 1);
            lcd.print(tempAqua);
            lcd.setCursor(15, 1);
            lcd.print("C");
            Serial.print(tempAqua);
            Serial.print("C");
            Serial.print(" / ");
            Serial.print(DallasTemperature::toFahrenheit(tempAqua));
            Serial.print("F");
            Serial.println();
    
    
            
    if (tempAqua > max_temp_aquario_dia) max_temp_aquario_dia = tempAqua;
    if (tempAqua < min_temp_aquario_dia) min_temp_aquario_dia = tempAqua;
    
    if (tempSala > max_temp_sala_dia) max_temp_sala_dia = tempSala;
    if (tempSala < min_temp_sala_dia) min_temp_sala_dia = tempSala;
    
    if (tempAqua > max_temp_aquario_ever) max_temp_aquario_ever = tempAqua;
    if (tempAqua < min_temp_aquario_ever) min_temp_aquario_ever = tempAqua;

    if (hora == 0 && flag_temp == 0)  //novo mes que inicia...
       {max_temp_aquario_dia = 0.0;
        min_temp_aquario_dia = 3000.0;
        max_temp_sala_dia = 0.0;
        min_temp_sala_dia = 3000.0;
        flag_temp = 1;}
            }
     if(max_temp_aquario_dia != max_temp_aquario_dia)
       {horaTempMaxAqua = hora;
        minutoTempMaxAqua = minuto;}
     
     if(min_temp_aquario_dia!=min_temp_aquario_dia)
       {horaTempMinAqua = hora;
        minutoTempMinAqua = minuto;}   
     
       
}
PARTE DA FUNÇÃO QUE PRODUZ O OUTPUT DESEJADO:
else if (estado==true && Key==NO_KEY &&  temperaturasMaxMinHorasAquario== true)
                                   {if (millis() - tempoInfo > 1500) 
                                       {menuEcra++;
                                          if (menuEcra >= 3) 
                                          {menuEcra = 1;}
                                        tempoInfo = millis();
                                switch (menuEcra) 
                                  {case 1:
                                         lcd.clear();
                                         MostraInfo(TARGET, 0, 0, "Temp. Max do dia");
                                         MostraInfo(TARGET, 0, 1, "Aquario as:");
                                         lcd.setCursor(11, 1);
                                         lcd.print(horaTempMaxAqua);
                                         MostraInfo(TARGET, 13, 1, ":");
                                         lcd.setCursor(14, 1);
                                         lcd.print(minutoTempMaxAqua);
                                      break;
                                   case 2:
                                         lcd.clear();
                                         MostraInfo(TARGET, 0, 0, "Temp. Min do dia");
                                         MostraInfo(TARGET, 0, 1, "Aquario as:");
                                         lcd.setCursor(11, 1);
                                         lcd.print(horaTempMinAqua);
                                         MostraInfo(TARGET, 13, 1, ":");
                                         lcd.setCursor(14,1);
                                         lcd.print(minutoTempMinAqua);
                                      break;
                                  }     
                                       }
                                   }

A questão é que as variaveis:

  • horaTempMaxAqua;
  • minutoTempMaxAqua;
  • horaTempMinAqua;
  • minutoTempMinAqua

estão-me a devolver o valor "0.00".
Mas ao fazer isto:
if(max_temp_aquario_dia != max_temp_aquario_dia)
{horaTempMaxAqua = hora;
minutoTempMaxAqua = minuto;}

elas não deveriam assumir o valor da hora e minuto quando uma nova temperatura máxima é registada?

Segue também link para o código completo.
https://googledrive.com/host/0B-Pv876wR5B1OVFDdF9rYjZ6UFk

Agradeço toda a ajudar que me poderem dar.

Obg
NJPinheiro

A resposta simples é: Não!

O problema está nesta parte do código que foi postada (não fui ver o resto sequer):

                                if(max_temp_aquario_dia != max_temp_aquario_dia)
                                   {horaTempMaxAqua = hora;
                                    minutoTempMaxAqua = minuto;}

Como a desigualdade do if nunca vai ser verdadeira, o código dentro desse if nunca vai ser executado.
O que deveria haver na condição do if eram duas vaiáveis.

O que está a ser testado é, por exemplo:

                                if(22.5 != 22.5)

luisilva:
A resposta simples é: Não!

O problema está nesta parte do código que foi postada (não fui ver o resto sequer):

                                if(max_temp_aquario_dia != max_temp_aquario_dia)

{horaTempMaxAqua = hora;
                                    minutoTempMaxAqua = minuto;}




Como a desigualdade do `if` [u]**nunca**[/u] vai ser verdadeira, o código dentro desse `if` nunca vai ser executado.
O que deveria haver na condição do `if` eram duas vaiáveis.

Olá Luís,
mais uma vez uma boa dica :wink:

Pois é para quem ainda está muito "cru" como eu, por vezes acha que a solução não pode ser assim tão simples....mas é!!!

O trabalho já estava feito, com a sua dica e puxando um bocado pela cabeça, voila!!!

A solução foi pegar nisto:

if (tempAqua > max_temp_aquario_dia) max_temp_aquario_dia = tempAqua;

e meter-lhe isto:

horaTempMaxAqua = hora;
        minutoTempMaxAqua = minuto;}

ou seja, ficou:

if (tempAqua > max_temp_aquario_dia) 
       {max_temp_aquario_dia = tempAqua;
        horaTempMaxAqua = hora;
        minutoTempMaxAqua = minuto;}

Obg
NJPinheiro

Sim, assim parece-me bem.