Melhoria no sensor de umidade caseiro

O sensor de umidade caseiro com Arduino que foi desenvolvido usava uma série de calculos para determinar a umidade relativa do ar mas tinha um fator muito ruim que é a dependência da pressão atmosférica. Caso não saiba do que se trata este artigo, leia ‘Sensor de Umidade Caseiro com Arduino‘ primeiro para que possa compreender melhor este.

Tabela Psicrométrica

Os psicrômetros (aparelho que mede umidade relativa do ar) analógicos como já foi visto, utiliza dois termômetros analógicos tendo um com o bulbo umedecido mas se há psicrômetros de parede significa que deve ter algum meio mais fácil de identificar a umidade relativa do ar sem fazer todos aqueles cálculos, e de fato tem. Existe uma tabela que contém os valores já predefinidos de acordo com a temperatura do termômetro do bulbo seco e da diferença entre os dois termômetros.

Lógica da Programação

A ideia foi basicamente fazer a identificação da umidade com base nessa tabela só que em tempo real, para isso dividir cada coluna em cada matriz contendo todos os valores das 42 linhas mas como começa no 3, adicionei três 0 antes da contagem para cada coluna. A primeira coluna começa com zero mas representa a coluna ‘.5’ da tabela.

int  c0[] = {0, 0, 0, 92, 83, 93, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95,
             95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 
             96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97}, 

Como são 15 colunas no total, foram criadas mais 14 matrizes iguais a essa mudando apenas o valor interno delas e também foi criado uma matriz “mãe” que vai conter cada uma delas mais pra frente.

int c[]  = {0, 0, 0, 0, 0,
            0, 0, 0, 0, 0,
            0, 0, 0, 0, 0};
            
int  c0[] = {0, 0, 0, 92, 83, 93, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95,
             95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 
             96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97}, 
     c1[] = {0, 0, 0, 84, 85, 86, 87, 87, 88, 88, 89, 89, 89, 89, 89, 89,
             90, 90, 90, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 
             93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94},
     c2[] = {0, 0, 0, 76, 77, 78, 80, 81, 82, 82, 83, 83, 84, 84, 85, 85,
             86, 86, 87, 87, 87, 88, 88, 88, 88, 89, 90, 90, 90, 90, 90, 
             90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91},
     c3[] = {0, 0, 0, 69, 70, 72, 73, 74, 75, 76, 76, 77, 78, 78, 79, 79,
             80, 80, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 86, 86, 
             86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 88, 89, 89, 89},
     c4[] = {0, 0, 0, 62, 63, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76,
             77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 82, 82, 
             82, 83, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 87},
     c5[] = {0, 0, 0, 54, 56, 58, 60, 62, 64, 65, 66, 67, 68, 69, 70, 71,
             72, 72, 73, 74, 74, 75, 76, 77, 77, 78, 78, 79, 79, 79, 79, 
             80, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84},
     c6[] = {0, 0, 0, 47, 49, 51, 54, 54, 56, 59, 61, 66, 63, 64, 65, 66,
             67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 75, 76, 76, 76, 76, 
             77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 80, 80, 80, 80},
     c7[] = {0, 0, 0, 40, 43, 45, 47, 49, 51, 53, 56, 57, 58, 60, 61, 62,
             63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 71, 72, 72, 73, 73, 
             73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78},
     c8[] = {0, 0, 0, 32, 35, 38, 41, 43, 46, 48, 51, 52, 53, 55, 57, 58,
             59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 67, 69, 69, 70, 70, 
             70, 71, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 76},
     c9[] = {0, 0, 0, 25, 29, 32, 35, 38, 40, 42, 45, 47, 48, 50, 52, 53,
             55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 66, 66, 
             67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 72},
    c10[] = {0, 0, 0, 12, 16, 30, 23, 26, 29, 32, 35, 37, 38, 40, 48, 44,
             46, 48, 49, 51, 58, 53, 54, 54, 55, 56, 58, 59, 60, 61, 61, 
             61, 62, 63, 63, 64, 64, 65, 66, 66, 66, 67, 67, 67, 68, 68},
    c11[] = {0, 0, 0, 0, 0, 0, 11, 15, 19, 22, 26, 28, 30, 32, 34, 36,
             38, 40, 42, 54, 45, 45, 47, 48, 49, 51, 52, 53, 54, 55, 55, 
             56, 57, 57, 58, 59, 59, 60, 61, 61, 61, 62, 62, 62, 63, 63},
    c12[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 17, 19, 21, 24, 26, 28,
             31, 36, 35, 37, 38, 39, 41, 42, 43, 45, 46, 47, 48, 49, 50, 
             51, 52, 58, 62, 53, 54, 54, 55, 56, 56, 57, 57, 58, 58, 59},
    c13[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 18, 20,
             23, 25, 27, 29, 31, 32, 34, 36, 37, 39, 40, 41, 42, 43, 44, 
             45, 46, 47, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 54, 54},
    c14[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13,
             16, 18, 20, 22, 24, 26, 28, 30, 31, 36, 35, 36, 37, 38, 39, 
             40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 51, 52, 52};

