TFT 2,8'' Affichage Heure Jour Date Température Humidité +Bip Horaire

Bonjour , voici mon dernier petit montage :

Le but c'est d'afficher :

L'heure avec un bip qui retenti chaque heures
Le jour en toutes lettres
La Date
L'humidité
La temperature

Pour connecter l’écran sur l'arduino rien de compliquer il faut superposer les bornes + 3v3 +5v et GND face à celles du ARDUINO MEGA.

Le buzzer est connecter entre GND et 18
Le DS3231 est connecter entre GND +5V 20 21
Le DHT22 est connecter entre GND +5V et 19

Merci à J-M-L et KAMILL pour leurs aides précieuse

voici le code :

//Afficher Heure/date/jour/temperature/humidité
//sur un TFT VMA412 2,8'' VELLEMAN
// Carte ARDUINO MEGA - DS3231 -DHT22 (artnow2017)
//Programme libre de droit 
#include <Adafruit_GFX.h>    // Bibliothèque graphique de base
#include <Adafruit_TFTLCD.h> // Bibliothèque spécifique au matériel
#include "Wire.h"
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include "DHT.h"   // Librairie des capteurs DHT
#define DHTPIN 19    //pin sur lequel est branché le DHT
#define DHTTYPE DHT22      // DHT 22  (AM2302)

#define DS3231_I2C_ADDRESS 0x68
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

//Affecte des noms lisibles par l'utilisateur à des valeurs de couleur 16 bits courantes:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF


DHT dht(DHTPIN, DHTTYPE);

unsigned long testText() {


}
// Convertir les nombres décimaux normaux en décimal codé binaire
byte decToBcd(byte val)
{
  return ( (val / 10 * 16) + (val % 10) );
}
// Convertir les décimales codées binaires en nombres décimaux normaux
byte bcdToDec(byte val)
{
  return ( (val / 16 * 10) + (val % 16) );
}

