Auteur Sujet: Affichage ecran  (Lu 9110 fois)

Yves21000

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
Affichage ecran
« le: février 12, 2020, 06:21:35 pm »
Bonjour

Je reposte mon sujet que j'ai mis par erreur dans la rubrique "un automatisme de passage à niveau".

Je suis en train de réaliser un passage à niveau au plus près de la réalité.
Presque tout fonctionne correctement, mais je me heurte à un problème d’affichage sur un écran.

Je voudrais afficher en permanence sur un écran LCD I2C, l’état de 4 relais pour indiquer l’état du PN.
J’arrive bien à faire fonctionner mon affichage dans un programme isolé en utilisant la fonction delay().
Par contre, quand j'insère ce programme dans le programme principal, delay() me bloque l’ensemble (c'est logique !).
Comment pourrais-je m’en sortir et remplacer delay par autre chose ?
J’avais pensé à utiliser MsTimer2, mais là, je suis bloqué !

Il y a bien msport qui m'a répondu  ;), mais je ne vois pas où gérer millis().

Merci de votre aide

/* Fonctionnement d'un ecran LCS I2C sur Mega *****************
 *  Branchement en +VCC, GND, SDA (20) et SLC (21)
 *  Informations provenant de 4 contats de relais
 *  branchés en A0, A1, A2 et A3 avec Resistances et capa
 *  pour gérer les rebonds (avec un trigger sur la carte finale
 *  ***********************************************************/

/* programme non compatible avec le reste du passage à niveau
 *  du fait de l'utilisation de la fonction delay(1000) pour
 *  l'affichage des différents états à l'écran (blocage du prog)
 *  *********************************************************/

#include <LiquidCrystal_PCF8574.h>
#include <Wire.h>
#include <MsTimer2.h>

LiquidCrystal_PCF8574 lcd(0x27); // set the LCD address to 0x27 for a 16 chars and 2 line display
int show = -1;
#define PIN_S0  A0
#define PIN_S1  A1
#define PIN_S2  A2
#define PIN_S3  A3
boolean etat0 ;
boolean etat1 ;
boolean etat2 ;
boolean etat3 ;
int etatbouton = 1;

void setup(){
// declaration des boutons en entrée
  pinMode (PIN_S0, INPUT);
  pinMode (PIN_S1, INPUT);
  pinMode (PIN_S2, INPUT);
  pinMode (PIN_S3, INPUT);

//  MsTimer2 :: set (1000, ecran); periode de 1s
//  MsTimer2 :: start();
 
  int error;
  Serial.begin(115200);
  Serial.println("LCD...");
  // wait on Serial to be available on Leonardo
  while (!Serial);
  Serial.println("Dose: check for LCD");
  // Voir http://playground.arduino.cc/Main/I2cScanner pour tester le port I2C.
  Wire.begin();
  Wire.beginTransmission(0x27);
  error = Wire.endTransmission();
  Serial.print("Error: ");
  Serial.print(error);
  if (error == 0) {
    Serial.println(": LCD found.");
    show = 0;
    lcd.begin(16, 2); // initialize the lcd
  } else {
    Serial.println(": LCD not found.");
  } // fin if
} // fin setup()

void loop(){
  etat0 = digitalRead(PIN_S0);
  etat1 = digitalRead(PIN_S1);
  etat2 = digitalRead(PIN_S2);
  etat3 = digitalRead(PIN_S3);
  lcd.setBacklight(255);
  lcd.home();
  lcd.clear();

  Serial.print(etat0);
  Serial.print(etat1);
  Serial.print(etat2);
  Serial.print(etat3);

switch (etatbouton) {
  case 1: if (etat0 == LOW){ //HIGH avec bascule de schmitt (inversion du signal) sinon LOW
      lcd.setCursor(0, 0);
      lcd.print(" PN a 298 metres ");
      lcd.setCursor(0, 1);
      lcd.print("  ");
  }
  case 2: if (etat1 == LOW){
    lcd.setCursor(0, 0);
    lcd.print(" PN a 240 metres ");
    lcd.setCursor(0, 1);
    lcd.print("     Ferme");
  }
  case 3: if (etat2 == LOW){
    lcd.setCursor(0, 0);
    lcd.print("     Danger ");
    lcd.setCursor(0, 1);
    lcd.print(" Ne pas franchir ");
  }
  case 4: if (etat3 == LOW){
    lcd.setCursor(0, 0);
    lcd.print("  Route barree");
    lcd.setCursor(0, 1);
    lcd.print("     travaux");
  }
 case 5: if (etat0==HIGH && etat1==HIGH && etat2==HIGH && etat3==HIGH){
    lcd.setCursor(0, 0);
    lcd.print("   Etat du PN ");
    lcd.setCursor(0, 1);
    lcd.print("   indetermine");
}
delay(1000); 
}
} //fin de loop

Tony04

  • Hero Member
  • *****
  • Messages: 553
    • Voir le profil
Re : Affichage ecran
« Réponse #1 le: février 12, 2020, 08:51:45 pm »
Bonsoir tresorier21000 (prénom serait plus sympa),

il suffit d'utiliser la fonction millis() de la façon suivante par exemple:

Dans les définitions de variables tu mets:
unsigned long dateDernierEnvoi = 0;

Dans le loop tu testes de cette façon:
if((millis()-dateDernierEnvoi) > 1000) {   // on teste si plus d'une seconde est passée
  // ici se trouve ta routine d'affichage que tu finis par
  dateDernierEnvoi = millis(); // on recharge la tempo
}

et le tour est joué.

Cordialement
Antoine

Yves21000

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
Re : Affichage ecran
« Réponse #2 le: février 12, 2020, 09:09:27 pm »
Bonsoir Antoine

tout d'abord un grand merci, ça fonctionne.
J'avais galéré avec millis parce que je m'étais cantonné à encadrer le switch et non l'ensemble du loop.

En second point, je vais modifié mon profil.

Yves