Como existem várias matrizes que representa várias colunas fica ruim de capturar a coluna especifica, a solução foi obter o valor da linha de todas as colunas e armazenar em cada lote correspondente a matriz mãe dentro do void loop.

  c[0] = c0[ts]; c[1] = c1[ts]; c[2] = c2[ts]; c[3] = c3[ts];
  c[4] = c4[ts]; c[5] = c5[ts]; c[6] = c6[ts]; c[7] = c7[ts];
  c[8] = c8[ts]; c[9] = c9[ts]; c[10] = c10[ts]; c[11] = c11[ts];
  c[12] = c12[ts]; c[13] = c13[ts]; c[14] = c14[ts]; 

A coluna da tabela psicrométrica é a diferença de temperatura do termômetro (termistor) seco com o umedecido.

Variação de temperatura dos termistores do sensor de umidade relativa do ar caseiro.

Usando a matriz mãe fica muito mais fácil para selecionarmos a coluna correta mas como as colunas são representações decimais da formula acima, pode não haver um casamento dos valores e para essa solução não foi encontrado uma jeito melhor a do que os ‘ifs’.

  if(dt < 0 && dt >= 0.5){ ur = c[0]; }
  if(dt > 0.5 && dt <= 1){ ur = c[1]; }
  if(dt > 1 && dt <= 1.5){ ur = c[2]; }
  if(dt > 1.5 && dt <= 2){ ur = c[3]; }
  if(dt > 2 && dt <= 2.5){ ur = c[4]; }
  if(dt > 2.5 && dt <= 3){ ur = c[5]; }
  if(dt > 3 && dt <= 3.5){ ur = c[6]; }
  if(dt > 3.5 && dt <= 4){ ur = c[7]; }
  if(dt > 4 && dt <= 4.5){ ur = c[8]; }
  if(dt > 4.5 && dt <= 5){ ur = c[9]; }
  if(dt > 5 && dt <= 6){ ur = c[10]; }
  if(dt > 6 && dt <= 7){ ur = c[11]; }
  if(dt > 7 && dt <= 8){ ur = c[12]; }
  if(dt > 8 && dt <= 9){ ur = c[13]; }
  if(dt > 9 && dt <= 10){ ur = c[14]; }

Código

Infelizmente não foi possível manter o display OLED para visualizar em tempo real pois acabou puxando 94% da memoria dinâmica então ficou só via serial mas para o experimento ficou muito bom. O código também está disponível para download no GitHub.

/*-------------------------------------------------------------------------------
* Projeto: Melhoria do Sensor de Umidade Caseiro com Arduino
* Saiba mais: https://elcereza.com/
* Disponibilizado por: https://elcereza.com/
* Autor: Gustavo Cereza
---------------------------------------------------------------------------------*/
#include <Thermistor.h>
Thermistor temps(1);                                                               // Entrada A1 do termistor seco
Thermistor tempm(2);                                                               // Entrada A2 do termistor umedecido
int c[]  = {0, 0, 0, 0, 0,                                                         // Matriz mãe
            0, 0, 0, 0, 0,
            0, 0, 0, 0, 0};
            
