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