Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Horloge Météo Arduino – Affichage en Temps Réel de la Date, Heure, Température et Humidité

Composants et fournitures

Composant Quantité
Arduino UNO 1
Capteur de température et humidité DHT11 (4 broches) 1
Module RTC Maxim Integrated DS3231 1
Résistance 10 kΩ 1
Écran graphique OLED Adafruit 128x64 1
Plaque d'essai (breadboard) 1
Fils de connexion (jumper wires) 15

À propos de ce projet

Avez-vous déjà souhaité créer votre propre interface capable d'afficher l'heure, la date, ainsi que la température et l'humidité ? C'est en réalité beaucoup plus simple qu'il n'y paraît.

Arduino Uno / Nano

Tout d'abord, nous avons besoin d'un microcontrôleur. J'ai utilisé un Arduino Uno pour ce projet, mais un Arduino Nano dispose également de suffisamment de broches.

Capteur DHT11

Le DHT11 est un capteur numérique de température et d'humidité très abordable. Il utilise un capteur d'humidité capacitif et une thermistance pour mesurer l'air ambiant. Le timing des lectures est crucial : il est recommandé d'effectuer une lecture toutes les 2 secondes.

Point important : Après avoir réglé l'heure une fois, assurez-vous de commenter cette ligne de code et de recompiler. Ainsi, le module RTC conservera l'heure, et celle-ci ne sera pas réinitialisée à la valeur de compilation à chaque démarrage.

Module RTC DS3231

Le DS3231 est un module RTC (Real Time Clock), similaire au DS1307 couramment utilisé. Il est peu coûteux et bien plus précis que son homologue DS1307. Il intègre un oscillateur à quartz compensé en température (TCXO) et un quartz. Le dispositif dispose d'une entrée pour pile de secours, maintenant une heure précise même lorsque l'alimentation principale est coupée.

Écran graphique OLED 128x64

L'écran OLED affichera nos données. Cette taille d'écran est compacte et l'affichage est impressionnamment lumineux. L'écran OLED Adafruit peut être contrôlé via interface SPI ou I2C, configurable à l'arrière de l'écran. Vous pouvez utiliser un écran plus abordable (il y en a beaucoup sur eBay), mais veillez à choisir un modèle compatible avec les fichiers d'en-tête utilisés via les bibliothèques Adafruit.

Code

Time_Temp_Humidity_Display.ino

// Salutations utilisateurs de hackster.io !
// Affichage Date, Heure, Température et Humidité
///////////////////////// Pour OLED ////////////////////////
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Si utilisation du SPI logiciel (cas par défaut) :
#define OLED_MOSI 9  // MOSI aka SDA
#define OLED_CLK 10  // CLK aka SCL
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#if (SSD1306_LCDHEIGHT != 64)
#error("Hauteur incorrecte, veuillez corriger Adafruit_SSD1306.h !");
#endif

/////////////////////////////////////////////////////////////
//////////////////////////// Pour DHT ////////////////////////
#include <dht.h>
dht DHT;
#define DHT11_PIN 3
int DHTtimer = 0;
/////////////////////////////////////////////////////////////

//////////////////////////// Pour RTC (DS3231) //////////////////////////
// SDA sur A4, SCL sur A5
#define DS3231_I2C_ADDRESS 0x68

// Conversion décimal vers BCD (Binary Coded Decimal)
byte decToBcd(byte val) {
  return ((val / 10 * 16) + (val % 10));
}

// Conversion BCD vers décimal
byte bcdToDec(byte val) {
  return ((val / 16 * 10) + (val % 16));
}
/////////////////////////////////////////////////////////////

void setup() {
  Wire.begin();
  Serial.begin(9600);
  
  // Régler l'heure initiale ici, puis commenter cette section après le premier upload
  // DS3231 : secondes, minutes, heures, jour_semaine, jour_mois, mois, année
  // setDS3231time(00, 24, 12, 6, 3, 2, 17);
  
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
}

//////////////////////////// Programmation DS3231 //////////////////////////
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // Définir le pointeur sur le registre des secondes
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfWeek));    // 1=Dimanche, 7=Samedi
  Wire.write(decToBcd(dayOfMonth));   // 1 à 31
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));         // 0 à 99
  Wire.endTransmission();
}

