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);
}