Arduino, DHT22 et écran OLED 128*64
Capteur de température et humidité, avec affichage sur un petit écran LCD.
Suite à mon article précédent sur l’écran OLED 0,96″ 128*64, j’ai ajouté sur mon Uno une sonde DHT22 afin de faire des relevés de température et d’humidité, puis de les afficher sur le petit écran.
L’afficheur OLED possède 4 connecteurs :
- VCC
- GND
- SCL
- SDA
Pour la sonde de température et humidité :
- + (positif)
- out (données)
- – (négatif)
Aussi bien le DHT22 que l’afficheur peuvent être alimentés en 3,3V comme en 5V, on a donc le choix avec l’Uno qui possède deux connecteurs 5V et un 3,3V !
J’ai donc connecté l’afficheur ainsi :
- VCC sur 3,3V
- GND sur GND
- SCL sur SCL
- SDA sur SDA
Pour la sonde :
- + sur 5V
- – sur GND
- out sur le port 6
Résultat, presque bien :
Ah, l’UTF-8 vient nous embêter même ici 🙂
Une solution est de remplacer dans le code les caractères non standards (comme les accents, ou le signe “degré”) par leur code hexadécimal, comme indiqué dans le tableau suivant.
Pour obtenir “é” on prend donc l’avant-dernière ligne, puis on commence à 0xe0, puis on compte de 0 à 9 puis A à F (c’est de l’hexadécimal…) ce qui nous donne Oxe9.
La ligne suivante :
u8g.print("Humidité: " + String(charhumidite) + "%");
va devenir :
u8g.print("Humidit" "\xe9" ": " + String(charhumidite) + "%");
Une autre solution est de recompiler l’IDE Arduino en mode UTF-8. Un peu moins évident…
Voici le code modifié :
#include "U8glib.h" #include <dht.h> U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); dht DHT; float temperature; float humidite; #define DHT22_PIN 6 void draw(float temperature, float humidite) { char chartemperature[10]; char charhumidite[10]; u8g.setFont(u8g_font_unifont); dtostrf(temperature, 4, 1, chartemperature); dtostrf(humidite, 4, 1, charhumidite); u8g.setPrintPos(0, 22); u8g.print("Temp. : " + String(chartemperature) + "\xb0" "C"); u8g.setPrintPos(0, 44); u8g.print("Humidit" "\xe9" ": " + String(charhumidite) + "%"); } void setup(void) { // assign default color value if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); // max intensity } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); // pixel on } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255,255,255); } } void loop(void) { int chk = DHT.read22(DHT22_PIN); // READ DATA humidite = DHT.humidity; temperature = DHT.temperature; delay(1000); u8g.firstPage(); do { draw(temperature, humidite); } while( u8g.nextPage() ); // rebuild the picture after some delay delay(50); }
Si vous voulez le commander :
Ecran OLED 0.96″ 128X64 blanc pour Arduino
DHT22 Digital Temperature and Humidity Sensor AM2302 Module+PCB with Cable
Petite modification du code, qui ne marchait pas.
J’ai rajouté la ligne 42:
int chk = DHT.read22(DHT22_PIN);
Sans ça, les données ne sont pas lues sur le capteur.
Aussi, la précision des données est de 1/10ème de degré et 0,1% d’humidité, donc nul beoin d’afficher deux chiffres après la virgule 🙂
Je n’ai pas compris ou brancher les broches SCL et SDA sur l’arduino ????
Je branche SCL et SDA sur les ports SCL et SDA de l’aduino Uno.
On les voit sur cette image, en haut à gauche :
http://www.electroschematics.com/wp-content/uploads/2013/01/Arduino-Uno-R3-Pinouts.png
Bonjour,
Vous m’avez sauvé “la vie” en m’expliquant comment mettre des accents sur les “e”; Merci;
Deux soucis toutefois. Un- si je fais \oxb7 j’obtiens bien un point (1 pixel) en hauteur. Si je fais \x2E j’obtiens non pas un point de 1 pixel mais une croix de 5 pixels !!!! Pourquoi ou alors où est le point ?
Deux- je voudrais placer ce point de 1 pixel en séparateur décimal de coordonnées géographiques en degrés décimaux. (ex 45.14587). Actuellement mon écran 128×64 me fait une croix de 5 pixels idem que ci-dessus. Si !!! vous me donnez la solution pour avoir un vrai point comment l’insérer dans ma coordonnée.
Merci.
1. Je n’ai pas testé le caractère \0x2e, je ne sais pas ce que ça donne sur l’écran… Mais pour le point, pourquoi ne pas taper un point normal (.) au clavier ?
2. là sans le code je ne sais pas trop. J’ai l’impression qu’il s’agit simplement de manipulation de chaîne de caractères.
De retour,
J’ai avancé un peu …
La police u8g.setFont(u8g_font_6x10); ne fait pas le point mais une croix même tapé au clavier. La police font_6x12 fait bien le point en 4 pixels carrés. Donc j’utilise cette police et c’est parfait.
Le problème est aussi réglé pour le point décimal. En fait si la police 6×10 faisait ce point la combine aurait été de trouver une méthode pour insérer ce point entre deux parties d’un nombre décimal comme 43.56987
je pense que c’est faisable avec un peu de sport mais l’affaire est réglée et bien réglée…
Encore merci
Avec plaisir 🙂
Pour info, on trouve toutes les fonts disponibles dans le Wiki du projet u8glib :
https://github.com/olikraus/u8glib/wiki
Pour mon exemple, j’ai utilisé une fonte du groupe Unifont:
https://github.com/olikraus/u8glib/wiki/fontgroupunifont