Mode veille [HELP]

Bonjour,

J'aimerai mettre un mode veille sur mes capteurs et mon écran. En premier lieu, j'aimerai m'occuper de l'écran.

Comment faire pour que l'écran se mette en veille (écran éteint, et non pas qu'il affiche du noir), et qu'il se reveille par pression d'un bouton ? (Il y a un joystick sur l'écran)

J'ai le code suivant, qui le met en veille juste pendant un delay X. Mais ca m'etonnerai que la fonction delay soit très econome. Et surtout l'écran n'est pas vraiment allumé.. :

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SD.h>
#include <SPI.h>
#include <avr/sleep.h>


#define SD_CS    4  // Chip select line for SD card
#define TFT_CS  10  // Chip select line for TFT display
#define TFT_DC   8  // Data/command line for TFT
#define TFT_RST  -1  // Reset line for TFT (or connect to +5V)

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

#define BUTTON_NONE 0
#define BUTTON_DOWN 1
#define BUTTON_RIGHT 2
#define BUTTON_SELECT 3
#define BUTTON_UP 4
#define BUTTON_LEFT 5
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
int count = 0 ;
int thisByte = 33; 

void setup(void) 
{
  Serial.begin(9600);

  tft.initR(INITR_REDTAB);   // initialize a ST7735R chip, red tab
  // If your TFT's plastic wrap has a Green Tab, use the following:
  //tft.initR(INITR_GREENTAB); // initialize a ST7735R chip, green tab

  Serial.println("OK!");
  tft.fillScreen(0x0000);
  tft.setRotation(1);
}

uint8_t readButton(void) {
  float a = analogRead(3);
  
  a *= 5.0;
  a /= 1024.0;
  
  Serial.print("Button read analog = ");
  Serial.println(a);
    if (a < 0.2) return BUTTON_DOWN;
    if (a < 1.0) return BUTTON_RIGHT;
    if (a < 1.5) return BUTTON_SELECT;
    if (a < 2.0) return BUTTON_UP;
    if (a < 3.2) return BUTTON_LEFT;
    else return BUTTON_NONE;
  }
    
uint8_t buttonhistory = 0;

void loop() 
{
    count++;
    uint8_t b = readButton();
    tft.setTextSize(2);

  
  if (buttonhistory == 0) 
  {
    tft.setTextColor(ST7735_GREEN);
    tft.setCursor(0, 0);
    tft.print ("  CHALET\n  ISOLE");
    tft.setTextColor(ST7735_RED);
    tft.setCursor(0, 60);
    tft.print (" Bonjour,\n Appuyez \n pour \n demarrer");
while(b != BUTTON_SELECT)  b = readButton();
      buttonhistory |= 0;
  
  delay (1000);
  
    tft.fillScreen(BLACK);
    tft.setTextColor(ST7735_RED);
    tft.setCursor(0, 0);
    tft.print ("T interne :-> \n");
    tft.print ("T externe : \n");
    tft.print ("Niv d'eau :  \n");
    tft.print ("Veille : <- \n");
    buttonhistory |= 1;
  }

  if (b == BUTTON_DOWN)
  {
     tft.fillScreen(BLACK);
     tft.setTextColor(ST7735_RED);
     tft.setCursor(0, 10);
     tft.print("T Int =\n ");
     tft.print (count);
     tft.print ("\xf7 C");
     buttonhistory |= 2;
  }
 
  if (b == BUTTON_LEFT) 
  {
     tft.fillScreen(BLACK);
     tft.setTextColor(ST7735_YELLOW);
     tft.setCursor(0, 60);
     tft.print("T Ext =\n");
     tft.print (count);
     tft.print ("\xf7 C");
     buttonhistory |= 3;
   }
  if (b == BUTTON_RIGHT) 
  {
     tft.fillScreen(BLACK);
     tft.setTextColor(ST7735_GREEN);
     tft.setCursor(0, 110);
     tft.print("Niv Eau = "); 
     tft.print(count);
     tft.print ("%");
     buttonhistory |= 4;
  } 
  if (b == BUTTON_UP)
  {
      tft.setTextColor(ST7735_WHITE);
      tft.fillScreen(BLACK);
      tft.setCursor(0, 10);
      tft.print("Mode veille"); // Message de mis en sommeil
      delay (2000);
      tft.fillScreen(BLACK);
      delay(100);      
      set_sleep_mode(SLEEP_MODE_STANDBY); //Définition du mode sommeil
      sleep_mode();
      sleep_enable();  // Activation du mode veille
      count = 0;
  }     

  
   if (b == BUTTON_SELECT)   
    { 
      sleep_mode();           // Le module est mis en veille a partir d'ici
 
                             
      sleep_disable();         
      tft.fillScreen(BLACK);
      tft.setTextColor(ST7735_RED);
      tft.setCursor(0, 50);
      tft.print("Sortie du mode veille"); //Message de sortie de veille
      
      delay (1000);
      
      tft.fillScreen(BLACK);
      tft.setCursor(0, 0);
      tft.print ("T interne : ? \n");
      tft.print ("T externe : <-\n");
      tft.print ("Niv d'eau : ->\n");
      tft.print ("Veille :  ?\n");
      buttonhistory |= 5;
    }
}

Une aide serait la bienvenue, merci d'avance..

Si tu veut éteindre l'écran prend un interrupteur a basculement, tu te complique la vie.

Qu'est ce que c'est, et comment ça marche ?..

Et comment le mettre en place ?


XD
(fait sur paint en 30 secondes ...)

Bonjour,

L'écran semble avoir des commandes pour éteindre/allumer l'affichage mais ce n'est pas prévu dans la librairie d'adafruit.

Voir lignes 51-52 :

#define ST7735_DISPOFF 0x28
#define ST7735_DISPON  0x29

Si tu t'en sent le courage tu peut implémenter une fonction pour, sinon tu peut mettre un interrupteur sur l'alimentation de l'arduino.
Solution alternative : un transistor sur l'alimentation de l'écran.

Étant donné que, sur un écran, ce qui consomme le plus c'est le rétroéclairage, tu met un transistor sur la broche de commande, voir mieux:

digitalWrite(brocheDuRetroEclairage, LOW);

Je suis pas sur que ça marche, mais il faut essayer ! (par contre il faut repérer la broche ...)
Tu peux faire pareil (enfin, si ça marche) avec la broche d'alimentation générale (ou la broche GND) et tu consommera beaucoup moins !

skywodd:
Bonjour,

L'écran semble avoir des commandes pour éteindre/allumer l'affichage mais ce n'est pas prévu dans la librairie d'adafruit.

Voir lignes 51-52 :

#define ST7735_DISPOFF 0x28

#define ST7735_DISPON  0x29



https://github.com/adafruit/Adafruit-ST7735-Library/blob/master/Adafruit_ST7735.h

Si tu t'en sent le courage tu peut implémenter une fonction pour, sinon tu peut mettre un interrupteur sur l'alimentation de l'arduino.
Solution alternative : un transistor sur l'alimentation de l'écran.

Comment je pourrais utiliser les commandes DISPOFF et DISPON ?

nathan30:
Comment je pourrais utiliser les commandes DISPOFF et DISPON ?

En lisant le datasheet du contrôleur et en implémentant une fonction dans la classe Adafruit_ST7735 pour gérer la commande.
Mais à moi de connaitre un peu l'écran et savoir comment il se commande en bas niveau c'est peine perdu ...

Ca am l'air trop compliqué..

Et sinon, pour l'ajout d'un interrupteur : Où l'acheter ? Comment le brancher sur l'arduino avec l'écran ?

J'avoue que je suis pas doué en la matière..

Pour l'interrupteur, tu vas chez casto', rayon bricolage, tu prend un interrupteur 220v, mais c'est pas joli :zipper_mouth_face: .
Tu peux aussi les commander sur n'importe quel site d'électronique (conrad, sparkfun, c'est pas ce qui manque !) pour en avoir un joli et pas trop gros .
Ensuite, tu le branche entre le GND de l'écran et le GND de la carte, si tu coupe le circuit l'écran s’éteint (niveau CM2) .
Tu peux toujours remplacer l'interrupteur par un transistor, mais ça consommera toujours .

J'suis vraiment nul en électricité et je vois pas comment brancher entre le GND de l'écran et celui de l'écran ..

Sur l'écran, tu as normalement une broche GND ou VSS . Elle est reliée à la broche GND de ta carte . Tu met l'interrupteur en la broche de ton écran et celle de la carte, si l'interrupteur est ouvert, l'écran ne sera plus alimenté et s'éteindra ! Il ne consommera rien .

Merci Geeker pour tes solutions. J'achète un interrupteur au plus vite et je test sa :slight_smile:

Est-ce que si j'ai des capteurs branché en plus a l'arduino, seront t'il éteint aussi ?

Il seront éteints si ils se trouvent entre l'interrupteur et l'écran, si ils sont reliés directement à la masse de la carte, ils continueront à fonctionner, mais si tu veux qu'ils se coupent, tu les met entre l'interrupteur et l'écran :wink: Tu peux donc choisir ce que tu éteint et ce que tu laisse allumé pour faire un mode veille qui consomme presque rien !

Avec mon groupe on a fait un tinkerkit maison avec 3 connecteur 3 points (Capteur de temp) et 1 connecteur 4 points (capteur a ultrasons)
et des pins pour l'écran. Et toutes les masses de tous les connecteur sont reliés a la même masse. Donc normalement, l'interupteur éteindra tout non ?

Tu as juste à mettre le bouton sur le fil qui va de la masse à l'écran, comme ça seul l'écran sera éteint . Si tu met l'interrupteur entre la masse de la carte et toutes les autres masses, ça éteindra tout .
schéma:

schema.jpg

Ok j'essaierai juste entre l'écran et la carte

Et sinon après, un mode veille pour mes capteurs de temp et ultrasons qui se allume mes capteurs 1 min toutes les 10 minutes ?..
J'suis partie comme pour l'écran sur un delay, mais c'est pas bon..

Up, help please..