int  c0[] = {0, 0, 0, 92, 83, 93, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95,          // Conjunto de matrizes representando cada coluna da tabela
             95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 
             96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97}, 
     c1[] = {0, 0, 0, 84, 85, 86, 87, 87, 88, 88, 89, 89, 89, 89, 89, 89,
             90, 90, 90, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 
             93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94},
     c2[] = {0, 0, 0, 76, 77, 78, 80, 81, 82, 82, 83, 83, 84, 84, 85, 85,
             86, 86, 87, 87, 87, 88, 88, 88, 88, 89, 90, 90, 90, 90, 90, 
             90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91},
     c3[] = {0, 0, 0, 69, 70, 72, 73, 74, 75, 76, 76, 77, 78, 78, 79, 79,
             80, 80, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 86, 86, 
             86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 88, 89, 89, 89},
     c4[] = {0, 0, 0, 62, 63, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76,
             77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 82, 82, 
             82, 83, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 87},
     c5[] = {0, 0, 0, 54, 56, 58, 60, 62, 64, 65, 66, 67, 68, 69, 70, 71,
             72, 72, 73, 74, 74, 75, 76, 77, 77, 78, 78, 79, 79, 79, 79, 
             80, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84},
     c6[] = {0, 0, 0, 47, 49, 51, 54, 54, 56, 59, 61, 66, 63, 64, 65, 66,
             67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 75, 76, 76, 76, 76, 
             77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 80, 80, 80, 80},
     c7[] = {0, 0, 0, 40, 43, 45, 47, 49, 51, 53, 56, 57, 58, 60, 61, 62,
             63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 71, 72, 72, 73, 73, 
             73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78},
     c8[] = {0, 0, 0, 32, 35, 38, 41, 43, 46, 48, 51, 52, 53, 55, 57, 58,
             59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 67, 69, 69, 70, 70, 
             70, 71, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 76},
     c9[] = {0, 0, 0, 25, 29, 32, 35, 38, 40, 42, 45, 47, 48, 50, 52, 53,
             55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 66, 66, 
             67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 72},
    c10[] = {0, 0, 0, 12, 16, 30, 23, 26, 29, 32, 35, 37, 38, 40, 48, 44,
             46, 48, 49, 51, 58, 53, 54, 54, 55, 56, 58, 59, 60, 61, 61, 
             61, 62, 63, 63, 64, 64, 65, 66, 66, 66, 67, 67, 67, 68, 68},
    c11[] = {0, 0, 0, 0, 0, 0, 11, 15, 19, 22, 26, 28, 30, 32, 34, 36,
             38, 40, 42, 54, 45, 45, 47, 48, 49, 51, 52, 53, 54, 55, 55, 
             56, 57, 57, 58, 59, 59, 60, 61, 61, 61, 62, 62, 62, 63, 63},
    c12[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 17, 19, 21, 24, 26, 28,
             31, 36, 35, 37, 38, 39, 41, 42, 43, 45, 46, 47, 48, 49, 50, 
             51, 52, 58, 62, 53, 54, 54, 55, 56, 56, 57, 57, 58, 58, 59},
    c13[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 18, 20,
             23, 25, 27, 29, 31, 32, 34, 36, 37, 39, 40, 41, 42, 43, 44, 
             45, 46, 47, 48, 49, 50, 51, 51, 52, 52, 53, 53, 54, 54, 54},
    c14[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13,
             16, 18, 20, 22, 24, 26, 28, 30, 31, 36, 35, 36, 37, 38, 39, 
             40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 51, 52, 52};
void setup() {
  Serial.begin(9600);
}
void loop() {
  int ts = temps.getTemp(),                                                     // Obtem o valor da temperatura do termistor seco
      tm = tempm.getTemp(),
      ur;                                                                       // Umidade relativa do ar
  double dt = ts - tm;                                                          // Delta T
  c[0] = c0[ts]; c[1] = c1[ts]; c[2] = c2[ts]; c[3] = c3[ts];
  c[4] = c4[ts]; c[5] = c5[ts]; c[6] = c6[ts]; c[7] = c7[ts];
  c[8] = c8[ts]; c[9] = c9[ts]; c[10] = c10[ts]; c[11] = c11[ts];
  c[12] = c12[ts]; c[13] = c13[ts]; c[14] = c14[ts]; 
  if(dt < 0 && dt >= 0.5){ ur = c[0]; }
  if(dt > 0.5 && dt <= 1){ ur = c[1]; }
  if(dt > 1 && dt <= 1.5){ ur = c[2]; }
  if(dt > 1.5 && dt <= 2){ ur = c[3]; }
  if(dt > 2 && dt <= 2.5){ ur = c[4]; }
  if(dt > 2.5 && dt <= 3){ ur = c[5]; }
  if(dt > 3 && dt <= 3.5){ ur = c[6]; }
  if(dt > 3.5 && dt <= 4){ ur = c[7]; }
  if(dt > 4 && dt <= 4.5){ ur = c[8]; }
  if(dt > 4.5 && dt <= 5){ ur = c[9]; }
  if(dt > 5 && dt <= 6){ ur = c[10]; }
  if(dt > 6 && dt <= 7){ ur = c[11]; }
  if(dt > 7 && dt <= 8){ ur = c[12]; }
  if(dt > 8 && dt <= 9){ ur = c[13]; }
  if(dt > 9 && dt <= 10){ ur = c[14]; }
  
  /*---------------------  Serial  ------------------------*/
  Serial.print("Ts : ");
  Serial.print(ts);
  Serial.print("*C | ");
  Serial.print("Tm : ");
  Serial.print(tm);
  Serial.print("*C | ");
  Serial.print("Ur : ");
  Serial.println(ur);
  Serial.println("-----------------------------------------");
  delay(100);
}

Funcionamento

Funcionamento da melhoria do sensor de umidade relativa do ar caseiro com Arduino

Considerações

O código mostrou ser eficiente, acredito que até mais preciso que o anterior pois este mostrou um resultado mais próximo da umidade relativa do ar às 14h do dia 15/10/2020. Entretanto, por uma tabela no Arduino custou muita memoria dele mas tem como ser solucionado.