/*
***********************************************
* Gestion d'éclairage aléatoire *
* version 20260619 *
* pour arduino Tiny84 *
* *
***********************************************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Licence d’utilisation – Philippe Guenet !
! !
! Ce code est librement téléchargeable pour un usage personnel et non commercial. !
! !
! Toute utilisation commerciale, professionnelle ou rémunérée est interdite. !
! !
! La redistribution, la copie publique ou l’intégration dans un autre projet !
! sont interdites. !
! !
! Aucune modification ou adaptation n’est autorisée sans l’accord écrit préalable !
! de l’auteur. !
! !
! L’auteur conserve tous les droits de propriété intellectuelle sur ce code. !
! !
! L’auteur ne saurait être tenu responsable d’aucun dommage résultant de !
! l’utilisation de ce code. !
! !
! L’utilisation du code vaut acceptation de ces conditions. !
! !
! © Philippe Guenet – Tous droits réservés - [email protected] - https://wgnt-train.fr !
! !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*/
const byte NB_LEDS = 5;
/*
Adapter les broches suivant votre câblage
*/
const byte brocheLed[NB_LEDS] =
{
0, 1, 2, 3, 4
};
/*
Potentiomètre sur PA6
*/
const byte brochePot = PB5;
/*
Temps de base
*/
const uint16_t DUREE_MIN = 5000; // 2 s
const uint16_t DUREE_MAX = 10000; // 5 s
const uint16_t FREQ_MIN = 8000; // 2 s
const uint16_t FREQ_MAX = 12000; // 4 s
struct Appartement
{
bool etat;
unsigned long prochainChangement;
};
Appartement appartement[NB_LEDS];
//--------------------------------------------------
float lireCoefficientTemps()
//--------------------------------------------------
{
int valeur = analogRead(brochePot);
/*
Coefficient de 0.5 à 3.0
*/
return 0.5 + (valeur / 1023.0) * 2.5;
}
//--------------------------------------------------
unsigned long tempsAleatoire(float coef)
//--------------------------------------------------
{
uint32_t duree =
random(DUREE_MIN, DUREE_MAX + 1);
uint32_t attente =
random(FREQ_MIN, FREQ_MAX + 1);
return (duree + attente) * coef;
}
//--------------------------------------------------
void programmerAppartement(byte numero)
//--------------------------------------------------
{
float coef = lireCoefficientTemps();
appartement[numero].etat = random(2);
digitalWrite(brocheLed[numero],
appartement[numero].etat);
appartement[numero].prochainChangement =
millis() + tempsAleatoire(coef);
}
//--------------------------------------------------
void setup()
//--------------------------------------------------
{
randomSeed(analogRead(A0));
for (byte i = 0; i < NB_LEDS; i++)
{
pinMode(brocheLed[i], OUTPUT);
digitalWrite(brocheLed[i], LOW);
}
for (byte i = 0; i < NB_LEDS; i++)
{
programmerAppartement(i);
}
}
//--------------------------------------------------
void loop()
//--------------------------------------------------
{
unsigned long maintenant = millis();
for (byte i = 0; i < NB_LEDS; i++)
{
if ((long)(maintenant -
appartement[i].prochainChangement) >= 0)
{
programmerAppartement(i);
}
}
}