eDOT - Horloge de précision et station météo basée sur Arduino
Composants et fournitures
| Microchip Technology ATMEGA 328P-PU | | × | 1 | |
| | × | 6 | |
| BOSCH BME280 - Carte de dérivation GY-BMEP | | × | 1 | |
| Écran LED à matrice de points 8x8 Adafruit Luckylight - M1603095 | | × | 6 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
Applications et services en ligne
À propos de ce projet
eDOT
est une horloge de précision et une station météo basée sur Arduino avec un récepteur à distance IR intégré et un réglage automatique de la luminosité.
L'appareil a été conçu pour être facilement étendu avec du matériel supplémentaire comme un module WIFI ou autre.
Grâce à ses six écrans LED matriciels 8x8, il peut être utilisé pour afficher de nombreux types d'informations provenant soit du capteur interne, des messages de défilement personnalisés ou sans fil d'Internet (RSS, etc.)
Il a une très faible consommation d'énergie, un design simple et élégant qui combine une face avant en verre et des pièces imprimées en 3D pour le corps.
Le projet est actuellement en cours de développement et je serai mis à jour.
Télécharger des pièces 3D sur Thingiverse
Et voir aussi ma chaîne Youtube pour plus de projets :
https://www.youtube.com/channel/UCbIomyFKzBiLHqEb2xv9GHQ
B.O.M. - N.1 x demi-corps gauche imprimé en 3D
- N.1 x demi-corps droit imprimé en 3D
- N.1 x couverture gauche imprimée en 3D
- N.1 x couverture droite imprimée en 3D
- Prise en charge de l'affichage imprimé N.12 x 3D
- N.1 x Verre bruni 240x75x5 (mm)
- N.6 x Adafruit 8x8 type d'affichage à matrice de points Luckylight M1603095 (Blanc)
- Carte contrôleur N.6 x MAX7219
- N.1 x carte de dérivation USB
- Panneau de dérivation N.1 x BME280
- N.1 x récepteur IR type IRM-56384
- N.1 x photorésistance type LDR-07
- N.1 x ATMEGA328PU (carte personnalisée Arduino)
- Bouton tactile N.6 x OMRON 12mm
PCB eDOTcore
Enfin, j'ai les tout premiers prototypes de la carte de contrôle pour eDOT.
ALLER À la page du projet eDOTcore
Code
- eDOT :station météorologique de précision polyvalente et horloge
eDOT :station météorologique de précision polyvalente et horlogeArduino
// eDOT :Station météo et horloge de précision polyvalente//HISTOIRE// 11/12/2105 Ajout de coefficients d'étalonnage de mesure// 09/06/2016 Ajout de la luminosité de l'affichage automatique// 06/09/2016 Ajout du planificateur de tâches// 08/07/2016 Ajout de l'écran de démarrage eDOT#include #include #include #include #include #include #include #include "RTClib.h"#include Adafruit_BME280 bme ; // I2CRTC_DS3231 rtc;int pinCS =10; // Attachez CS à cette broche, DIN à MOSI et CLK à SCK (cf http://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 5float temp;float tempavg;char tempf[8];float hum;float humavg;char humf[8]; float press;float pressavg;char pressf[8];int screen =0; // écran initiallong précédentLEDMillis =0; // pour l'affichage LED updatelong LEDInterval =5000; // délai entre les écrans int screenMax =5; // nombre maximum de screenbool screenChanged =true; // état de l'écranfloat lightsens;float screenBrt =0;float lightsensavg;Average avetemp(60); //Moyenne pour la température (80 échantillons)Moyenne avehum(60); //Moyenne pour l'humidité (80 échantillons)Average avepress(60); //Moyenne pour la pression (80 échantillons)Average avelightsens(40); //Moyenne pour la pression (80 échantillons)//Coefficients d'étalonnagefloat 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;//correction du capteur de luminositéfloat brt_o =-4;float brt_s =1.35;Schedular Task1;Schedular Task2;void setup() { Task1.start(); Task2.start(); Fil.begin(); // Démarrer I2C bme.begin (0x76); matrice.setIntensity(screenBrt); // Utilisez une valeur entre 0 et 15 pour la luminosité// Ajustez selon vos propres besoins// matrix.setPosition(0, 0, 0); // Le premier affichage est à <0, 0>// matrix.setPosition(1, 1, 0); // Le deuxième affichage est à <1, 0> matrix.setRotation(0, 1); // Ajuster l'orientation de l'affichage matrix.setRotation(1, 1); // Ajuster l'orientation de l'affichage matrix.setRotation(2, 1); // Ajuster l'orientation de l'affichage matrix.setRotation(3, 1); // Ajuster l'orientation de l'affichage matrix.setRotation(4, 1); // Ajuster l'orientation de l'affichage matrix.setRotation(5, 1); // Ajuster l'orientation de l'affichage matrix.setRotation(6, 1); // Ajuster l'orientation de l'affichage matrix.setRotation(7, 1); // Ajuster l'orientation de l'affichage/* matrix.setRotation(8, 1); // Ajuster l'orientation de l'affichage matrix.setRotation(9, 1); // Ajuster l'orientation de l'affichage*/ rtc.begin();// matrix.setRotation(3, 2); // Même prise pour le dernier affichage// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));// rtc.adjust(DateTime(2016, 02, 28, 16, 44, 0)); //Serial.begin(9600);//eDOT SPLASHSCREEN matrice.fillScreen(0); matrice.écrire(); matrice.setCursor(12,0) ; matrice.print("eDOT"); for(screenBrt =0; screenBrt <=15; screenBrt++){delay (25); matrice.setIntensity(screenBrt); // Utilise une valeur entre 0 et 15 pour la luminosité matrix.write(); }retard(250); for(screenBrt =15; screenBrt>=0; screenBrt--){delay(50); matrice.setIntensity(screenBrt); // Utilise une valeur entre 0 et 15 pour la luminosité matrix.write(); }retard(500); matrice.fillScreen(0); matrix.write();delay(1000);}void loop() { Task1.check(acq1,500); Task2.check(acq2,20);} void acq1(){// ACQUISITION DE DONNÉES ET MOYENNE temp =bme.readTemperature(); avetemp.push(temp); tempavg =avetemp.mean(); hum =bme.readHumidity(); avehum.push(hum); humavg =avehum.mean(); appuyez sur =bme.readPressure(); avepress.push(press); pressmoy =avepress.mean(); DateHeure maintenant =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 =contrainte(((lightsensavg /1023 * 15 ) * brt_s + brt_o), 0 , 15); matrice.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; courant long non signéLEDMillis =millis(); //Série.println(screenBrt); if(currentLEDMillis - previousLEDMillis> LEDInterval) // enregistre la dernière fois que vous avez modifié l'affichage { previousLEDMillis =currentLEDMillis; écran++; si (écran> écranMax) écran =0 ; // réinitialiser à l'écran initial une fois le cycle terminé screenChanged =true; }// if (screenChanged) // mise à jour de la mesure lors du changement d'écran// {// screenChanged =false; // réinitialiser pour la prochaine itérationswitch(screen){case TEMPERATURE:dtostrf(temp_lin,4, 2, tempf); // format à cinq chiffres avec deux décimales matrix.setCursor(6,0); matrice.setTextSize(1); matrice.setTextColor(255); matrice.print(tempf); // affiche la matrice de température actuelle.drawRect(37,0,2,2,255); // dessine le symbole de la matrice.setCursor(40,0); matrice.print("C"); matrice.écrire(); // écrit les données actuelles pour afficher matrix.fillScreen(0); // clear displaybreak;case HUMIDITY:dtostrf(hum_lin,4, 2, humf); // format à cinq chiffres avec deux décimales matrix.setCursor(6,0); matrice.setTextSize(1); matrice.setTextColor(255); matrice.print(humf); // affiche la température actuelle matrix.setCursor(37,0) ; matrice.print("%"); matrice.écrire(); // écrit les données actuelles pour afficher matrix.fillScreen(0); // clear displaybreak; case PRESSURE:dtostrf(press_lin,6, 0, pressf); // format à cinq chiffres avec deux décimales matrix.setCursor(0,0); matrice.setTextSize(1); matrice.setTextColor(255); matrice.print(pressf); // affiche la température actuelle matrix.setCursor(37,0) ; matrice.print("Pa"); matrice.écrire(); // écrit les données actuelles pour afficher matrix.fillScreen(0); // effacer displaybreak; case TIME:// dtostrf(press_lin,6, 0, pressf); // format à cinq chiffres avec deux décimales matrix.setCursor(0,0); matrice.setTextSize(1); matrice.setTextColor(255); if (outHour <10){ matrix.print("0"); } matrice.print(outHour,0) ; // affiche les heures courantes matrix.print(":"); if (outMin <10){ matrix.print("0"); } matrice.print(outMin,0) ; // affiche la matrice des minutes en cours.print(":"); if (outSec <10){ matrix.print("0"); } matrice.print(outSec,0) ; // affiche les secondes actuelles matrix.write(); // écrit les données actuelles pour afficher matrix.fillScreen(0); // effacer displaybreak; case DATE:// dtostrf(press_lin,6, 0, pressf); // format à cinq chiffres avec deux décimales matrix.setCursor(0,0); matrice.setTextSize(1); matrice.setTextColor(255); if (outday <10){ matrix.print("0"); } matrix.print(outday,0) ; // affiche les heures courantes matrix.print("/"); if (outmonth <10){ matrix.print("0"); } matrix.print(outmonth,0) ; // affiche les minutes en cours matrix.print("/"); matrice.print(outyear,0) ; // affiche les secondes actuelles matrix.write(); // écrit les données actuelles pour afficher matrix.fillScreen(0); // effacer displaybreak; case DAY:// dtostrf(press_lin,6, 0, pressf); // format à cinq chiffres avec deux décimales matrix.setCursor(15,0); matrice.setTextSize(1); matrice.setTextColor(255); matrix.print(daysOfTheWeek[dow]); matrice.écrire(); // écrit les données actuelles pour afficher matrix.fillScreen(0); // effacer le saut d'affichage ; } }