SENSOR DE UMIDADE CASEIRO COM ARDUINO

Este artigo é um resultado de um experimento autoral no qual foi construído um sensor umidade relativa do ar de forma caseira com base no psicrômetro tradicional antes de começar o aplicativo Orion. Por isso este sensor não é nada além de um experimento cientifico que é capaz de medir a umidade relativa do ar.

Sensor de Umidade

Este sensor é baseado no psicrômetro tradicional que utiliza dois termômetros analógicos onde um apresenta um bulbo (vidro recipiente) com algodão umedecido com água e outro com o bulbo seco, onde a diferença de temperatura com base na pressão atmosférica resulta na umidade relativa do ar.

O psicrômetro ou sensor de umidade caseiro seguiu o mesmo basicamente a mesma estrutura tendo apenas o termômetros sendo substituídos por termistores NTC de 10kohms. Estruturalmente o sensor foi construído com placas de PVC e duas seringas de 10ml interligadas entre si por uma passagem interna na base.

O algodão orgânico tem um trabalho fundamental de “puxar” a água do recipiente e umedecer o termistor (Tm) na parte superior, esta parte deve ficar bem livre para ventilação, caso contrário terá uma umidade mais alta do que o normal.

Sensor de umidade caseiro com arduino

Diagrama

A plaquinha da imagem acima é apenas um mini circuito contém a conexão dos termistores de forma que fique mais fácil no manuseio mas dá para fazer na protoboard, porém se cair água nos barramentos pode enferrujar.

Para demonstração deste sensor, foi utilizado um Arduino nano e para exibir os valores lidos foi adicionando um display OLED 0,96″ 128×64 I2C. Não é necessário ter esse display a não ser os essa montagem é apenas um exemplo.

Formula Matemática

A maior vantagem desse sensor é não ter a necessidade de ficar olhando para a tabela psicométrica para identificar a umidade relativa do ar no exato instante de observação, pois o microcontrolador vai realizar os cálculos e exibir os resultados em tempo real.

Para entender melhor a formula a seguir é necessário compreender o que é representa cada “variável” na expressão.

  • 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).

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

Convertendo essas formulas matemáticas para linguagem de programação no Arduino fica desta seguinte forma:

  double ts = temps.getTemp(),
         tm = tempm.getTemp(),
         bar = 759.75,
         pvsm,
         pvs, 
         pv,
         ur;
  pvsm = 6.1078 * pow(10, ((7.5 * tm) / (237.3 + tm)));
  pvs = 6.1078 * pow(10, ((7.5 * ts) / (237.3 + ts)));
  pv = pvsm - (0.00067 * bar * (ts - tm));
  ur = (pv / pvs) * 100;

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

Código

Para que esta aplicação funcione com o display OLED 0,96″ é necessário que tenha instalado a biblioteca Adafruit_SSD1306 na IDE do Arduino, feito isso é só copiar o código abaixo ou baixar via GitHub

/*-------------------------------------------------------------------------------
* Projeto: Sensor de Umidade Caseiro com Arduino
* Saiba mais: https://elcereza.com/portfolio/
* Disponibilizado por: https://elcereza.com/
* Autor: Gustavo Cereza
---------------------------------------------------------------------------------*/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 
#define OLED_RESET     -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#include <Thermistor.h>
Thermistor temps(1);                                                               // Entrada A1 do termistor seco
Thermistor tempm(2);                                                               // Entrada A2 do termistor umedecido
void setup() {
  Serial.begin(9600);
  
  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();
  delay(2000); 
  display.clearDisplay();
}
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 = 6.1078 * pow(10, ((7.5 * tm) / (237.3 + tm)));
  pvs = 6.1078 * pow(10, ((7.5 * ts) / (237.3 + ts)));
  pv = pvsm - (0.00067 * bar * (ts - tm));
  ur = (pv / pvs) * 100;
  /*---------------------  Display  ------------------------*/
  display.clearDisplay();
  display.setTextSize(2); 
  display.setTextColor(WHITE);
  display.setCursor(10, 10);
  display.print(F("T: "));
  display.println(ts);
  display.setCursor(10, 35);
  display.print(F("H: "));
  display.println(ur);
  display.display();      
  /*---------------------  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

Considerações Finais

Este sensor é muito simples de ser feito e da para ser montado com componentes retirados de sucata como esse foi montado. Esse exemplo infelizmente tem um grande problema que é a dependência barométrica mas felizmente existe uma solução disponível que usa a tabela psicrométrica.