/*
Claude EMERY 03/03/2025
ESP32 + Oled 0.96 + dht22
DHT22 SDA en D5
Oled 0.96 SSD1306 SDA en D21 / SCL en D22
https://randomnerdtutorials.com/esp32-esp8266-dht-temperature-and-humidity-oled-display/
-------------------------------------------
AFFICHAGE TEXTE LONG DEFILANT SUR OLED
PP le 1/03/2025 - d'apres :weggooier Rsd
https://www.youtube.com/watch?v=sTYPuDMPva8
https://stackoverflow.com/questions/40564050/scroll-long-text-on-oled-display
*/
#include <Wire.h> // Communication avec les périphérique I2C
#include <Adafruit_GFX.h> // Fonction graphique pour Oled
#include <Adafruit_SSD1306.h> // Driver pour ssd1306
#include <Adafruit_Sensor.h> // Drivers pour capteurs Adafruit
#include <DHT.h> // Capteur DHT11-22 - Température - Humidité
#define SCREEN_WIDTH 128 // OLED largeur en pixels
#define SCREEN_HEIGHT 64 // OLED hauteur en pixels
#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); // Configuration du DHTxx
// Declaration SSD1306 Oled I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // SDA en D21 et SCL en D22
//char message[]="Ceci est un message tres long"; // le message qui défilera
int x; // position du curseur sur la ligne défilante
int minX; // position minimale du curseur,fonction de la longueur du message
char longueurAffichage[]="123456789012345678"; // Longueur max de l'affichage Température + Humidité = 18 caracteres
void setup() {
Serial.begin(115200);
dht.begin(); // Activation du DHTxx
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Detection d'erreur d'adresse Oled - Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(200);
display.clearDisplay(); // efface l'afficheur
display.setTextColor(WHITE); // texte en blanc sur fond noir
display.setTextWrap(false); // inhibe le retour a la ligne sur OLED
display.display(); // met a jour l'affichage
x = display.width(); // initialise le curseur a longueur OLED en pixel
//minX = -12 * strlen(message); // 12 = 6 pixels/character * text size 2
minX = -12 * strlen(longueurAffichage); // 12 = 6 pixels/character * text size 2
delay(200);
}
void loop() {
//delay(5000);
float t = dht.readTemperature(); // Lecture temperature
float h = dht.readHumidity(); // Lecture humidité
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!"); // Detection erreur du DHT
}
display.clearDisplay(); // efface l'afficheur
display.setCursor(0,7); // positionne le curseur 7 eme ligne de pixel
display.setTextSize(1); // taille 1 pour le texte statique
display.print("Temperature Humidite"); // Texte "Température Humidité"
// Affichage temperature
display.setTextSize(2); // taille 2 pour le texte défilant
display.setCursor(x,20); // position curseur variable (x) en longueur, 20 pixels en hauteur
display.print(t); // texte défilant - Affichage de la temperature
display.print(" "); // Affichage d'un espace
display.cp437(true); // Driver cp437 pour ° Signe de temperature Celcius
display.setTextSize(1); // Taille 1 pour le °
display.write(167); // Code ascii 167 = °
display.setTextSize(2); // Taille 2 pour le C
display.print("C "); // Affichage du caractere C + 2 espaces
// Affichage humidite
display.print(h); // Affichage de l'huidité
display.print(" %"); // Affichage du caractere %
display.display(); // met a jour l'affichage
x=x-8; // vitesse du défilement: 1 lent, 10 rapide etc.. (Valeur initiale=4)
if(x < minX) x= display.width(); // reinitialisation curseur en x a chaque défilement complet
/*
// affichage sur moniteur série pour compréhension du code
Serial.print("longueur display en pixel: ");
Serial.print(display.width());
Serial.print(" longueur du texte: ");
Serial.print(strlen(message));
Serial.println(" caracteres ");
Serial.print("position curseur (x): ");
Serial.print(x);
Serial.print(" valeur minimum position curseur (minx): ");
Serial.println(minX);
*/
}