1306
Débuter / Re : Objets et répétition d'objets
« le: février 20, 2015, 08:51:36 pm »
Exactement
Le forum LOCODUINO est consacré aux discussions ayant trait à l'utilisation de l'Arduino dans les automatismes et les animations pour le train miniature. Nous avons eu récemment quelques inscriptions de personnes ayant des projets plus généraux mais surtout inapplicables au train miniature. Si votre projet ou vos questions ne concernent pas le modélisme ferroviaire, ne vous inscrivez pas, vous perdriez votre temps et nous aussi.
Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.
const unsigned long dureeDuTick = 1;
const byte pinLedVerte = 3;
unsigned long temps()
{
return millis()/dureeDuTick;
}
enum { ETEINT1, AUGMENTATION1, ALLUME1, DIMINUTION1, ETEINT2, AUGMENTATION2, ALLUME2, DIMINUTION2 };
struct eclairage {
const byte pin; /* pin de PWM */
byte etat;
unsigned long duree;
unsigned long dateChargementduree;
unsigned long dateChargementIntervallePWM;
unsigned long intervallePWM; /* nombre de ticks entre 2 changement de PWM */
byte valeurPWM;
const int dureeEteint1;
const int dureeAugmentation1;
const int dureeAllume1;
const int dureeDiminution1;
const int dureeEteint2;
const int dureeAugmentation2;
const int dureeAllume2;
const int dureeDiminution2;
};
void afficheEtatEclairage(byte etat)
{
switch (etat)
{
case ETEINT1: Serial.print("ETEINT-1"); break;
case AUGMENTATION1: Serial.print("AUGMENTATION-1"); break;
case ALLUME1: Serial.print("ALLUME-1"); break;
case DIMINUTION1: Serial.print("DIMINUTION-1"); break;
case ETEINT2: Serial.print("ETEINT-2"); break;
case AUGMENTATION2: Serial.print("AUGMENTATION-2"); break;
case ALLUME2: Serial.print("ALLUME-2"); break;
case DIMINUTION2: Serial.print("DIMINUTION-2"); break;
default: Serial.print("etat inconnu");
}
}
void afficheEclairage(struct eclairage& lumiere)
{
Serial.print("date:"); Serial.print(temps()); Serial.print(", ");
Serial.print(lumiere.pin); Serial.print(", "); afficheEtatEclairage(lumiere.etat); Serial.print(", ");
Serial.print("duree="); Serial.print(lumiere.duree);
Serial.print(", progression="); Serial.print(temps() - lumiere.dateChargementduree);
Serial.println();
}
struct eclairage ledVerte = { pinLedVerte, ETEINT1, 25200, 0, 0, 0, 0, 30600, 7200, 0, 10800, 18000, 7200, 6400, 7200 };
void gereEclairage(struct eclairage& lumiere)
{
unsigned long dateCourante = temps();
switch (lumiere.etat) {
case ETEINT1:
if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
{
lumiere.dateChargementduree = dateCourante;
lumiere.duree = lumiere.dureeAugmentation1;
lumiere.etat = AUGMENTATION1;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeAugmentation1 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case AUGMENTATION1:
if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
{
lumiere.dateChargementduree = dateCourante;
lumiere.duree = lumiere.dureeAllume1;
lumiere.etat = ALLUME1;
lumiere.valeurPWM = 255;
}
else if (dateCourante - lumiere.dateChargementIntervallePWM > lumiere.intervallePWM)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM++;
}
break;
case ALLUME1:
if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
{
lumiere.dateChargementduree = dateCourante;
lumiere.duree = lumiere.dureeDiminution1;
lumiere.etat = DIMINUTION1;
lumiere.valeurPWM = 255;
lumiere.intervallePWM = lumiere.dureeDiminution1 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case DIMINUTION1:
if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
{
lumiere.dateChargementduree = dateCourante;
lumiere.duree = lumiere.dureeEteint2;
lumiere.etat = ETEINT2;
lumiere.valeurPWM = 0;
}
else if (dateCourante - lumiere.dateChargementIntervallePWM > lumiere.intervallePWM)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM--;
}
break;
case ETEINT2:
if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
{
lumiere.dateChargementduree = dateCourante;
lumiere.duree = lumiere.dureeAugmentation2;
lumiere.etat = AUGMENTATION2;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeAugmentation2 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case AUGMENTATION2:
if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
{
lumiere.dateChargementduree = dateCourante;
lumiere.duree = lumiere.dureeAllume2;
lumiere.etat = ALLUME2;
lumiere.valeurPWM = 255;
}
else if (dateCourante - lumiere.dateChargementIntervallePWM > lumiere.intervallePWM)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM++;
analogWrite(lumiere.pin, lumiere.valeurPWM);
}
break;
case ALLUME2:
if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
{
lumiere.dateChargementduree = dateCourante;
lumiere.duree = lumiere.dureeDiminution2;
lumiere.etat = DIMINUTION2;
lumiere.valeurPWM = 255;
lumiere.intervallePWM = lumiere.dureeDiminution2 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case DIMINUTION2:
if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
{
lumiere.dateChargementduree = dateCourante;
lumiere.duree = lumiere.dureeEteint1;
lumiere.etat = ETEINT1;
lumiere.valeurPWM = 0;
}
else if (dateCourante - lumiere.dateChargementIntervallePWM > lumiere.intervallePWM)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM--;
}
break;
}
analogWrite(lumiere.pin, lumiere.valeurPWM);
}
void setup() {
Serial.begin(9600);
afficheEclairage(ledVerte);
pinMode(ledVerte.pin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
gereEclairage(ledVerte);
static unsigned long dateAff = 0;
unsigned long date = millis();
if (date - dateAff > 1000)
{
afficheEclairage(ledVerte);
dateAff = date;
}
}
... il faut passer par d'autres langages. Ne connaissant pas le C#, j'ai peur de pas tout comprendre.
const unsigned long dureeDuTick = 1000;
unsigned long temps()
{
return millis()/dureeDuTick;
}
enum { ETEINT1, AUGMENTATION1, ALLUME1, DIMINUTION1, ETEINT2, AUGMENTATION2, ALLUME2, DIMINUTION2 };
struct eclairage {
const byte pin; /* pin de PWM */
byte etat;
byte valeurPWM;
byte intervallePWM; /* nombre de ticks entre 2 changement de PWM */
unsigned long chronometre;
const int dureeEteint1;
const int dureeAugmentation1;
const int dureeAllume1;
const int dureeDiminution1;
const int dureeEteint2;
const int dureeAugmentation2;
const int dureeAllume2;
const int dureeDiminution2;
};
struct eclairage ledVerte = { pinLedVerte, ETEINT1, 0, 25200, 30600, 7200, 0, 10800, 18000, 7200, 6400, 7200 };
void gereEclairage(struct eclairage& lumiere)
{
unsigned long dateCourante = millis();
switch (lumiere.etat) {
case ETEINT1:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeAugmentation1;
lumiere.etat = AUGMENTATION1;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeAugmentation1 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case AUGMENTATION1:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeAllume1;
lumiere.etat = ALLUME1;
lumiere.valeurPWM = 255;
}
else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM++;
analogWrite(lumiere.pin, lumiere.valeurPWM);
}
break;
case ALLUME1:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeDiminution1;
lumiere.etat = DIMINUTION1;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeDiminution1 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case DIMINUTION1:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeEteint2;
lumiere.etat = ETEINT2;
lumiere.valeurPWM = 0;
}
else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM--;
}
break;
case ETEINT2:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeAugmentation2;
lumiere.etat = AUGMENTATION2;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeAugmentation2 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case AUGMENTATION2:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeAllume2;
lumiere.etat = ALLUME2;
lumiere.valeurPWM = 255;
}
else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM++;
analogWrite(lumiere.pin, lumiere.valeurPWM);
}
break;
case ALLUME2:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeDiminution2;
lumiere.etat = DIMINUTION2;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeDiminution2 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case DIMINUTION2:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeEteint1;
lumiere.etat = ETEINT1;
lumiere.valeurPWM = 0;
}
else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM--;
}
break;
}
analogWrite(lumiere.pin, lumiere.valeurPWM);
}
void setup() {
pinMode(ledVerte.pin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
gereEclairage(ledVerte);
}
const unsigned long dureeDuTick = 1000;
const byte pinLedVerte = 3;
unsigned long temps()
{
return millis()/dureeDuTick;
}
enum { ETEINT1, AUGMENTATION1, ALLUME1, DIMINUTION1, ETEINT2, AUGMENTATION2, ALLUME2, DIMINUTION2 };
struct eclairage {
const byte pin; /* pin de PWM */
byte etat; /* etat : ETEINT, AUGMENTATION, ALLUME, DIMINUTION */
unsigned long chronometre;
unsigned long dateChargementChronometre;
unsigned long dateChargementIntervallePWM;
unsigned long intervallePWM; /* nombre de ticks entre 2 changement de PWM */
byte valeurPWM;
const int dureeEteint1;
const int dureeAugmentation1;
const int dureeAllume1;
const int dureeDiminution1;
const int dureeEteint2;
const int dureeAugmentation2;
const int dureeAllume2;
const int dureeDiminution2;
};
struct eclairage ledVerte = { pinLedVerte, ETEINT1, 25200, 0, 0, 0, 0, 30600, 7200, 0, 10800, 18000, 7200, 6400, 7200 };
void gereEclairage(struct eclairage& lumiere)
{
unsigned long dateCourante = millis();
switch (lumiere.etat) {
case ETEINT1:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeAugmentation1;
lumiere.etat = AUGMENTATION1;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeAugmentation1 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case AUGMENTATION1:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeAllume1;
lumiere.etat = ALLUME1;
lumiere.valeurPWM = 255;
}
else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM++;
analogWrite(lumiere.pin, lumiere.valeurPWM);
}
break;
case ALLUME1:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeDiminution1;
lumiere.etat = DIMINUTION1;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeDiminution1 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case DIMINUTION1:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeEteint2;
lumiere.etat = ETEINT2;
lumiere.valeurPWM = 0;
}
else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM--;
}
break;
case ETEINT2:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeAugmentation2;
lumiere.etat = AUGMENTATION2;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeAugmentation2 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case AUGMENTATION2:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeAllume2;
lumiere.etat = ALLUME2;
lumiere.valeurPWM = 255;
}
else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM++;
analogWrite(lumiere.pin, lumiere.valeurPWM);
}
break;
case ALLUME2:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeDiminution2;
lumiere.etat = DIMINUTION2;
lumiere.valeurPWM = 0;
lumiere.intervallePWM = lumiere.dureeDiminution2 / 255;
lumiere.dateChargementIntervallePWM = dateCourante;
}
break;
case DIMINUTION2:
if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
{
lumiere.dateChargementChronometre = dateCourante;
lumiere.chronometre = lumiere.dureeEteint1;
lumiere.etat = ETEINT1;
lumiere.valeurPWM = 0;
}
else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
{
lumiere.dateChargementIntervallePWM = dateCourante;
lumiere.valeurPWM--;
}
break;
}
analogWrite(lumiere.pin, lumiere.valeurPWM);
}
void setup() {
pinMode(ledVerte.pin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
gereEclairage(ledVerte);
}