capa sensor de umidade relativa do ar caseiro com arduino

Sensor de Umidade do Ar Caseiro com Arduino

O Sensor de umidade relativa do ar caseiro foi parte de um projeto científico que realizei na iniciação científica de inovações tecnológicas no SESI no ano de 2018.

Não há nenhum outro site ou canal que fez isso e divulgou, por isso esse conteúdo é exclusivo e você poderá fazer o seu em sua casa seguindo este tutorial.

Sensor de Umidade do Ar o que é e para que serve?

Basicamente um sensor de umidade do ar mede a quantidade de vapor de água presente na atmosfera e a unidade de medição é percentual, indo de 0 a 100%.

Sua importância é relacionada a qualidade de vida do ser humano, segundo o artigo ‘Medidas caseiras contra baixa umidade do ar amenizam agravos na saúde’.

Sensor de Umidade Ar Tradicional

Um sensor de umidade do ar tradicional utiliza um termômetro de bulbo seco (corpo do termômetro) e outro de bulbo úmido e através da diferença de temperatura entre eles, é possível determinar a umidade relativa com base em uma tabela psicrométrica.

Sensor tradicional, agora digital

Este post é fundamentado no mesmo método de medição do sensor tradicional, porém no lugar de um termômetro analógico foi usado um digital, mais conhecido como termistor NTC.

O que é um Termistor NTC?



  Brevemente, um termistor é um resistor que varia sua resistência de acordo com a temperatura e através da equação da inversa de Steinhart–Hart é possível obter a temperatura em graus Celsius.

Este componente é bastante comum em fontes chaveadas em circuito de proteção e de refrigeração, por isso é muito comum encontrá-lo em sucatas eletrônicas, o que torna a construção deste sensor quase que sem custos.

Construção do sensor

Toda a construção é bastante simples, basta se basear no método tradicional literalmente a mesma coisa, basta trocar o termômetro por um termistor NTC e toda parte mecânica ficou pronta. Veja só como ficou o primeiro modelo que criei. 

Preste muita atenção na exposição do termistor de bulbo úmido (Tm), ele deve ser envolvido por um algodão orgânico que deve ter contato direto com a água.

Como transformar temperaturas em umidade relativa?

Para converter as temperaturas em umidade relativa do ar, basta seguir os princípios básicos da psicométrica que utiliza dois métodos para obter a umidade. 

O primeiro método tem uma dependência da pressão atmosférica do ar, então só é interessante para quem tem um barômetro disponível para adicionar no circuito. Caso contrário use o segundo método.

O segundo método utiliza uma tabela pré calculada que se baseia pela diferença entre a temperatura de bulbo seco com a de bulbo úmido, por isso não é necessário o uso de um barômetro.

Primeiro método



Este primeiro método é bastante interessante para quem gosta de cálculos, caso não goste não se preocupe pois você não irá fazer nenhum cálculo, está tudo pronto para uso.

Para chegar até o resultado, é necessário executar 4 fórmulas matemáticas, mas antes de ir para as fórmulas, é muito importante entender as siglas de cada fórmula.

  • Temperatura do termistor Seco em célsius (Ts);
  • Temperatura de termistor Molhado em célsius (Tm);
  • Pressão Barométrica em mmHg (Bar);
  • Pressão de Vapor Saturado à temperatura de bulbo Molhado (Pvsm);
  • Pressão de Vapor d’água no ar (Pv);
  • Pressão de Vapor saturado à temperatura de bulbo Seco (Pvs);
  • Umidade Relativa do ar (UR).

Fórmulas matemáticas

Cada fórmula deverá ser seguida na mesma ordem que está abaixo, caso contrário haverá erros pois cada uma é dependente uma da outra.

Pressão de vapor saturado à temperatura de bulbo molhado do sensor de umidade caseiro com arduino
Pressão de vapor d'água do sensor de umidade caseiro com arduino
Pressão de vapor saturado à temperatura do bulbo seco do sensor de umidade caseiro com arduino
Umidade relativa do ar do sensor de umidade caseiro com arduino

Toda as formulas foram retiradas da página 44 do artigo Princípios Básicos de Psicrometria que foi essencial para o funcionamento deste sensor.

Todo o cálculo será feito em frações de segundo pelo microcontrolador, por isso é necessário converter tudo isso acima em uma linguagem reconhecida pelo Arduino, convertendo tudo, ficará assim:

Diagrama Esquemático do Primeiro método

Basicamente a parte eletrônica é a mesma do termistor NTC, porém neste caso é necessário duplicar esse circuito.