void setup(void) {
  dht.begin();
  Wire.begin();

  tft.begin(0x7783);
  tft.setRotation(1);
  tft.fillScreen(BLACK);
  // régler l'heure initiale ici:
  // DS3231 secondes, minutes, heure, jour, date, mois, année
  //enlever les // en ligne 59 pour envoyer la mise à jour date et heure et les remetre apres le téléversement
//setDS3231time(00,8,18,1,3,12,17);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year)
{
  // Définit les données d'heure et de date sur DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // définir la prochaine entrée pour commencer au registre des secondes
  Wire.write(decToBcd(second)); // régler secondes
  Wire.write(decToBcd(minute)); // régler minutes
  Wire.write(decToBcd(hour)); // régler heure
  Wire.write(decToBcd(dayOfWeek)); // définir le jour de la semaine (1=dimanche, 7=Samedi)
  Wire.write(decToBcd(dayOfMonth)); // régler la date (1 to 31)
  Wire.write(decToBcd(month)); // régler mois
  Wire.write(decToBcd(year)); // régler année (0 to 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); // Réglez le pointeur de registre DS3231 sur 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);

  // demande sept octets de données à partir de DS3231 à partir du registre 00h
  *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;
  // recupération des données depuis le DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  // transfert ver ecran tft

  unsigned long start = micros();


  tft.setCursor(20, 1);

  tft.setTextSize(6);
  tft.setTextColor(GREEN, BLACK);
    if (hour < 10)tft.print("0");//ajout d'un zéro devant si inferieure à 10  
    tft.println(hour, DEC);
 
  tft.setCursor(90, 1);
  tft.print(":");
  if (minute < 10)tft.print("0");//ajout d'un zéro devant si inferieure à 10 
  tft.print(minute, DEC);
  
  tft.print(":");
  if (second < 10) tft.print("0");//ajout d'un zéro devant si inferieure à 10 
  //Bip toutes les heures quand minute + heure =118 (59min+59s)
  //le buzzer enttre GND et la borne 18 
  //la note et tonalité sont modifiable : 1440 et 220 !!
   if (second + minute ==118) tone(18, 1440, 200);

  tft.print(second, DEC);
  tft.setTextSize(3);
  tft.setTextColor(YELLOW, BLACK);
  tft.setCursor(90, 90);
  if (dayOfMonth < 10)tft.print("0");
  tft.print(dayOfMonth, DEC);

  tft.print("/");
  if (month < 10)tft.print("0");
  tft.print(month, DEC);
  tft.print("/");
  tft.print(year, DEC);
  tft.setCursor(90, 60);
  tft.setTextColor(YELLOW, BLACK);
  tft.setTextSize(3);
  switch (dayOfWeek) {
    case 1:
      tft.println("Dimanche");
      break;
    case 2:
      tft.println("Lundi   ");
      break;
    case 3:
      tft.println("Mardi   ");
      break;
    case 4:
      tft.println("Mercredi");
      break;
    case 5:
      tft.println("Jeudi   ");
      break;
    case 6:
      tft.println("Vendredi");
      break;
    case 7:
      tft.println("Samedi  ");
      break;


  }
}

void loop(void) {

  // Lecture du taux d'humidité
  float h = dht.readHumidity();
  // Lecture de la température en Celcius
  float t = dht.readTemperature();
  // Pour lire la température en Fahrenheit
  float f = dht.readTemperature(true);
  float hi = dht.computeHeatIndex(f, h);


  displayTime(); //afficher les données d'horloge ,
  //et temperature/humidité en temps réel sur TFT

  tft.setTextSize(4);
  tft.setTextColor(WHITE, BLACK);
  tft.setCursor(00, 130);
  tft.print("H:");     tft.print(h, 1);

  tft.setTextColor(CYAN, BLACK);
  tft.setCursor(90, 170);
  tft.setTextSize(4);
  tft.print("T:");
  tft.setTextSize(7);
  tft.print(t, 1);

}

vma412_back.jpg

1 Like

bonjour ARTNOW j'ai un projet de régulation de température d'une cave à vins et du contrôle de la température de l'air d'admission et celle du caisson de la climatisation.
(voir dans le forum français"/Faire une régulation de température avec des DS18B20 et un PID en tout ou rien")

J'utilise des DS18B20 avec lesquels j'ai des soucis de mesure. Mesure toutes les 15s et variations qui peuvent attendre jusqu'à 0.25°C. Je récupère le 1/10e comme toi.
C'est donc difficile de gérer.

Quelle est la précision du DHT22 ?...

Ton projet me donne l'idée d'utiliser ce DHT22 dans la cave car je pourrais récupérer le taux d'humidité ce qui est intéressant pour une cave.

MErci de ton aide.

AIRPOPCIE:
bonjour ARTNOW j'ai un projet de régulation de température d'une cave à vins et du contrôle de la température de l'air d'admission et celle du caisson de la climatisation.
(voir dans le forum français"/Faire une régulation de température avec des DS18B20 et un PID en tout ou rien")

J'utilise des DS18B20 avec lesquels j'ai des soucis de mesure. Mesure toutes les 15s et variations qui peuvent attendre jusqu'à 0.25°C. Je récupère le 1/10e comme toi.
C'est donc difficile de gérer.

Quelle est la précision du DHT22 ?...

Ton projet me donne l'idée d'utiliser ce DHT22 dans la cave car je pourrais récupérer le taux d'humidité ce qui est intéressant pour une cave.

MErci de ton aide.

Bonjour AIRPOPCIE , j'ai moi même fait des montage avec le DS18B20 , je pense effectivement que pour ta cave , l’idéal est d'utiliser le DHT22 , il est très précis et l'humidité dans une cave c'est important de la contrôler .

Regarde le DATASHEET ICI tu verras les spécifications !

Tu verras aussi que dans le DHT22 il y a un DS18B20 !!

Bon courage pour ton projet . :wink:

Merci ARTNOW je ne viens de voir ta réponse qu'à l'instant.
Je viens de commander en 2 commandes le DTH22 pour ne pas payer de port (si tu commande 2 d'un coup c'est port payant alors que 2 commandes de 1 pièce port gratuit HI).

Peux tu me mettre ton code concernant les lectures de T° et H telle que tu les fais et me dire quelle précision (sur la T°) tu obtiens.

En attendant la réception des "bêtes" je vais modifier l'affichage pour y rajouter l'humidité.

Merci de ton aide.
A+ M le PoP

AIRPOPCIE:
Merci ARTNOW je ne viens de voir ta réponse qu'à l'instant.
Je viens de commander en 2 commandes le DTH22 pour ne pas payer de port (si tu commande 2 d'un coup c'est port payant alors que 2 commandes de 1 pièce port gratuit HI).

Peux tu me mettre ton code concernant les lectures de T° et H telle que tu les fais et me dire quelle précision (sur la T°) tu obtiens.

En attendant la réception des "bêtes" je vais modifier l'affichage pour y rajouter l'humidité.

Merci de ton aide.
A+ M le PoP

Salut AIRPOCIE , pour le code regarde le 1er message il est dedans , pour la précision franchement elle est très bonne , j'ai comparer avec un thermomètre professionnel , qui est étalonné par des pros tout les ans (je suis frigoriste donc obligé d'avoir des outils précis).
a+

