/*
* Claude EMERY 07/03/2025
* Affichage Date/Heure depuis serveur NTP & température/humidité
* Sur afficheur Oled 0.96" avec Adafruit_SSD1306.h
* Arduino Nano + Oled 0.96 + dht22
* DHT22 SDA en D5
* Oled 0.96 SSD1306 SDA en A4/SCL en A5
* Ajout Bouton-poussoir en D2
* Pour une tempo d'affichage de quelques secondes
* FONCTIONNEMENT:
* Power On = Oled éteint
* Appuyer bouton-poussoir = Affichage Température/Humidité durant 5 secondes
* Puis Effacement Oled
* Appuyer bouton-poussoir pour ré-afficher la température/humidité
* etc ...
**********************************************************************
* ATTENTION
* Si erreur: avrdude: ser_open(): can't set com-state for "\\.\COM3"
* Solution: Re-installer le CH341SER.EXE
**********************************************************************
*/
// Librairies
#include <Wire.h> // Gestion I2C pour Oled SDA / SCL
#include <Adafruit_GFX.h> // Affichage graphique
#include <Adafruit_SSD1306.h> // Driver Oled 0.96" - SSD1306
#include <Adafruit_Sensor.h> // Sensor Adafruit
#include <DHT.h> // DHT22-DHT11
// Configuration OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // SDA=A4 SCL=A5
//Configuration DHT
#define DHTPIN 5 // DHT22 en D5
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE); // Initialisation du DHT
//Configuration Bouton Poussoir
const int buttonPin = 2; // Broche du bouton poussoir en D2
//Configuration du timer
unsigned long timer = 0; // Stocke le temps de début
#define vert 10
#define orange 11
#define rouge 12
void setup() {
Serial.begin(9600);
// Définition du Bouton Poussoir - Utilisation de la résistance interne de pull
pinMode(buttonPin, INPUT_PULLUP);
pinMode(vert, OUTPUT);
pinMode(orange, OUTPUT);
pinMode(rouge, OUTPUT);
// Demarrage du DHT
dht.begin();
// Initialisation de l'écran OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Échec de l'initialisation de l'écran OLED !");
for (;;);
display.display();
display.clearDisplay();
}
delay(1000);
}
void loop() {
float t = dht.readTemperature(); // Lecture temperature
float h = dht.readHumidity(); // Lecture humidité
// Led OFF inférieur à 20°
if (t<20){
digitalWrite(vert,0);
digitalWrite(orange,0);
digitalWrite(rouge,0);
}
// Led Verte ON superieur à 20°
if (t>20){
digitalWrite(vert,1);
digitalWrite(orange,0);
digitalWrite(rouge,0);
}
// Led Orange ON superieur à 25
if (t>25){
digitalWrite(vert,0);
digitalWrite(orange,1);
digitalWrite(rouge,0);
}
// Led Rouge ON superieur à 30°
if (t>30){
digitalWrite(vert,0);
digitalWrite(orange,0);
digitalWrite(rouge,1);
}
if (isnan(h) || isnan(t)) { // Si h ou t sont faux (isnan) = affichage message d'erreur
Serial.println("Failed to read from DHT sensor!"); // Detection erreur du DHT
}
// Effacer l'écran et définition de la taille des caractéres
display.clearDisplay(); // Effacement de l'afficheur
display.setTextColor(WHITE); // Couleur du texte en BLANC
// Test état Bouton Poussoir
if (digitalRead(buttonPin) == LOW) { // Si bouton pressé (LOW car pull-up activé)
// Preparation de l'affichage température
display.setCursor(0,0); // Position du curseur - colonne 0 et ligne 0
display.setTextSize(1);
display.print("---- Temp");
display.cp437(true);
display.write(130); // Caractere é
display.print("rature ----");
display.setCursor(35,11); // Position du curseur - colonne 35 et ligne 11 - Affichage avec 2 chiffres apres la virgule, mettre (28,49)
display.setTextSize(2);
display.print(t,1); // Affichage du contenu de la variable t - (t,1) = Affichage 1 chiffre apres la virgule
display.setTextSize(1);
display.print(" ");
display.cp437(true); // Driver cp437 pour ° Signe de temperature Celcius
display.write(167); // code cp437 167 = °
display.print("C");
// Preparation de l'affichage humidité
display.setCursor(0, 37); // Position du curseur - colonne 0 et ligne 37
display.setTextSize(1);
display.print("----- Humidit");
display.cp437(true);
display.write(130); // Caractere é
display.print(" ------");
display.setCursor(35, 49); // Position du curseur - colonne 35 et ligne 49 - Affichage avec 2 chiffres apres la virgule, mettre (28,49)
display.setTextSize(2);
display.print(h,1); // Affichage du contenu de la variable h - (h,1) = Affichage 1 chiffre apres la virgule
display.setTextSize(1);
display.print(" %");
display.display();
delay(1000); // Mise à jour chaque seconde
timer = millis(); // Démarre le chrono
}
// Vérifie si les 05 secondes se sont écoulées et efface l'Oled
if (millis() - timer >= 5000) {
display.clearDisplay();
display.display();
}
}