Mini Estação Meteorológica Arduino UNO – Hub de Sensores DIY com ESP8266 IoT
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| Espressif ESP8266 ESP-01 | 1 |
| Arduino Proto Shield (ou protoboard comum) | 1 |
| Sensor de Temperatura DHT22 | 1 |
| Seeed Grove - Sensor de Luz | 1 |
| Seeed Grove - Sensor UV | 1 |
| Seeed Grove - Sensor Barômetro | 1 |
| Seeed Grove - Sensor de Poeira | 1 |
| Resistor 1k ohm | 2 |
| Resistor 10k ohm | 1 |
| Resistor 4,75k ohm | 1 |
| Jumpers (genéricos) | 1 conjunto |
Aplicativos e Serviços Online
- Arduino IDE
- ThingSpeak API
Sobre o Projeto
Esta é a primeira geração da minha mini-estação meteorológica baseada em Arduino com conexão Wi-Fi, capaz de postar dados publicamente online usando a plataforma ThingSpeak.
A estação meteorológica coleta os seguintes dados relacionados ao clima e ambiente usando diferentes sensores:
- Temperatura
- Umidade
- Pressão atmosférica
- Intensidade de luz
- Índice UV
- Concentração de poeira
O objetivo é fazer uma estação meteorológica pequena e simples, usando hardware aberto.
Vamos começar e nos divertir!
Componentes Eletrônicos
Você não precisará de ferramentas específicas para a montagem. Todos os componentes podem ser encontrados online na sua loja de e-commerce favorita.
O circuito é alimentado pela porta USB (conectada a computador ou carregador de celular comum), mas você também pode adicionar fonte DC externa ou bateria conectada ao conector de alimentação do Arduino.
Um gabinete para o circuito da estação meteorológica está fora do escopo deste projeto.
Conectando as Peças
Conecte todos os componentes conforme o esquemático. Você precisará de alguns jumpers para conectar cada sensor à protoboard. Pode usar um protoshield (para circuito mais compacto), uma protoboard comum, ou projetar seu próprio shield Arduino.
Conecte o cabo USB ao Arduino Uno e prossiga para o próximo passo.
Código
Assumindo que você já instalou o Arduino IDE mais recente, baixe e instale as seguintes bibliotecas:
- Biblioteca DHT22
- Biblioteca Adafruit BMP085
Para instruções de como adicionar bibliotecas ao Arduino IDE, verifique o guia do Arduino.
Baixe o código Arduino (weatherBox.ino) incluído na seção de código. Substitua XXXXX pelo SSID do seu roteador WiFi, YYYYY pela senha do roteador, e ZZZZZ pela chave de escrita da API do seu canal ThingSpeak (veja como obter no próximo passo).
Conecte a placa Arduino à porta USB do computador e faça upload do código.
Configuração do ThingSpeak
- Crie uma conta no ThingSpeak
- Crie um novo Canal
Especifique o nome e descrição da sua estação meteorológica. Atribua os seguintes canais e salve:
- campo 1 = luz
- campo 2 = umidade
- campo 3 = temperatura (do DHT22)
- campo 4 = índice UV
- campo 5 = concentração de poeira
- campo 6 = pressão
- campo 7 = temperatura (do BMP085)
Copie a chave de escrita da API. É usada no passo anterior no código Arduino. Quando a estação ligar, os valores dos sensores serão enviados ao canal periodicamente. Você pode configurar visualizações públicas e privadas de cada variável.
Exemplo de canal público: https://thingspeak.com/channels/35540
Usando App Android
Você poderá visualizar dados da estação meteorológica em qualquer navegador. Mas também pode verificar no seu smartphone Android e visualizar quando quiser.
- Baixe e instale o app ThingsView na Google Play Store no seu dispositivo Android
- No app, insira o número do ID do seu canal e clique em adicionar. Encontrará o ID na configuração do seu canal ThingSpeak
- Os valores atuais de cada variável serão exibidos em gráfico
Divirta-se!
Código
weatherBox.ino
#include <stdlib.h>
#include <SoftwareSerial.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#define SSID "XXXXX" // substitua XXXXX pelo SSID do seu roteador
#define PASS "YYYYY" // substitua YYYYY pela senha do seu roteador
#define IP "184.106.153.149" // IP do thingspeak.com
#define DHT22_PIN 2
String GET = "GET /update?key=ZZZZZ&field1="; // substitua ZZZZZ pela chave de escrita do seu canal ThingSpeak
SoftwareSerial monitor(10, 11); // Comunicação serial com módulo ESP8266 (RX, TX)
dht DHT;
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
// Variáveis
int luminancePin = A0;
int uvPin = A1;
int dustPin = 8;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;
unsigned long delay_time = 60000;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;
void setup() {
Serial.begin(9600);
monitor.begin(9600);
Serial.println("Inicializando...");
pinMode(dustPin, INPUT);
Serial.println("Detectando sensor de pressão BMP085...");
if (!bmp.begin()) {
Serial.println("Sensor BMP085 não detectado. Verifique conexões ou endereço I2C!");
while (1);
}
Serial.println("BMP085 detectado!");
monitor.flush();
monitor.println("AT");
delay(2000);
if (monitor.find("OK")) {
Serial.println("Comunicação com módulo ESP8266: OK");
} else {
Serial.println("ERRO no módulo ESP8266");
}
connectWiFi();
Serial.print("Amostragem (");
Serial.print(sampletime_ms / 1000);
Serial.println("s)...");
starttime = millis();
}
void loop() {
duration = pulseIn(dustPin, LOW);
lowpulseoccupancy += duration;
if ((millis() - starttime) >= sampletime_ms) {
ratio = lowpulseoccupancy / (sampletime_ms * 10.0);
concentration = 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62;
lowpulseoccupancy = 0;
char buffer[10];
float luminance = analogRead(luminancePin);
float uv = analogRead(uvPin);
uv = uv * 0.0049; // converte para volts
uv = uv * 307; // converte para mW/m²
uv = uv / 200; // calcula índice UV
int chk = DHT.read22(DHT22_PIN);
float humidity = DHT.humidity;
float temperature = DHT.temperature;
sensors_event_t event;
bmp.getEvent(&event);
float pressure = 0;
float temperature1 = 0;
if (event.pressure) {
pressure = event.pressure;
bmp.getTemperature(&temperature1);
}
String luminanceStr = dtostrf(luminance, 4, 1, buffer); luminanceStr.replace(" ", "");
String uvStr = dtostrf(uv, 4, 1, buffer); uvStr.replace(" ", "");
String humidityStr = dtostrf(humidity, 4, 1, buffer); humidityStr.replace(" ", "");
String temperatureStr = dtostrf(temperature, 4, 1, buffer); temperatureStr.replace(" ", "");
String dustStr = dtostrf(concentration, 4, 1, buffer); dustStr.replace(" ", "");
String pressureStr = dtostrf(pressure, 4, 1, buffer); pressureStr.replace(" ", "");
String temperature1Str = dtostrf(temperature1, 4, 1, buffer); temperature1Str.replace(" ", "");
updateSensors(luminanceStr, humidityStr, temperatureStr, uvStr, dustStr, pressureStr, temperature1Str);
Serial.print("Aguarde ");
Serial.print(delay_time / 1000);
Serial.println("s para próxima amostragem");
Serial.println();
delay(delay_time);
Serial.println();
Serial.print("Amostragem (");
Serial.print(sampletime_ms / 1000);
Serial.println("s)...");
starttime = millis();
}
}
void updateSensors(String luminanceStr, String humidityStr, String temperatureStr, String uvStr, String dustStr, String pressureStr, String temperature1Str) {
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
monitor.println(cmd);
delay(2000);
cmd = GET;
cmd += luminanceStr;
cmd += "&field2=";
cmd += humidityStr;
cmd += "&field3=";
cmd += temperatureStr;
cmd += "&field4=";
cmd += uvStr;
cmd += "&field5=";
cmd += dustStr;
cmd += "&field6=";
cmd += pressureStr;
cmd += "&field7=";
cmd += temperature1Str;
cmd += "\r\n";
delay(1000);
int strsize = cmd.length();
monitor.println("AT+CIPSEND=" + String(strsize));
delay(2000);
monitor.print(cmd);
if (monitor.find("OK")) {
Serial.println("Transmissão concluída com sucesso");
} else {
Serial.println("Falha na transmissão!");
}
}
void sendDebug(String cmd) {
Serial.print("SEND: ");
Serial.println(cmd);
monitor.println(cmd);
}
boolean connectWiFi() {
Serial.println("Conectando Wi-Fi...");
String cmd = "AT+CWMODE=1";
monitor.println(cmd);
delay(2000);
monitor.flush();
cmd = "AT+CWJAP=\"";
cmd += SSID;
cmd += "\",\"";
cmd += PASS;
cmd += "\"";
monitor.println(cmd);
delay(5000);
if (monitor.find("OK")) {
Serial.println("Conexão bem-sucedida!");
return true;
} else {
Serial.println("Falha na conexão!");
return false;
}
Serial.println();
}
GitHub - Biblioteca DHT
https://github.com/adafruit/DHT-sensor-library
GitHub - Biblioteca BMP085
https://github.com/adafruit/Adafruit-BMP085-Library
Processo de manufatura
- Construa Estação Meteorológica Raspberry Pi que Envia Dados Diários por Email
- Robô de Detecção Humana Baseado em Arduino Uno: Integração de Sensores Passo a Passo
- Sensor K30 CO₂: Monitoramento de Qualidade do Ar Interno em Tempo Real
- Construa um Estadiómetro Digital: Acompanhe a Altura com Arduino e Sensor a Laser
- Servidor Web Arduino Uno WiFi: Controle LED via Navegador
- Construa uma Calculadora Básica com Arduino UNO – Projeto Fácil
- Construa uma Torre de Sensores com Arduino Cloud: Monitoramento de Temperatura, Movimento e Gás
- Display Portátil de Persistência da Visão com Arduino UNO e ATtiny85
- Estação Meteorológica Arduino Nano: Kit de Sensores e Display OLED
- Estação Inteligente de Monitoramento de Saúde: Arduino, Bluetooth e Sensores