Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

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

Aplicativos e Serviços Online

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.

eDOT: Relógio de Precisão e Estação Meteorológica Arduino com Controle IR Embutido
eDOT: Relógio de Precisão e Estação Meteorológica Arduino com Controle IR Embutido

Veja também meu canal no YouTube para mais projetos:

https://www.youtube.com/channel/UCbIomyFKzBiLHqEb2xv9GHQ

B.O.M. (Lista de Materiais)

PCB eDOTcore

Finalmente consegui os primeiros protótipos da placa de controle para o eDOT.

Acesse a página do projeto eDOTcore

eDOT: Relógio de Precisão e Estação Meteorológica Arduino com Controle IR Embutido

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

  1. Estação Meteorológica Solar DIY com Raspberry Pi
  2. Construindo Estação Meteorológica Externa com Raspberry Pi 2 e ADS‑WS1
  3. Estação Meteorológica Avançada v2.0: Monitoramento em Tempo Real de Temperatura, Pressão, Umidade e Altitude
  4. Relógio POV com Arduino: Construa um Display LED de Persistência de Visão
  5. Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
  6. Monitor de Temperatura e Relógio Tempo Real com Arduino Due e Display TFT 3.2"
  7. Estação Meteorológica Portátil Arduino por $10 – DIY com Nano, DHT22, BMP180 e LCD
  8. Autômatos Celulares em Tempo Real no Arduino com Display OLED 128x64
  9. Monitoramento Meteorológico em Tempo Real com Arduino e ThingSpeak IoT
  10. Sistema de Presença em Tempo Real com RFID, Arduino e Google Sheets