Se você está achando complicado, não se preocupe que se seguir todos os passos deste post, não haverá erros na sua montagem e se tiver deixe nos comentários que ajudaremos a resolver.



É muito importante que os resistores e termistores sejam da mesma resistência, neste caso, são de 10000 ohms / 10kohms.

Para um uso constante do sensor de umidade do ar caseiro por este método, considere adicionar um barômetro. Caso não tenha, poderá inserir o valor manualmente na variável ‘bar’ ou optar pelo segundo método.

O circuito a seguir demonstra como terá que ser feito a montagem dos componentes na protoboard, se você tiver mais prática, poderá montar uma plaquinha assim como montamos no nosso.

Outra fator muito importante é esse display OLED, ele é opcional, caso opte por não usar em sua montagem, não será necessário se preocupar, pois por padrão, estará desativado. Caso contrário basta você adicionar um ‘!’ na frente do ‘false’ da variável ‘display_enable’

#define display_enable !false

Código completo do sensor de umidade relativa do ar caseiro

Para obter a temperatura por meio do termistor, é necessário realizar o cálculo da inversa de Steinhart–Hart, porém você não precisa saber da formula, a biblioteca vai fazer isso tudo.

Caso queira baixar todo o código e todas as bibliotecas utilizadas, basta clicar aqui que você será redirecionado para o nosso GitHub.

/*-------------------------------------------------------------------------------
* Projeto: Sensor de Umidade do Ar Caseiro com Arduino
* Saiba mais: https://elcereza.com/sensor-de-umidade-do-ar-caseiro/
* Autor: Gustavo Cereza
---------------------------------------------------------------------------------*/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Thermistor.h>

#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 

#define OLED_RESET     -1

#define display_enable !false

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Thermistor temps(1);                                                               // Entrada A1 do termistor seco
Thermistor tempm(2);                                                               // Entrada A2 do termistor umedecido

void setup() {

  Serial.begin(9600);
#ifdef display_enable
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {                                 // Caso o display não funcione, teste com outro endereço i2c
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); 
  }
  display.display();
  display.clearDisplay();
#endif
}

