eDOT: Relógio de Precisão e Estação Meteorológica Arduino com Controle IR Embutido
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Microchip ATMEGA 328P-PU | 1 |
| MAXIM MAX7219 | 6 |
| BOSCH BME280 - Placa breakout GY-BMEP | 1 |
| Display LED Matrix 8x8 Adafruit Luckylight M1603095 | 6 |
| DS3231 (RTC Clock) | 1 |
| Arduino Nano R3 | 1 |
| Arduino UNO | 1 |
| eDOTcore (PCB personalizada) | 1 |
Ferramentas e Máquinas Necessárias
- Impressora 3D Flashforge Dreamer
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
eDOT
O eDOT é um relógio de precisão e estação meteorológica baseada em Arduino, com receptor IR embutido e ajuste automático de brilho.
O dispositivo foi projetado para ser facilmente expansível com hardware adicional como módulo Wi-Fi ou outros.
Graças aos seus seis displays LED matrix 8x8, pode mostrar muitos tipos de informação vindos de sensores internos, mensagens personalizadas com rolagem ou dados sem fio da internet (RSS, etc).
Possui consumo de energia muito baixo, design simples e elegante que combina face frontal de vidro e partes impressas em 3D para o corpo.
O projeto está em desenvolvimento e será atualizado.
Baixe as peças 3D no Thingiverse.
Veja também meu canal no YouTube para mais projetos:
https://www.youtube.com/channel/UCbIomyFKzBiLHqEb2xv9GHQ
B.O.M. (Lista de Materiais)
- N.1 x Metade esquerda do corpo impressa em 3D
- N.1 x Metade direita do corpo impressa em 3D
- N.1 x Tampa esquerda impressa em 3D
- N.1 x Tampa direita impressa em 3D
- N.2 x Pés impressos em 3D
- N.12 x Suportes de display impressos em 3D
- N.1 x Vidro polido 240x75x5 mm
- N.1 x Filtro laranja
- N.6 x Display LED matrix 8x8 Adafruit tipo Luckylight M1603095 (Branco)
- N.6 x Placa controladora MAX7219
- N.1 x Placa breakout USB
- N.1 x Placa breakout BME280
- N.1 x Chip DS3231
- N.1 x Receptor IR tipo IRM-56384
- N.1 x Fotoresistor tipo LDR-07
- N.1 x ATMEGA328PU (placa Arduino personalizada)
- N.6 x Botão tátil OMRON 12mm
PCB eDOTcore
Finalmente consegui os primeiros protótipos da placa de controle para o eDOT.
Acesse a página do projeto eDOTcore
Código
eDOT: Estação meteorológica versátil e relógio de precisão Arduino
// eDOT: Versatile precision weather station and clock
// HISTÓRICO
// 11/12/2015 Adicionados coeficientes de calibração de medição
// 09/06/2016 Adicionado brilho automático do display
// 09/06/2016 Adicionado agendador de tarefas
// 07/08/2016 Adicionada tela de abertura eDOT
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <Average.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "RTClib.h"
#include <EasyScheduler.h>
Adafruit_BME280 bme; // I2C
RTC_DS3231 rtc;
int pinCS = 10; // CS neste pino, DIN no MOSI e CLK no SCK (cf https://arduino.cc/en/Reference/SPI)
int numberOfHorizontalDisplays = 7;
int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
#define TEMPERATURE 0
#define HUMIDITY 1
#define PRESSURE 2
#define TIME 3
#define DAY 4
#define DATE 5
float temp, tempavg;
char tempf[8];
float hum, humavg;
char humf[8];
float press, pressavg;
char pressf[8];
int screen = 0; // tela inicial
long previousLEDMillis = 0; // para atualização do display LED
long LEDInterval = 5000; // delay entre telas
int screenMax = 5; // número máximo de telas
bool screenChanged = true; // status da tela
float lightsens, screenBrt = 0, lightsensavg;
Average<float> avetemp(60); // Média para temperatura (60 amostras)
Average<float> avehum(60); // Média para umidade (60 amostras)
Average<float> avepress(60); // Média para pressão (60 amostras)
Average<float> avelightsens(40); // Média para sensor de luz (40 amostras)
// Coeficientes de calibração
float temp_o = -1.70;
float temp_s = 1.0;
float temp_lin;
float hum_o = 2.45;
float hum_s = 1.0;
float hum_lin;
float press_o = 0.0;
float press_s = 1.0;
float press_lin;
// Correção sensor de brilho
float brt_o = -4;
float brt_s = 1.35;
Scheduler Task1;
Scheduler Task2;
void setup() {
Task1.start();
Task2.start();
Wire.begin(); // Inicia I2C
bme.begin(0x76);
matrix.setIntensity(screenBrt); // Valor entre 0 e 15 para brilho
// Ajuste conforme necessário
// matrix.setPosition(0, 0, 0); // Primeiro display em <0, 0>
// matrix.setPosition(1, 1, 0); // Segundo display em <1, 0>
matrix.setRotation(0, 1);
matrix.setRotation(1, 1);
matrix.setRotation(2, 1);
matrix.setRotation(3, 1);
matrix.setRotation(4, 1);
matrix.setRotation(5, 1);
matrix.setRotation(6, 1);
matrix.setRotation(7, 1);
/* matrix.setRotation(8, 1);
matrix.setRotation(9, 1); */
rtc.begin();
// matrix.setRotation(3, 2); // O mesmo vale para o último display
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// rtc.adjust(DateTime(2016, 02, 28, 16, 44, 0));
// Serial.begin(9600);
// TELA DE ABERTURA eDOT
matrix.fillScreen(0);
matrix.write();
matrix.setCursor(12, 0);
matrix.print("eDOT");
for (screenBrt = 0; screenBrt <= 15; screenBrt++) {
delay(25);
matrix.setIntensity(screenBrt);
matrix.write();
}
delay(250);
for (screenBrt = 15; screenBrt >= 0; screenBrt--) {
delay(50);
matrix.setIntensity(screenBrt);
matrix.write();
}
delay(500);
matrix.fillScreen(0);
matrix.write();
delay(1000);
}
void loop() {
Task1.check(acq1, 500);
Task2.check(acq2, 20);
}
void acq1() {
// AQUISIÇÃO DE DADOS E MÉDIA
temp = bme.readTemperature();
avetemp.push(temp);
tempavg = avetemp.mean();
hum = bme.readHumidity();
avehum.push(hum);
humavg = avehum.mean();
press = bme.readPressure();
avepress.push(press);
pressavg = avepress.mean();
DateTime now = rtc.now();
outSec = now.second();
outMin = now.minute();
outHour = now.hour();
outday = now.day();
outmonth = now.month();
outyear = now.year() - 2000;
dow = now.dayOfTheWeek();
}
void acq2() {
lightsens = analogRead(A3);
avelightsens.push(lightsens);
lightsensavg = avelightsens.mean();
screenBrt = constrain(((lightsensavg / 1023 * 15) * brt_s + brt_o), 0, 15);
matrix.setIntensity(screenBrt);
// LINEARIZAÇÃO DOS DADOS
temp_lin = tempavg * temp_s + temp_o;
hum_lin = humavg * hum_s + hum_o;
press_lin = pressavg * press_s + press_o;
unsigned long currentLEDMillis = millis();
// Serial.println(screenBrt);
if (currentLEDMillis - previousLEDMillis > LEDInterval) {
previousLEDMillis = currentLEDMillis;
screen++;
if (screen > screenMax) screen = 0;
screenChanged = true;
}
switch (screen) {
case TEMPERATURE:
dtostrf(temp_lin, 4, 2, tempf);
matrix.setCursor(6, 0);
matrix.setTextSize(1);
matrix.setTextColor(255);
matrix.print(tempf);
matrix.drawRect(37, 0, 2, 2, 255); // símbolo de grau
matrix.setCursor(40, 0);
matrix.print("C");
matrix.write();
matrix.fillScreen(0);
break;
case HUMIDITY:
dtostrf(hum_lin, 4, 2, humf);
matrix.setCursor(6, 0);
matrix.setTextSize(1);
matrix.setTextColor(255);
matrix.print(humf);
matrix.setCursor(37, 0);
matrix.print("%");
matrix.write();
matrix.fillScreen(0);
break;
case PRESSURE:
dtostrf(press_lin, 6, 0, pressf);
matrix.setCursor(0, 0);
matrix.setTextSize(1);
matrix.setTextColor(255);
matrix.print(pressf);
matrix.setCursor(37, 0);
matrix.print("Pa");
matrix.write();
matrix.fillScreen(0);
break;
case TIME:
matrix.setCursor(0, 0);
matrix.setTextSize(1);
matrix.setTextColor(255);
if (outHour < 10) matrix.print("0");
matrix.print(outHour);
matrix.print(":");
if (outMin < 10) matrix.print("0");
matrix.print(outMin);
matrix.print(":");
if (outSec < 10) matrix.print("0");
matrix.print(outSec);
matrix.write();
matrix.fillScreen(0);
break;
case DATE:
matrix.setCursor(0, 0);
matrix.setTextSize(1);
matrix.setTextColor(255);
if (outday < 10) matrix.print("0");
matrix.print(outday);
matrix.print("/");
if (outmonth < 10) matrix.print("0");
matrix.print(outmonth);
matrix.print("/");
matrix.print(outyear);
matrix.write();
matrix.fillScreen(0);
break;
case DAY:
matrix.setCursor(15, 0);
matrix.setTextSize(1);
matrix.setTextColor(255);
matrix.print(daysOfTheWeek[dow]);
matrix.write();
matrix.fillScreen(0);
break;
}
}
Processo de manufatura
- Estação Meteorológica Solar DIY com Raspberry Pi
- Construindo Estação Meteorológica Externa com Raspberry Pi 2 e ADS‑WS1
- Estação Meteorológica Avançada v2.0: Monitoramento em Tempo Real de Temperatura, Pressão, Umidade e Altitude
- Relógio POV com Arduino: Construa um Display LED de Persistência de Visão
- Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
- Monitor de Temperatura e Relógio Tempo Real com Arduino Due e Display TFT 3.2"
- Estação Meteorológica Portátil Arduino por $10 – DIY com Nano, DHT22, BMP180 e LCD
- Autômatos Celulares em Tempo Real no Arduino com Display OLED 128x64
- Monitoramento Meteorológico em Tempo Real com Arduino e ThingSpeak IoT
- Sistema de Presença em Tempo Real com RFID, Arduino e Google Sheets