Merci ARTNOW une question j'ai commandé des DTH22 es ce qu'il fonctionne avec ton code et la bibli DTH.h

Ps: je vais faire "tourner" un morceau de code extrait du tien pour:
Faire la mesure de T° et H
l'afficher sur mon J20004A.
J'utilise déjà un DS3231 je vais pouvoir y rajouter la mise à l'heure.
Jusque là je connectai le DS3231 sur une carte dédiée à l'horloge, avec mise à l'heure par les boutons merdiques ( des rebonds .plusieurs secondes ou heures par appui) une horreur.

Merci de ton aide.

AIRPOPCIE:
Merci ARTNOW une question j'ai commandé des DTH22 es ce qu'il fonctionne avec ton code et la bibli DTH.h

Ps: je vais faire "tourner" un morceau de code extrait du tien pour:
Faire la mesure de T° et H
l'afficher sur mon J20004A.

J'utilise déjà un DS3231 je vais pouvoir y rajouter la mise à l'heure.
Jusque là je connectai le DS3231 sur une carte dédiée à l'horloge, avec mise à l'heure par les boutons merdiques ( des rebonds .plusieurs secondes ou heures par appui) une horreur.

Merci de ton aide.

Bonjour , AIRPOCIE , oui pour le DHT22 pas de soucis , j'utilise celui-ci pour mon montage ,pas de soucis .

a+

ARTNOW:
Bonjour , AIRPOCIE , oui pour le DHT22 pas de soucis , j'utilise celui-ci pour mon montage ,pas de soucis .

a+

OK merci je te tiens au courant (234V ici) de mes investigations lorsque j'aurai reçu les bêtes.
A+

Salut ARTNOW,
je me lance dans mon premier projet.

j'ai le meme ecran VMA412- et Mega2560,

je commence à maitriser le touchscreen et l'ecran graphique.
mais voici 2 jours que j'essaye d'activer la carte SD.

j'ai toujours un code d'erreur. utilisation d'ne carte micro SDHC 8GB-class10.
vu que cette carte semble brancher la SD sur les pin 11-12-13-10.. j'ai essayer en passant 50-51-52-53.
mais sans résultat.

as tu essayer? , cela marche t-il cher toi? si oui, quel carte SD utilise tu?
ou si tu a des infos?

merci d'avance d'une éventuelle réponse.

IPouff:
Salut ARTNOW,
je me lance dans mon premier projet.

j'ai le meme ecran VMA412- et Mega2560,

je commence à maitriser le touchscreen et l'ecran graphique.
mais voici 2 jours que j'essaye d'activer la carte SD.

j'ai toujours un code d'erreur. utilisation d'ne carte micro SDHC 8GB-class10.
vu que cette carte semble brancher la SD sur les pin 11-12-13-10.. j'ai essayer en passant 50-51-52-53.
mais sans résultat.

as tu essayer? , cela marche t-il cher toi? si oui, quel carte SD utilise tu?
ou si tu a des infos?

merci d'avance d'une éventuelle réponse.

Salut Ipouff ,il y a des programmes d'exemples dispo sur le site elgoo pour le WMA412 , pour l'instant j'ai pas essayé la fonction carte SD .

Voici un exemple que j'ai trouvé si ça peut t'aider :

/*
  SD card read/write
 
 This example shows how to read and write data to and from an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
 
#include <SPI.h>
#include <SD.h>

File myFile;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(10, OUTPUT);
   
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
  
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
	// nothing happens after setup
}

Bonjour et merci pour ce projet, tous d'abord je sais que ce poste est ancien mais si il y a des personnes comme moi qui s'y intéresse aujourd'hui je tiens à faire partager mon expérience.
Pour que le projet soit valider il faut télécharger la version 2.0 de la librairie DHT.
Ensuite j'ai utilisé un shield lcd différents mais qui a exactement les mêmes broches de connexion, c'est un 2,8"TFT LCD shield qui fonctionne avec le driver ili9341.
Pour que le projet fonctionne avec mon shield j'ai du remplacer quelques chiffres qui se trouve 4 lignes en dessous de void setup(void) } sur la ligne :tft.begin(0x7783); à la place j'ai écrit :tft.begin(0x9341);
et tous fonctionne parfaitement

Bonjour Pierrot1610 , bravo pour ton projet , n’hésite pas à publier ton code avec la liste des accessoires , ça servira forcément à la communauté ! :wink:

Ne fonctionne pas !

Ou sont les fichiers ZIP?

pascal44:
Ne fonctionne pas !

Ou sont les fichiers ZIP?

Salut si le code fonctionne , regarde au niveau de tes bibliothèques ..