/*
Code pour simuler le flash d'un radar
le temps entre deux flash est défini par un potentiomètre entre 10 secondes et 3 minutes.
Une version avec un calcul aléatoire de cet intervalle est également proposé.
Il conviendra alors de commenter les lignes 56, 57, et 97, 98
et de décommenter les lignes 60, 61 et 88
On peut modifier les valeurs des tempo mini et maxi lignes 30 et 31
*/
#include <TinyWireM.h>
#include <TinyLiquidCrystal_I2C.h>
// Création de l'objet LCD
TinyLiquidCrystal_I2C lcd(0x27, 20, 4); // Adresse I2C de l'écran, 16 colonnes x 2 lignes
// Définition des broches
const int brocheFlash = PB1; // Broche à laquelle est connectée la LED du flash
const int brochePotentiometre = A2; // PB4, Broche à laquelle est connecté le potentiomètre
const int SDA = 0; // PB0, Broche SDA (Données)
const int SCL = 2; // PB2, Broche SCL (Horloge)
// Déclaration des variables
unsigned long tempsPrecedent = 0; // Stocke le temps du dernier flash
unsigned long intervalle = 5000; // Intervalle entre les flashes en millisecondes (modifiable)
unsigned long ancienneIntervalle = 5000; // Stocke l'ancienne valeur de l'intervalle
unsigned long dureeFlash = 80; // Durée du flash en millisecondes (modifiable)
bool flashActif = false; // Indique si le flash est actif ou non
unsigned long valeurPotentiometre = 0; // Stocke la valeur du potentiomètre
unsigned long valeurMiniPotentiometre = 10000; // La valeur mini pour le potentiomètre est fixée à 10 secondes.
unsigned long valeurMaxiPotentiometre = 60000; // La valeur maxi pour le potentiomètre est fixée à 3 minutes
// États du moteur à états
enum Etat
{
EN_ATTENTE,
FLASH_EN_COURS
};
Etat etatCourant = EN_ATTENTE;
void setup()
{
pinMode(brocheFlash, OUTPUT);
//pinMode(brochePotentiometre, INPUT);
// Initialisation de l'écran LCD
TinyWireM.begin();
lcd.begin(SDA, SCL);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Intervalle = ");
lcd.setCursor(16, 0);
lcd.print(" sec");
/* Lecture intiale du potentiomètre */
//valeurPotentiometre = analogRead(brochePotentiometre);
//ancienneIntervalle = map(valeurPotentiometre, 0, 1023, valeurMiniPotentiometre, valeurMaxiPotentiometre); // Convertit la lecture analogique en intervalle entre 10s et 5min
/* =============================== */
randomSeed(1);
ancienneIntervalle = random(valeurMiniPotentiometre, valeurMaxiPotentiometre);
afficherIntervalle(ancienneIntervalle);
} // Fin de setup
void loop()
{
// Obtient le temps actuel
unsigned long tempsActuel = millis();
// Gère les transitions d'états
switch (etatCourant)
{
case EN_ATTENTE:
if (tempsActuel - tempsPrecedent >= intervalle)
{
etatCourant = FLASH_EN_COURS;
tempsPrecedent = tempsActuel;
} // Fin de if (tempsActuel - tempsPrecedent >= intervalle)
break;
case FLASH_EN_COURS:
flashActif = true;
if (tempsActuel - tempsPrecedent >= dureeFlash)
{
etatCourant = EN_ATTENTE;
flashActif = false;
tempsPrecedent = tempsActuel;
intervalle = random(valeurMiniPotentiometre, valeurMaxiPotentiometre);
} // Fin de if (tempsActuel - tempsPrecedent >= dureeFlash)
break;
} // Fin de switch (etatCourant)
// Active/désactive le flash en fonction de l'état actuel
digitalWrite(brocheFlash, flashActif ? HIGH : LOW);
/* Lecture du potentiomètre */
//valeurPotentiometre = analogRead(brochePotentiometre);
//intervalle = map(valeurPotentiometre, 0, 1023, valeurMiniPotentiometre, valeurMaxiPotentiometre); // Convertit la lecture analogique en intervalle entre 10s et 5min
/* =============================== */
// Rafraîchit l'écran seulement si la valeur de l'intervalle a été modifiée de + ou - 10%
if (abs(intervalle - ancienneIntervalle) > (ancienneIntervalle * 10 / 100))
{
afficherIntervalle(intervalle);
ancienneIntervalle = intervalle; // Met à jour l'ancienne valeur de l'intervalle
} // Fin de if (abs(intervalle - ancienneIntervalle) > (ancienneIntervalle * 10 / 100))
} // Fin de loop
// Fonction pour afficher la valeur de l'intervalle sur l'écran LCD
void afficherIntervalle(unsigned long Tempo)
{
lcd.setCursor(13, 0);
lcd.print(" "); // Efface la valeur précédente
lcd.setCursor(13, 0);
lcd.print(Tempo / 1000); // Affiche la nouvelle valeur en secondes
} // Fin de procédure afficherIntervalle()