/* Ultra Sons avec Capteur : HC SR04 */
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd1 = LiquidCrystal_I2C(0x27,20,4); // Adresse 27 , 20 Caracteres de 4 Lignes .... SDA broche A4 , SCL Broche A5
LiquidCrystal_I2C lcd2 = LiquidCrystal_I2C(0x26,20,4); //A0 shunter pour adresse 26
/* Constantes pour les broches du HC SR04 capteur 1 */
const byte TRIGGER_PIN8 = 8; // Broche TRIGGER
const byte ECHO_PIN9 = 9; // Broche ECHO
/* Constantes pour les broches du HC SR04 capteur 2 */
const byte TRIGGER_PIN6 = 6; // Broche TRIGGER
const byte ECHO_PIN7 = 7; // Broche ECHO
/*Broche Led sur Carte Uno*/
const byte LED_PIN13 = 13; // Broche LED 13
const byte LED_Rouge_PIN12 = 12; // S'allume quand voiture 1 a fait un tour
const byte LED_Verte_PIN11 = 11; // S'allume quand Voiture 2 +1 tour
/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
const unsigned long MEASURE1_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
/* Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;
/* Variables */
struct Voiture
{
long Compteur;
byte NumVoiture = 0;
byte Passage = 0;
int Tempo;
int TempoVoiture;
float distance_mm;
int bpNom = 0;
int numeronom = 0;
int bpPinNomMen = 0;
};
int bpPin3Nom = 3;// Bp sur Broche 3 pour Choix du Nom Mario,Luigi ou Yoshi
int bpPin2Nom = 2;// Bp sur Broche 2 pour Choix du Nom Mario,Luigi ou Yoshi
/* Distances de détection */
int Min = 10;
int Max = 100;
int PasObstacle = 150;
String ListeNoms []={"Mario ","Luigi ","Yoshi ","Clara ","Louis ","Bernard ","Lisiane ","Timothe ","Stephanie"}; //ListeNoms[0]=Mario
unsigned long monTemps;
/** Fonction setup() */
void setup()
{
/* Initialise le port série */
Serial.begin(9600);
// Specify the LCD's number of columns and rows. Change to (20, 4) for a 20x4 LCD:
lcd1.init();
lcd1.begin(20, 4);
lcd1.clear();
lcd1.backlight();
lcd1.setCursor(1,0);
lcd1.print("Compteur ");
lcd1.print(ListeNoms[0]);
// afficheur 2
lcd2.init();
lcd2.begin(20, 4);
lcd2.clear();
lcd2.backlight();
lcd2.setCursor(1,0);
lcd2.print("Compteur Luigi");
/* Initialise les broches capteur 1*/
pinMode(TRIGGER_PIN8, OUTPUT);
digitalWrite(TRIGGER_PIN8, LOW); // La broche TRIGGER doit être à LOW au repos
pinMode(ECHO_PIN9, INPUT);
/* Initialise les broches capteur 2*/
pinMode(TRIGGER_PIN6, OUTPUT);
digitalWrite(TRIGGER_PIN6, LOW); // La broche TRIGGER doit être à LOW au repos
pinMode(ECHO_PIN7, INPUT);
pinMode(LED_PIN13, OUTPUT);
pinMode(LED_Rouge_PIN12, OUTPUT);
pinMode(LED_Verte_PIN11, OUTPUT);
/* Init Bp choix Nom*/
pinMode(bpPin2Nom,INPUT);
pinMode(bpPin3Nom,INPUT);
}
/*Déclaration Struct Voitures*/
struct Voiture v1,v2;
int temps1=0;
int Tempo(int Duree) // Tempo de durée= Nb de cycles
{
temps1 = temps1 + 1;
int reste = Duree - temps1;
if (reste <= 0){ temps1 = 0;}
return (reste);
}
unsigned long previousMillis = 0;
const long interval = 1000;
unsigned long Duree = 0;
int FinTempo = 0;
// tempo
int Temporisation (int Duree,int FinTempo)
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= Duree)
{
// save the last time you blinked the LED
previousMillis = currentMillis;
FinTempo = 1 ;
}else{FinTempo = 0;}
}
/** Fonction loop() */
void loop()
{
// monTemps = millis(); // temps depuis debut programme
if (digitalRead(bpPin3Nom) == LOW)
{
Serial.print("Bp");
Serial.print(Tempo(10));
if (Tempo(10) <= 0)
{
Serial.print("Fini");
}
}else{temps1=0;}
// Choix nom sur l afficheur 1
v1.bpNom = digitalRead(bpPin2Nom); // lit bp et front de montée: 0 volt quand appuyé change quand on relache
//lcd2.print(numeronom);
if (v1.bpNom == HIGH && v1.bpPinNomMen==0)
{
v1.bpPinNomMen=v1.bpNom;
++v1.numeronom ; // incremente a chaque implusion
if (v1.numeronom==9){ v1.numeronom=0;}
lcd2.setCursor(1, 0);
lcd2.print("Compteur " ) ;
lcd2.print(ListeNoms[v1.numeronom] );
}
if (v1.bpNom == LOW){v1.bpPinNomMen=0;}
// Choix nom sur l afficheur 2
v2.bpNom=digitalRead(bpPin3Nom); // lit bp et front de montée: 0 volt quand appuyé change quand on relache
//lcd1.print(numeronom1);
if (v2.bpNom == HIGH && v2.bpPinNomMen==0)
{
v2.bpPinNomMen=v2.bpNom;
++v2.numeronom ; // incremente a chaque implusion
if (v2.numeronom==9){ v2.numeronom=0;}
lcd1.setCursor(1, 0);
lcd1.print("Compteur " ) ;
lcd1.print(ListeNoms[v2.numeronom] );
}
if (v2.bpNom == LOW){v2.bpPinNomMen=0;}
// Set the cursor on the first column and the first row, counting starts at 0:
lcd1.setCursor(0, 2);
lcd1.print("Dist_mm: ");
lcd1.setCursor(10, 2);
lcd1.print(v1.distance_mm);
// Set the cursor on the first column and the first row, counting starts at 0:
lcd2.setCursor(0, 2);
lcd2.print("Dist_mm: ");
lcd2.setCursor(10, 2);
lcd2.print(v2.distance_mm);
// Set the cursor on the first column and the second row:
lcd1.setCursor(0, 1);
lcd1.print("Nombre Tours : ");
lcd1.setCursor(16, 1);
lcd1.print(v1.Compteur);
// Set the cursor on the first column and the second row:
lcd2.setCursor(0, 1);
lcd2.print("Nombre Tours : ");
lcd2.setCursor(16, 1);
lcd2.print(v2.Compteur);
/* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
digitalWrite(TRIGGER_PIN8, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN8, LOW);
/* 2. Capteur 1 Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
long measure = pulseIn(ECHO_PIN9, HIGH, MEASURE_TIMEOUT);
/* 3. Calcul la distance à partir du temps mesuré */
v1.distance_mm = measure / 2.0 * SOUND_SPEED;
/* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
digitalWrite(TRIGGER_PIN6, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN6, LOW);
/* 2. Capteur 2 Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
long measure1 = pulseIn(ECHO_PIN7, HIGH, MEASURE1_TIMEOUT);
/* 3. Calcul la distance à partir du temps mesuré */
v2.distance_mm = measure1 / 2.0 * SOUND_SPEED;
/* Allume Led 13 si détection entre 10 et 100 mm , puis compte un tour */
if (v1.distance_mm > Min && v1.distance_mm < Max)
{
digitalWrite(LED_PIN13, HIGH);
v1.NumVoiture = 1;
if (v1.NumVoiture == 1 && v1.Passage == 0 && v1.TempoVoiture == 0)
{
v1.Compteur++;
v1.Passage = 1;
digitalWrite(LED_Rouge_PIN12, HIGH);
v1.TempoVoiture = 1;
/* Affiche les résultats en mm, cm et m */
Serial.print(F("Distance: "));
Serial.print(v1.distance_mm);
Serial.print(F("mm ("));
Serial.print(v1.distance_mm / 10.0, 2);
Serial.print(F("cm, "));
Serial.print(v1.distance_mm / 1000.0, 2);
Serial.println(F("m)"));
Serial.print(F("Nombre de Tours : "));
Serial.print(v1.Compteur);
Serial.print("\n");
}
}
if (v2.distance_mm > Min && v2.distance_mm < Max)
{
digitalWrite(LED_PIN13, HIGH);
v2.NumVoiture = 1;
if (v2.NumVoiture == 1 && v2.Passage == 0 && v2.TempoVoiture == 0)
{
v2.Compteur++;
digitalWrite(LED_Verte_PIN11, HIGH);
v2.Passage = 1;
v2.TempoVoiture = 1;
/* Affiche les résultats en mm, cm et m */
Serial.print(F("Distance: "));
Serial.print(v2.distance_mm);
Serial.print(F("mm ("));
Serial.print(v2.distance_mm / 10.0, 2);
Serial.print(F("cm, "));
Serial.print(v2.distance_mm / 1000.0, 2);
Serial.println(F("m)"));
Serial.print(F("Nombre de Tours : "));
Serial.print(v2.Compteur);
Serial.print("\n");
}
}
/*Voiture1 Passée !*/
if (v1.distance_mm > PasObstacle)
{
digitalWrite(LED_PIN13, LOW);
v1.Passage = 0;
digitalWrite(LED_Rouge_PIN12, LOW);
}
/* Filtre Tempo entre 2 passages evite d 'avoir un Delay trop long */
if (v1.TempoVoiture >= 1) {v1.TempoVoiture++;}
if (v1.TempoVoiture > 10) {v1.TempoVoiture = 0;}
/*Voiture2 Passée !*/
if (v2.distance_mm > PasObstacle)
{digitalWrite(LED_PIN13, LOW);
digitalWrite(LED_Verte_PIN11, LOW);
v2.Passage = 0;
}
/* Filtre Tempo entre 2 passages evite d 'avoir un Delay trop long */
if (v2.TempoVoiture >= 1){v2.TempoVoiture++;}
if (v2.TempoVoiture > 10){v2.TempoVoiture = 0;}
/* Délai d'attente 10ms pour éviter d'afficher trop de résultats à la seconde */
delay(10);
}