void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void displayTime() {
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  // Affichage sur le moniteur série
  Serial.print(hour, DEC);
  Serial.print(":");
  if (minute < 10) Serial.print("0");
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second < 10) Serial.print("0");
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print(" Jour de la semaine: ");
  
  /////////// AFFICHAGE SUR OLED ///////////
  display.setCursor(50, 0);
  display.print(dayOfMonth, DEC);
  display.print(",");
  display.setCursor(91, 0);
  display.print("20");
  display.print(year, DEC);
  
  // Heures
  if (hour < 10) {
    display.setCursor(40, 10);
    display.print("0");
    display.print(hour, DEC);
    display.print(":");
  } else {
    display.setCursor(40, 10);
    display.print(hour, DEC);
    display.print(":");
  }
  
  // Minutes
  if (minute < 10) {
    display.setCursor(58, 10);
    display.print("0");
    display.print(minute, DEC);
    display.print(":");
  } else {
    display.setCursor(58, 10);
    display.print(minute, DEC);
    display.print(":");
  }
  
  // Secondes
  if (second < 10) {
    display.setCursor(75, 10);
    display.print("0");
    display.print(second, DEC);
  } else {
    display.setCursor(75, 10);
    display.print(second, DEC);
  }
  
  /////////// JOUR DE LA SEMAINE ///////////
  switch(dayOfWeek) {
    case 1: Serial.println("Dimanche"); display.setCursor(20, 0); display.print("Dim"); break;
    case 2: Serial.println("Lundi"); display.setCursor(20, 0); display.print("Lun"); break;
    case 3: Serial.println("Mardi"); display.setCursor(20, 0); display.print("Mar"); break;
    case 4: Serial.println("Mercredi"); display.setCursor(20, 0); display.print("Mer"); break;
    case 5: Serial.println("Jeudi"); display.setCursor(20, 0); display.print("Jeu"); break;
    case 6: Serial.println("Vendredi"); display.setCursor(20, 0); display.print("Ven"); break;
    case 7: Serial.println("Samedi"); display.setCursor(20, 0); display.print("Sam"); break;
  }
  
  /////////// MOIS ///////////
  switch(month) {
    case 1: display.setCursor(70, 0); display.print("Jan"); break;
    case 2: display.setCursor(70, 0); display.print("Fév"); break;
    case 3: display.setCursor(70, 0); display.print("Mar"); break;
    case 4: display.setCursor(70, 0); display.print("Avr"); break;
    case 5: display.setCursor(70, 0); display.print("Mai"); break;
    case 6: display.setCursor(70, 0); display.print("Juin"); break;
    case 7: display.setCursor(70, 0); display.print("Juil"); break;
    case 8: display.setCursor(70, 0); display.print("Août"); break;
    case 9: display.setCursor(70, 0); display.print("Sep"); break;
    case 10: display.setCursor(70, 0); display.print("Oct"); break;
    case 11: display.setCursor(70, 0); display.print("Nov"); break;
    case 12: display.setCursor(70, 0); display.print("Déc"); break;
  }
  
  /////////// AIGUILLES DE L'HORLOGE ANALOGIQUE ///////////
  float x1, y1, a, b;
  const float pi = 3.14;
  
  // Aiguille des heures
  a = ((hour - 15) * 30);
  b = (a * pi) / 180;
  x1 = 40 + (9 * cos(b));
  y1 = 41 + (9 * sin(b));
  display.drawLine(40, 41, x1, y1, WHITE);
  
  // Aiguille des minutes
  a = ((minute - 15) * 6);
  b = (a * pi) / 180;
  x1 = 40 + (17 * cos(b));
  y1 = 41 + (17 * sin(b));
  display.drawLine(40, 41, x1, y1, WHITE);
  
  // Aiguille des secondes
  a = ((second - 15) * 6);
  b = (a * pi) / 180;
  x1 = 40 + (19 * cos(b));
  y1 = 41 + (19 * sin(b));
  display.drawLine(40, 41, x1, y1, WHITE);
  
  /////////// ÉLÉMENTS FIXES DE L'HORLOGE ///////////
  display.drawCircle(40, 41, 22, WHITE);
  display.drawCircle(40, 41, 1, WHITE);
  display.drawLine(40, 20, 40, 25, WHITE);   // 12h
  display.drawLine(40, 63, 40, 58, WHITE);   // 6h
  display.drawLine(62, 41, 57, 41, WHITE);   // 3h
  display.drawLine(19, 41, 24, 41, WHITE);   // 9h
  display.drawLine(50, 24, 47, 28, WHITE);   // 1h
  display.drawLine(57, 31, 53, 34, WHITE);   // 2h
  display.drawLine(60, 51, 54, 48, WHITE);   // 4h
  display.drawLine(51, 58, 48, 54, WHITE);   // 5h
  display.drawLine(29, 58, 32, 54, WHITE);   // 7h
  display.drawLine(21, 51, 25, 48, WHITE);   // 8h
  display.drawLine(22, 31, 27, 33, WHITE);   // 10h
  display.drawLine(30, 23, 32, 28, WHITE);   // 11h
}

void ReadTempAndHum() {
  int chk = DHT.read11(DHT11_PIN);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(70, 45);
  display.print("Temp: ");
  display.print(DHT.temperature, 0);
  display.print("C");
  display.setCursor(70, 56);
  display.print("Hum: ");
  display.print(DHT.humidity, 0);
  display.print("%");
  
  Serial.print(" Humidité: ");
  Serial.print(DHT.humidity, 1);
  Serial.print("%");
  Serial.print(" | Température: ");
  Serial.print(DHT.temperature, 1);
  Serial.println("C");
}

void loop() {
  displayTime();
  DHTtimer = DHTtimer + 1;
  
  // Lecture DHT toutes les 2 secondes
  if (DHTtimer > 1) {
    display.fillRect(70, 45, 128, 64, BLACK);
    ReadTempAndHum();
    DHTtimer = 0;
  }
  
  delay(1000);
  display.display();
  
  // Effacement des zones d'affichage heure/date
  display.fillRect(0, 0, 64, 64, BLACK);
  display.fillRect(0, 0, 128, 20, BLACK);
}

Pièces personnalisées et boîtiers

Schémas

Note : Je n'ai pas trouvé l'écran OLED exact sur Fritzing. Pour les connexions des broches de l'OLED, référez-vous aux commentaires dans le code.

Processus de fabrication

  1. Récupérer la date et l'heure actuelles en Python : Guide pratique
  2. Moniteur réseau température et humidité Raspberry Pi — Guide de configuration DIY
  3. Construire un capteur de température distant avec Raspberry Pi et Python – Guide étape par étape
  4. Surveillance transparente température et humidité sur Raspberry Pi avec EzTemp
  5. Construire une station météo de laboratoire connectée en réseau avec Raspberry Pi
  6. Construire un système de surveillance température et lumière multi-capteurs avec Raspberry Pi et DS18B20
  7. Maîtriser la Date et l'Heure en Java : Constructeurs, Méthodes et Bonnes Pratiques
  8. Guide complet sur la date et l'heure en C++
  9. Maîtriser les dates et heures en Python : Guide pratique