eDOT : Horloge Arduino précise et station météo avec télécommande IR intégrée
Composants et fournitures
| Composant | Quantité |
|---|---|
| Microchip ATMEGA 328P-PU | 1 |
| MAXIM MAX7219 | 6 |
| BOSCH BME280 (carte breakout GY-BMEP) | 1 |
| Afficheur LED matrice 8x8 Adafruit Luckylight M1603095 | 6 |
| DS3231 (horloge temps réel RTC) | 1 |
| Arduino Nano R3 | 1 |
| Arduino UNO | 1 |
| eDOTcore (carte de contrôle personnalisée) | 1 |
Outils et machines nécessaires
- Imprimante 3D Flashforge Dreamer
Applications et services en ligne
- Arduino IDE
À propos de ce projet
eDOT
eDOT est une horloge de précision et une station météo basées sur Arduino, avec récepteur IR intégré et réglage automatique de la luminosité.
- Conçu pour être facilement extensible (module Wi-Fi, etc.).
- Ses six matrices LED 8x8 permettent d'afficher de nombreux types d'informations : capteurs internes, messages défilants personnalisés, ou données sans fil depuis Internet (flux RSS, etc.).
- Très faible consommation, design simple et élégant combinant façade en verre et corps en pièces 3D imprimées.
- Projet en cours de développement, mis à jour régulièrement.
Téléchargez les pièces 3D sur Thingiverse.
Voir aussi ma chaîne YouTube pour d'autres projets : youtube.com/channel/UCbIomyFKzBiLHqEb2xv9GHQ
Nomenclature (B.O.M.)
- 1 × Demi-corps gauche imprimé 3D
- 1 × Demi-corps droit imprimé 3D
- 1 × Couvercle gauche imprimé 3D
- 1 × Couvercle droit imprimé 3D
- 2 × Pieds imprimés 3D
- 12 × Supports d'affichage imprimés 3D
- 1 × Verre brunis 240×75×5 mm
- 1 × Filtre orange
- 6 × Afficheurs matrice 8x8 Adafruit Luckylight M1603095 (blanc)
- 6 × Cartes contrôleur MAX7219
- 1 × Carte breakout USB
- 1 × Carte breakout BME280
- 1 × Puce DS3231
- 1 × Récepteur IR type IRM-56384
- 1 × Photorésistance type LDR-07
- 1 × ATMEGA328PU (carte Arduino personnalisée)
- 6 × Boutons tactiles OMRON 12 mm
Carte PCB eDOTcore
J'ai enfin reçu les premiers prototypes de la carte de contrôle pour eDOT.
Aller à la page du projet eDOTcore
Code
eDOT : Station météo polyvalente et horloge de précision Arduino
// eDOT: Versatile precision weather station and clock
// HISTORIQUE
// 11/12/2105 Ajout coefficients d'étalonnage
// 09/06/2016 Luminosité automatique
// 09/06/2016 Ordonnanceur de tâches
// 07/08/2016 Écran de démarrage 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 sur cette broche, DIN sur MOSI, CLK sur SCK (cf 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;
long previousLEDMillis = 0;
long LEDInterval = 5000;
int screenMax = 5;
bool screenChanged = true;
float lightsens, screenBrt = 0, lightsensavg;
Average<float> avetemp(60);
Average<float> avehum(60);
Average<float> avepress(60);
Average<float> avelightsens(40);
// Coefficients d'étalonnage
float temp_o = -1.70, temp_s = 1.0, temp_lin;
float hum_o = 2.45, hum_s = 1.0, hum_lin;
float press_o = 0.0, press_s = 1.0, press_lin;
float brt_o = -4, brt_s = 1.35;
Schedular Task1;
Schedular Task2;
void setup() {
Task1.start(); Task2.start();
Wire.begin();
bme.begin(0x76);
matrix.setIntensity(screenBrt); // 0-15
// Orientation des 8 afficheurs (0 à 7)
for (int i = 0; i < 8; i++) matrix.setRotation(i, 1);
rtc.begin();
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Décommenter pour régler l'heure
// Écran de démarrage 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() {
// ACQUISITION ET MOYENNAGE
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.0 * 15) * brt_s + brt_o), 0, 15);
matrix.setIntensity(screenBrt);
// LINÉARISATION DES DONNÉES
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();
if (currentLEDMillis - previousLEDMillis > LEDInterval) {
previousLEDMillis = currentLEDMillis;
screen++;
if (screen > screenMax) screen = 0;
screenChanged = true;
}
// if (screenChanged) { screenChanged = false; ... }
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); 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;
}
}
Processus de fabrication
- Station météo solaire DIY avec Raspberry Pi
- Construction d'une station météo extérieure avec Raspberry Pi 2 et ADS‑WS1
- Station météo avancée v2.0 : Surveillance en temps réel de température, pression, humidité et altitude
- Horloge POV Arduino : Construire un affichage LED à persistance rétinienne
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
- Station Météo Arduino Portable à 10$ – Nano, DHT22, BMP180 et LCD
- Automates Cellulaires Temps Réel sur Arduino avec Écran OLED 128x64
- Station météo IoT temps réel – Arduino, ESP8266, DHT11 & ThingSpeak