1
Trucs & astuces / Re : Comptage des essieux
« Dernier message par Brunotoutsimple le Aujourd'hui à 01:07:17 pm »Bonjour Christophe
Voici un autre programme pour faire fonctionner ce montage avec écran LCD pour vérifier le fonctionnement. Je n'ai pas le matériel pour le faire.
Je vous dirais que la dernière parti du code qui suis, j'ai compris le principe, mais la programmation, je suis perdu:
Voici un autre programme pour faire fonctionner ce montage avec écran LCD pour vérifier le fonctionnement. Je n'ai pas le matériel pour le faire.
Code: [Sélectionner]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Initialisation de l'afficheur LCD - 20 chiffres 4 lignes
int Impulse; // Impulsions au point de lecture
int Axles; // sont des essieux / 4 ou des aimants
// Définir les broches pour les entrées analogiques
const int analogl = A0;
const int analog2 = A1;
const int analog3 = A2;
const int analog4 = A3;
int counter1 = 0; // Compteur1 des valeurs incrémentales
int lastEncoded1 = 0; // Dernière valeur encodée
int counter2 = 0; // Compteur2 pour les valeurs incrémentales
int lastEncoded2 = 0; // Dernière valeur encodée
// Barrières photoélectriques de 1-4
int LS1;
int LS2;
int LS3;
int LS4;
void setup() {
Wire.begin(); // Initialise le bus I2C
lcd.init(); // Initialise l'écran LCD
lcd.backlight();
Serial.begin(9600); // Démarre la communication série
pinMode(7, OUTPUT); // La LED s'allume lorsqu'elle est occupée
pinMode(8, OUTPUT); // La LED s'allume lorsqu'elle est libre
}
void loop() {
updateEncoder();
// Lire la valeur entre 0 et 1023 sur l'entrée analogique A0
// si plus petit à 20 => alors LS1 actif
int Value1 = analogRead(analog1);
if (Value1 < 20) LS1 = 1;
else LS1 = 0;
// Lire la valeur entre 0 et 1023 sur l'entrée analogique A1
// si plus petit à 20 => alors LS2 actif
int Value2 = analogRead(analog2);
if (Value2 < 20) LS2 = 1;
else LS2 = 0;
// Lire la valeur entre 0 et 1023 sur l'entrée analogique A2
// si plus petit à 20 => alors LS3 actif
int Value3 = analogRead(analog3);
if (Value3 < 20) LS3 = 1;
else LS3 = 0;
// Lire la valeur entre 0 et 1023 sur l'entrée analogique A3
// si plus petit à 20 => alors LS4 actif
int Value4 = analogRead(analog4);
if (Value4 < 20) LS4 = 1;
else LS4 = 0;
if (Impulse != 0) {
digitalWrite(7, LOW);
} else {
digitalWrite(7, HIGH);
}
if (Impulse == 0) {
digitalWrite(8, LOW);
} else {
digitalWrite(8, HIGH);
}
Impulse = counter1 - counter2; // Différence entre les Impulsions des capteurs
Axles = Impulse / 4; // Essieux ou magnette
lcd.setCursor(0, 0);
lcd.print("A0");
lcd.print(" ");
lcd.print("Al");
lcd.print(" ");
lcd.print("A2");
lcd.print(" ");
lcd.print("A3");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(Value1);
lcd.print(" ");
lcd.print(Value2);
lcd.print(" ");
lcd.print(Value3);
lcd.print(" ");
lcd.print(Value4);
lcd.setCursor(0, 2);
lcd.print("Impulse ");
lcd.print(Impulse);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("Axles ");
lcd.print(Axles);
lcd.print(" ");
Serial.println(Impulse); // Affiche la lecture actuelle du compteur
Serial.println(Axles); // Affiche les essieux actuels
}
void updateEncoder() // Mise à jour du compteur
{
int encoded1 = (LS1 << 1) | LS2; // Encode les deux signaux en une seule valeur << est l'opérateur de décalage de bit gauche
int encoded2 = (LS3 << 1) | LS4;
int sum1 = (lastEncoded1 << 2) | encoded1; // Somme 1 de la valeur codée actuelle
int sum2 = (lastEncoded2 << 2) | encoded2; // Somme 1 de la valeur codée actuelle
if (sum1 == 0b1101 || sum1 == 0b0100 || sum1 == 0b0010 || sum1 == 0b1011) counter1++; // Compter
if (sum1 == 0b1110 || sum1 == 0b0111 || sum1 == 0b0001 || sum1 == 0b1000) counter1--; // Décompter
if (sum2 == 0b1101 || sum2 == 0b0100 || sum2 == 0b0010 || sum2 == 0b1011) counter2++; // Compter
if (sum2 == 0b1110 || sum2 == 0b0111 || sum2 == 0b0001 || sum2 == 0b1000) counter2--; // Décompter
lastEncoded1 = encoded1; // Sauvegarde la valeur codée 1 actuelle
lastEncoded2 = encoded2: // Sauvegarde la valeur codée 2 actuelle
}
/*
En mode comptage, les lignes responsables de l'affichage et de la sortie série doivent être verrouillées avec //.
Ils sont supprimés à des fins de tests.
*/
Je vous dirais que la dernière parti du code qui suis, j'ai compris le principe, mais la programmation, je suis perdu:
Code: [Sélectionner]
void updateEncoder() // Mise à jour du compteur
{
int encoded1 = (LS1 << 1) | LS2; // Encode les deux signaux en une seule valeur << est l'opérateur de décalage de bit gauche
int encoded2 = (LS3 << 1) | LS4;
int sum1 = (lastEncoded1 << 2) | encoded1; // Somme 1 de la valeur codée actuelle
int sum2 = (lastEncoded2 << 2) | encoded2; // Somme 1 de la valeur codée actuelle
if (sum1 == 0b1101 || sum1 == 0b0100 || sum1 == 0b0010 || sum1 == 0b1011) counter1++; // Compter
if (sum1 == 0b1110 || sum1 == 0b0111 || sum1 == 0b0001 || sum1 == 0b1000) counter1--; // Décompter
if (sum2 == 0b1101 || sum2 == 0b0100 || sum2 == 0b0010 || sum2 == 0b1011) counter2++; // Compter
if (sum2 == 0b1110 || sum2 == 0b0111 || sum2 == 0b0001 || sum2 == 0b1000) counter2--; // Décompter
lastEncoded1 = encoded1; // Sauvegarde la valeur codée 1 actuelle
lastEncoded2 = encoded2: // Sauvegarde la valeur codée 2 actuelle
}
/*