[Résolu] VMA412 TFT 2.8'' VELLEMAN ET DS3231 affichage clignotant

Bonjour , j’ai un petit projet en cours , utiliser un VMA412 velleman ( Ecran TFT 2,8’’ Un peu exotique ) pour afficher à terme l’heure la date et la température avec un arduino méga.

Pour l’instant je m’occupe seulement de l’heure et de la date .

Mon code est le produit d’un assemblage entre deux fichier trouver sur le net , avec mes modifications .

Pour le moment il fonctionne mais j’ai un soucis avec le code car il me fait clignoter l’écran du rouge au blanc d’une manière psychédélique .

J’ai chercher la solution pour éviter le clignotement mais en vain .

Mon code est perfectible , et surtout il n’est que l’ébauche de mon projet , je voudrais juste pour continuer stopper le bug du clignotement .

Je ne donne pas mon schéma pour le moment car cela fonctionne en Hardware , c’est juste le soft qui doit être modifié.

Merci d’avance de votre aide , je ferait un tuto une fois le projet abouti car sur cet écran welleman il n’y a pas grand chose comme exemple à coder sur le net .

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin


// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;

unsigned long testText() {


}
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

void setup(void) {
 Wire.begin();
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
//setDS3231time(00,57,15,4,30,11,17);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (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); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  
// request seven bytes of data from DS3231 starting from register 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());


  
  tft.begin(0x7783); 
  tft.setRotation(1);

}
void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  // send it to the tft
  
   unsigned long start = micros();
     tft.fillScreen(RED);

  tft.setCursor(1, 1);
  tft.setTextColor(WHITE);  tft.setTextSize(6);
  
  tft.println(hour,DEC);  
  if (minute<10)tft.print("0");  

    
    tft.setCursor(80, 1);
    tft.print(":");
    
  tft.print(minute, DEC);
  tft.print(":");
  if (second<10)tft.print("0");
  
    
  
  tft.print(second, DEC);
  tft.print(" ");
   tft.setCursor(10, 120);
  tft.print(dayOfMonth, DEC);
  tft.print("/");
  tft.print(month, DEC);
  tft.print("/");
  tft.print(year, DEC);
tft.setCursor(0, 70);
tft.setTextColor(GREEN);
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) {

 displayTime(); // display the real-time clock data on the tft
 //delay(1000); // every second
 }

Effacez juste les parties qui ont besoin de l’être.. tft.fillScreen(RED); c’est assez agressif sans doute...

Bonjour J-M-L , merci de m’avoir répondu , le problème c’est que le fillscreen permet d’effacer la matrice écran pour éviter le superposition des caractères !!

j’ai essayer cela clignote toujours et en plus ça superpose à fond …

Oui j’ai bien compris que c’est pour éviter la superposition - ce qu’il faudrait c’est dessiner un rectangle rouge sur la zone à nettoyer la plus petite possible avant de redessiner le prochain caractère

J-M-L: Oui j’ai bien compris que c’est pour éviter la superposition - ce qu’il faudrait c’est dessiner un rectangle rouge sur la zone à nettoyer la plus petite possible avant de redessiner le prochain caractère

Bonjour OK JML , c'est une très bonne idée pour le rafraîchissement écran mais j'ai quand même pas mal de monde sur l’écran donc c'est pas une solution facile à mettre en oeuvre , je vais travailler la dessus , merci

Bonjour,

Je ne sais pas si le comportement est identique sur tous les tft, mais sur le mien quand tu fais tft.setTextColor(WHITE); ça écrit avec un fond transparent, donc ce qui est en dessous reste. Si tu veux écrire avec un fond opaque donc effacer ce qui est en dessous il faut indiquer la couleur du fond: tft.setTextColor(WHITE,RED);

kamill:
Bonjour,

Je ne sais pas si le comportement est identique sur tous les tft, mais sur le mien quand tu fais tft.setTextColor(WHITE); ça écrit avec un fond transparent, donc ce qui est en dessous reste.
Si tu veux écrire avec un fond opaque donc effacer ce qui est en dessous il faut indiquer la couleur du fond: tft.setTextColor(WHITE,RED);

Merci KAMILL cela fonctionne un peu mieux grâce à ton code , maintenant j’ai juste un clignotement du texte rouge sur fond blanc toutes les secondes , je ne comprends pas pourquoi je poste mon code avec ta modification :

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin


// Assign human-readable names to some common 16-bit color values:
#define	BLACK   0x0000
#define	BLUE    0x001F
#define	RED     0xF800
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;

unsigned long testText() {
  

}
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

void setup(void) {

 Wire.begin();
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
setDS3231time(00,00,15,4,30,11,17);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (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); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);

// request seven bytes of data from DS3231 starting from register 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());

  tft.begin(0x7783); 
  tft.setRotation(1);

}
void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  // send it to the tft
  
   unsigned long start = micros();


  tft.setCursor(1, 1);
 
  tft.setTextSize(5);
  tft.setTextColor(RED,WHITE);
  tft.println(hour,DEC);  
 
  

    
    tft.setCursor(70, 1);
    tft.print(":");
   if (minute<10)tft.print("0"); 
  tft.print(minute, DEC);
   tft.print(":");
  if (second<10) tft.print("0");
 
    
  
  tft.print(second, DEC);
  tft.print(" ");
   tft.setCursor(10, 120);
  tft.print(dayOfMonth, DEC);
  tft.print("/");
  tft.print(month, DEC);
  tft.print("/");
  tft.print(year, DEC);
tft.setCursor(0, 70);

tft.setTextSize(4);
  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) {

 displayTime(); // display the real-time clock data on TFT


 }

Que font

 tft.begin(0x7783); 
 tft.setRotation(1);

dans readDS3231time() ?

Déplaces les dans le setup()

kamill: Que font

 tft.begin(0x7783); 
 tft.setRotation(1);

dans readDS3231time() ?

Déplaces les dans le setup()

Merci KAMILL , cela fonctionne nickel , je vais publier mon projet dans projet fini . Merci beaucoup

BONJOUR , très intéresser par ton programme possibilité de le mettre sur une carte uno . que faut il faire pour le mettre sur une carte uno . d'avance merci . EMAIL:hohm.michel@free.fr

michel_59: EMAIL:xxx.xxxx@free.fr

==> ne donnez pas votre eMail dans les forum.