void loop() {
  double ts = temps.getTemp(),                                                     // Obtem o valor da temperatura do termistor seco
         tm = tempm.getTemp(),                                                     // Obtem o valor da temperatura do termistor umedecido
         bar = 759.75,                                                             // Pressão barométrica em mmHg
         pvsm,                                                                     // Pressão de vapor saturado à temperatura do bulbo umedecido
         pvs,                                                                      // Pressão de vapor saturado à temperatura do bulbo seco
         pv,                                                                       // Pressão de vapor d'água no ar
         ur;                                                                       // Umidade relativa do ar


  pvsm = pow(6.1078*10,(7.5*tm/(237.3+tm)));
  pvs = pow(6.1078*10,(7.5*ts/(237.3+ts)));
  pv = pvsm-(0.000667*bar*(ts - tm));
  ur = (pv/pvs)*100;

  /*---------------------  Display  ------------------------*/
#ifdef display_enable
  display.clearDisplay();
  display.setTextSize(2); 
  display.setTextColor(WHITE);
  display.setCursor(10, 10);
  display.print(F("Ts: "));
  display.println(ts);
  display.setCursor(10, 35);
  display.print(F("Ur: "));
  display.println(String(ur) + "%");
  display.display();
#endif
  /*---------------------  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);
}

Não se preocupe em baixar as bibliotecas, ambas estarão em nosso github, também terá o código do segundo método de obtenção da umidade relativa do ar, para ir até o link, basta clicar aqui e instalar as bibliotecas na sua IDE do Arduino.

Teste do 1º Método do Sensor de Umidade do Ar Caseiro

Segundo método



Como já foi dito anteriormente, o segundo método não utiliza a pressão atmosférica, por já ter um cálculo padrão já pré estabelecido.

A tabela psicrométrica trabalha com valores do tipo inteiro, então valores do tipo flutuante não será possível obter através deste método.

Tabela Psicrométrica

No primeiro método vimos que há muitas fórmulas até chegar a umidade relativa do ar, agora imagine você fazendo esse cálculo toda vez que quisesse obter a umidade do ar, seria inviável né? Pois é, seria desanimador medir a umidade.

A tabela psicrométrica veio justamente para resolver o problema anterior, seu uso é muito similar a um jogo de batalha naval.

Primeiramente você olha a temperatura do termômetro de bulbo seco e busca a linha correspondente na tabela, depois basta subtrair a temperatura do bulbo seco com a do bulbo úmido.

  A diferença entre as temperaturas será a coordenada da coluna da tabela, e com a coordenada da temperatura do bulbo seco, por exemplo, se considerarmos a temperatura do termômetro de bulbo seco a 32°C e a do bulbo úmido de 28°C obteremos a umidade de 73%.

Exemplo de funcionamento da tabela psicrométrica

O que o código do Arduino deve fazer é identificar as coordenadas da tabela psicrométrica de forma automática, porém, como podemos fazer isso? É uma resposta um pouco mais técnica, então se tem dificuldade em entender pule esta parte.

Convertendo tabela em matriz

Tabela e matriz são basicamente a mesma coisa. então podemos se apropriar do uso de matrizes no Arduino para replicar a tabela psicrométrica, para isso podemos dividir em colunas e preencher manualmente coluna por coluna, o que ficaria assim: 



Neste caso, o uso mais coerente de matrizes foi a bidimensional que possibilita adicionar as colunas e os valores de cada coluna que seria a representação das linhas da tabela.

const int table[16][43] PROGMEM = {{3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
                                    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
                                    31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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}};

  É importante que a tabela seja do tipo “const” o que bloqueia escrita de valores, permitindo apenas leituras.

Implementei também uma matriz unidimensional para servir de auxílio contendo todos os ΔT da tabela, isso servirá para obtermos a posição horizontal da tabela, o que permitirá selecionar uma única coluna.

const float column[] = {0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 6, 7, 8, 9, 10};

O problema deste método é a memória, pois a matriz 16 x 43 consome muita memória destinada a variáveis no caso do Arduino nano, o que impediria de usar o display LCD igual no método anterior.

Existe uma forma de mover a locação da memória da tabela de SRAM para a memória FLASH, de modo que o problema de memória, basta por o PROGMEM como na imagem abaixo e chamar um método ‘pgm_read_word’.

É importante utilizar o método ‘pgm_read_word’ para ler a variável que está armazenada na memória FLASH, caso não use o resultado não fará nenhum sentido.

Após colocar o método ‘pgm_read_word’ igual na imagem abaixo, os valores normalizaram, veja só:

Obtendo a Umidade da Matriz


Para obtermos a umidade é necessário pegar as coordenadas da coluna e da linha, no caso da linha, basta pegar o valor de Ts e converter para inteiro e percorrer a primeira coluna da tabela, buscando uma temperatura que seja igual a de Ts, dessa forma acharemos a posição.

for (line = 0; line < 41; ++line){
  if ((int)(ts) >= table[0][line] && (int)(ts) < table[0][line + 1])
    break;
}

Agora, com o valor da linha basta fazer praticamente o mesmo processo anterior, só que com o uso de uma equação de diferença entre a Ts com Tm.

  Como a coluna da imagem da tabela já tem esses valores que indicam a seleção de uma determinada coluna, então basta fazer o comparativo com matriz auxiliar e pronto, teremos as duas coordenadas.

for (c = 1; c < 16; ++c) {
  if (c < 15 && dt >= column[c] && dt < column[c + 1])
    break;
  else if (c == 15)
    break;
}

Testando lógica do algoritmo

Particularmente gosto de testar minha lógica em C# por está bem acostumado com esta linguagem. então fiz um APP console .NET Freamework. Veja a lógica funcionando corretamente.

Caso você tenha interesse nesse aplicativo, disponibilizarei o executável e o código fonte, basta clicar aqui para ser direcionado ao repositório no GitHub.

Montagem do modelo de Teste

Por conta da ausência de termistor em estoque, decidi usar o DS18B20, mas você não precisa se preocupar com isso, pois deixarei o diagrama e o código com as duas opções disponíveis.

Parte Eletrônica do Sensor no 2° Método

Ambos as opções estão no mesmo circuito esquemático abaixo. A opção do DS18B20 está na parte superior da placa, caso queira usar termistor, basta não montar a parte superior.

Esquemático do sensor de umidade ar caseiro usando o método da tabela.jpg


Código do Sensor no 2° Método

Praticamente toda a lógica do segundo método já foi vista, então não haverá muitas novidades. Caso queria baixar o código junto com as bibliotecas, basta clicar aqui.

/*-------------------------------------------------------------------------------
* Projeto: Sensor de Umidade do Ar Caseiro com Arduino
* Saiba mais: https://elcereza.com/sensor-de-umidade-do-ar-caseiro/
* Autor: Gustavo Cereza
---------------------------------------------------------------------------------*/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Thermistor.h>

#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1

#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 11

#define display_enable !false
#define ds18b20_enable !false 

OneWire oneWire(ONE_WIRE_BUS);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

DallasTemperature sensors(&oneWire);
DeviceAddress dts, dtm;

Thermistor temps(1);                                                               // Entrada A1 do termistor seco
Thermistor tempm(2);                                                               // Entrada A2 do termistor umedecido


const int table[16][43] PROGMEM = {{3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
                                    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
                                    31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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},
                                  {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}};
            
const float column[] = {0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 6, 7, 8, 9, 10};

void setup() {
  Serial.begin(9600);

#if ds18b20_enable
  sensors.begin();
  sensors.getAddress(dts, 0);
  sensors.getAddress(dtm, 1);
  sensors.setResolution(dts, TEMPERATURE_PRECISION);
  sensors.setResolution(dtm, TEMPERATURE_PRECISION);
#endif
#ifdef display_enable
  while(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    delay(3000);
  }
  display.display();
  display.clearDisplay();
#endif
}

#ifdef ds18b20_enable
float getTemp(DeviceAddress deviceAddress){
  sensors.requestTemperatures();
  return sensors.getTempC(deviceAddress);
}
#endif

int pgm_table(int c, int l){
  return pgm_read_word(&table[c][l]);
}

void loop() {
#if ds18b20_enable
  float ts = getTemp(dts), 
        tm = getTemp(dtm);
#else
  float ts = temps.getTemp(), 
        tm = tempm.getTemp();
#endif

  int ur = 0;

  static int last_ur = 0;
  float dt = ts - tm;
  int line = 0, c = 0;
  if (ts >= 3 && ts <= 45) {
    if (dt > column[0] && dt <= column[15]) {
      for (line = 0; line < 41; ++line){
        if ((int)(ts) >= pgm_table(0, line) && (int)(ts) < pgm_table(0, line))
          break;
      }

      for (c = 1; c < 16; ++c) {
        if (c < 15 && dt >= column[c] && dt < column[c + 1])
          break;
        else if (c == 15)
          break;
      }
      ur = pgm_table(c, line);
    }
  }
  if (dt < column[1])
    ur = 100;
  else if (dt > column[15])
    ur = 0;
 
#ifdef display_enable
  display.clearDisplay();
  display.setTextSize(2); 
  display.setTextColor(WHITE);
  display.setCursor(10, 10);
  display.print(F("Ts: "));
  display.println(String(ts));
  display.setCursor(10, 35);
  display.print(F("Ur: "));
  display.println(String(ur) + "%");
  display.display();
#endif

  Serial.print("C : ");
  Serial.print(c);
  Serial.print(" | L : ");
  Serial.print(line);
  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(1000);
}

Teste do 2º Método do Sensor de Umidade do Ar Caseiro

Neste teste, usei um papel higiênico no lugar do algodão e também utilizai água da torneira. Segundo algumas pesquisas que fiz, o certo é usar algodão orgânico e água destilada.

Boas Práticas para o Uso do Sensor

Como este sensor tem uma dependência total da temperatura, é necessário se atentar com a adição de água, pois caso contrário a umidade relativa resultante será fora do valor real do ambiente.

Quando quiser adicionar mais água, deixe a água dentro de um ponte por pelo menos um dia e sem exposição do sol, para que a água presente no recipiente, fique com a temperatura ambiente.

Ao fazer esta troca, evite ficar segurando o recipiente de água por muito tempo, tenha o mínimo de contato da “área” da mão possível, pois a temperatura corporal pode influenciar na temperatura da água e atrapalhar na precisão.

Esses cuidados acima só deverão ser levado em consideração se você pretende fazer algum estudo usando esse “modelo” de sensor.

Precisão do sensor



Acredito que este método possa ser mais preciso que os já presente no mercado, por se basear em um método analógico.

A maioria dos sensores costumam diminuir a precisão em umidades acima de 80%, esse fato pode ser confirmado na leitura do datasheet. Os que ultrapassam com boa precisão, costumam ser mais caros.

Porém ao fazer uma comparação com a meteorologia do dia, o sensor teve um resultdo muito próximo da previsão. Embora não seja uma comparação justa, já serve como um parâmetro.

A imagem a seguir, foi retirada do storys do nosso instagram que foi feita no dia 21/07/2022. Perceba que a variação entre as umidades é de 5%.

O primeiro método pode ser mais preciso conseguir trabalhar com valores de ponto flutuante, algo que o segundo método não é capaz de fazer.

Deixe uma resposta