Code indenting
This commit is contained in:
parent
e676f62d8e
commit
1b5810d4a1
165
stroboduino.ino
165
stroboduino.ino
|
@ -3,112 +3,129 @@ char Ver[] = "Ver.du 3_10_16";
|
|||
//Attend 360° pour declencher le flash (180° pour 2 temps)
|
||||
//Ceci autorise un éventuel retard à l'allumage
|
||||
//Nota: tracer un repère à 180° sur la poulie pour un 2 temps
|
||||
//*****************Ajustables si necesssaire*****************
|
||||
int cycle = 4; // 4 pour 4temps ou 2 pour 2temps
|
||||
int D_Flash = 10; //Durée du flash en µs, autour de 10µs
|
||||
//C'est un compromis entre précision(faible étalement du spot ) et luminosité
|
||||
//*********************************************************
|
||||
|
||||
#include <LiquidCrystal.h>//lcd.begin(16, 2);lcd.clear();colonnes 0-15,lignes 0-1
|
||||
//lcd.setCursor(15,0)= col 15, ligne 0;lcd.print(" text");
|
||||
LiquidCrystal lcd(9, 17, 15, 16, 14, 10); // On instancie un lcd
|
||||
// pins: R/S ==A0, Enable==A1, puis D4-D7==A2, A3, A4, A5 Ne pas oublier
|
||||
// l'eclairage (pin 15 et 16 du LCD), et le contraste à 0.5v environ, pin 3 du LCD
|
||||
#define Etin 8 //une éticelle donne un front descendant
|
||||
#define Inter 5 //Inter du codeur
|
||||
#define Flash 6 //Flash
|
||||
#define Codeur_A 4 //D2 pour entrée codeur A sous interruption
|
||||
#define Codeur_B 3 //D3 pour entrée codeur B
|
||||
//*****************Les variables******************************
|
||||
int signed long T = 0; //Periode en cours(signée pour le calcul de D_deg)
|
||||
int signed long Ts2 = 0;//Periode en cours/2
|
||||
|
||||
//-----------------------------------------------------------
|
||||
// CONSTANTES
|
||||
//-----------------------------------------------------------
|
||||
int cycle = 4; // 4 pour 4temps ou 2 pour 2temps
|
||||
int D_Flash = 10; //Durée du flash en µs, autour de 10µs
|
||||
|
||||
#define Etin 8 //une éticelle donne un front descendant
|
||||
#define Inter 5 //Inter du codeur
|
||||
#define Flash 6 //Flash
|
||||
#define Codeur_A 4 //D2 pour entrée codeur A sous interruption
|
||||
#define Codeur_B 3 //D3 pour entrée codeur B
|
||||
|
||||
//------------------------------------------------------------
|
||||
// VARIABLES
|
||||
//------------------------------------------------------------
|
||||
|
||||
int signed long T = 0; //Periode en cours(signée pour le calcul de D_deg)
|
||||
int signed long Ts2 = 0; //Periode en cours/2
|
||||
int unsigned long prec_H = 0; //Heure du front precedent en µs
|
||||
int unsigned long D_deg = 0;//Délai pour deg_dem degrès en µs,environ T/2, donc tj > 0
|
||||
int unsigned long N = 0; //N en tours/mn, peut monter à plus de 44 000, 4 temps
|
||||
int unsigned long Nc = 0; //Pour le calcul de N
|
||||
int signed deg_dem = 0; //Compteur des degrés demandés,affiché au LCD, <=0 possible
|
||||
int signed deg_Inc = 0; //Increment en degrès 0,-1ou +1
|
||||
int deg_Initial = 10; //Affiché au demarrage
|
||||
int T_min = 20000;//En µs,lié à limite de la fonction delayMicroseconds() <16383
|
||||
int milli_delay = 0; //Delai en ms, T > T_min
|
||||
int micro_delay = 0; //Delai en µs, T > T_min
|
||||
int tcor1 = 10;//Correctif attente avant flash en µs, N>6000t/mn 4 temps
|
||||
int tcor2 = 70;//Correctif attente avant flash en µs, N<6000t/mn 4 temps
|
||||
int debug = 0; //Variable pour debug, optionelle
|
||||
////////////********Les Fonctions******************************
|
||||
void Affic_N_et_deg_dem() //Fond d'ecran inchangé,durée environ 7.5ms
|
||||
{ N = Nc / T ; //Calculer N en t/mn, 2 ou 4temps
|
||||
lcd.setCursor(0, 0); lcd.print(" ");//Nettoyer
|
||||
int unsigned long D_deg = 0; //Délai pour deg_dem degrès en µs,environ T/2, donc tj > 0
|
||||
int unsigned long N = 0; //N en tours/mn, peut monter à plus de 44 000, 4 temps
|
||||
int unsigned long Nc = 0; //Pour le calcul de N
|
||||
int signed deg_dem = 0; //Compteur des degrés demandés,affiché au LCD, <=0 possible
|
||||
int signed deg_Inc = 0; //Increment en degrès 0,-1ou +1
|
||||
int deg_Initial = 10; //Affiché au demarrage
|
||||
int T_min = 20000; //En µs,lié à limite de la fonction delayMicroseconds() <16383
|
||||
int milli_delay = 0; //Delai en ms, T > T_min
|
||||
int micro_delay = 0; //Delai en µs, T > T_min
|
||||
int tcor1 = 10; //Correctif attente avant flash en µs, N>6000t/mn 4 temps
|
||||
int tcor2 = 70; //Correctif attente avant flash en µs, N<6000t/mn 4 temps
|
||||
int debug = 0; //Variable pour debug, optionelle
|
||||
|
||||
|
||||
//-------------------------------------------------------------
|
||||
// FONCTIONS
|
||||
//-------------------------------------------------------------
|
||||
|
||||
void Affic_N_et_deg_dem() //Fond d'ecran inchangé,durée environ 7.5ms
|
||||
{ N = Nc / T ; //Calculer N en t/mn, 2 ou 4temps
|
||||
lcd.setCursor(0, 0); lcd.print(" "); //Nettoyer
|
||||
lcd.setCursor(0, 0); lcd.print(N);
|
||||
lcd.setCursor(0, 1); lcd.print(" ");//Nettoyer
|
||||
lcd.setCursor(0, 1); lcd.print(" "); //Nettoyer
|
||||
lcd.setCursor(0, 1); lcd.print(deg_dem);
|
||||
deg_dem = deg_dem + deg_Inc;//Si le codeur a été tourneé, deg_Inc = +1 ou -1
|
||||
deg_dem = deg_dem + deg_Inc; //Si le codeur a été tourneé, deg_Inc = +1 ou -1
|
||||
}
|
||||
void Delai_et_Flash() //Delai puis flash
|
||||
|
||||
void Delai_et_Flash() //Delai puis flash
|
||||
{
|
||||
if (T < T_min) //Verifier si la fonction dalayMicroseconds() est suffisante
|
||||
if (T < T_min) //Verifier si la fonction dalayMicroseconds() est suffisante
|
||||
{
|
||||
delayMicroseconds(D_deg - tcor1); //Attendre avant flash
|
||||
delayMicroseconds(D_deg - tcor1); //Attendre avant flash
|
||||
digitalWrite (Flash, 1); delayMicroseconds(D_Flash); digitalWrite (Flash, 0);
|
||||
}
|
||||
else {//pc(T);
|
||||
milli_delay = ((D_deg / 1000) - 2);//Pour ces D_deg longs, delayMicroseconds(D_deg)ne convient plus.
|
||||
else {
|
||||
//pc(T);
|
||||
milli_delay = ((D_deg / 1000) - 2); //Pour ces D_deg longs, delayMicroseconds(D_deg)ne convient plus.
|
||||
micro_delay = (D_deg - (milli_delay * 1000));
|
||||
delay(milli_delay); //D'abord les ms
|
||||
delayMicroseconds(micro_delay - tcor2); //puis les µs
|
||||
delay(milli_delay); //D'abord les ms
|
||||
delayMicroseconds(micro_delay - tcor2); //puis les µs
|
||||
digitalWrite (Flash, 1); delayMicroseconds(D_Flash); digitalWrite (Flash, 0);
|
||||
}
|
||||
}
|
||||
void IniT()////////////////////while (1); delay(1000);////////////////////////////
|
||||
|
||||
void IniT()
|
||||
{ attachInterrupt(1, isr_Rotation_Codeur, FALLING);
|
||||
// interrupt 0 (pin D2), front de Codeur_A, préferable au front montant
|
||||
lcd.clear(); lcd.print(" Bienvenue"); lcd.setCursor(1, 1);
|
||||
lcd.setCursor(0, 1); lcd.print("PhL"); delay(1000);
|
||||
lcd.clear(); lcd.print(" Stroboduino");
|
||||
lcd.setCursor(0, 1); lcd.print(Ver); //N° de version
|
||||
delay(3000); // Ecran d'accueil pour 3s
|
||||
lcd.setCursor(0, 1); lcd.print(Ver); //N° de version
|
||||
delay(3000); // Ecran d'accueil pour 3s
|
||||
lcd.clear(); lcd.print(" t/mn: ");
|
||||
lcd.setCursor(0, 1); lcd.print(" Degres: ");
|
||||
Nc = 30000000 * cycle; //Pour calcul de N à partir de T
|
||||
cycle = cycle * 180; // 360 pour 2 temps, 720 pour 4 temps, dans calcul de D_deg
|
||||
deg_dem = deg_Initial; T = 15000; D_deg = T / 2; //Pour le premier affichage de N
|
||||
Nc = 30000000 * cycle; //Pour calcul de N à partir de T
|
||||
cycle = cycle * 180; // 360 pour 2 temps, 720 pour 4 temps, dans calcul de D_deg
|
||||
deg_dem = deg_Initial; T = 15000; D_deg = T / 2; //Pour le premier affichage de N
|
||||
Affic_N_et_deg_dem();
|
||||
}
|
||||
void isr_Rotation_Codeur ()////////////////////while (1); delay(1000);/////
|
||||
{ if (digitalRead(Codeur_A) == digitalRead(Codeur_B))deg_Inc = 1;
|
||||
//On tourne dans le sens horaire
|
||||
else deg_Inc = -1;//On tourne dans le sens anti-horaire
|
||||
|
||||
void isr_Rotation_Codeur ()
|
||||
{ if (digitalRead(Codeur_A) == digitalRead(Codeur_B))deg_Inc = 1; //On tourne dans le sens horaire
|
||||
else deg_Inc = -1; //On tourne dans le sens anti-horaire
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600); //Pour debug
|
||||
lcd.begin(8, 2);//16 colonnes, 2 lignes
|
||||
pinMode(Etin, INPUT_PULLUP);//Entrée du front mise à la masse par le thyristor
|
||||
pinMode(Inter, INPUT_PULLUP);//Le codeur met son inter à la masse quand poussé
|
||||
pinMode(Flash, OUTPUT);// Sortie vers la led
|
||||
pinMode(Codeur_A, INPUT_PULLUP);//Entrée du front sur INT 0
|
||||
pinMode(Codeur_B, INPUT_PULLUP);//
|
||||
IniT();//Attachera l'isr à l'interruption IT 0
|
||||
Serial.begin(9600); //Pour debug
|
||||
lcd.begin(8, 2); //16 colonnes, 2 lignes
|
||||
pinMode(Etin, INPUT_PULLUP); //Entrée du front mise à la masse par le thyristor
|
||||
pinMode(Inter, INPUT_PULLUP); //Le codeur met son inter à la masse quand poussé
|
||||
pinMode(Flash, OUTPUT); // Sortie vers la led
|
||||
pinMode(Codeur_A, INPUT_PULLUP); //Entrée du front sur INT 0
|
||||
pinMode(Codeur_B, INPUT_PULLUP);
|
||||
IniT(); //Attachera l'isr à l'interruption IT 0
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
while (digitalRead(Etin) == 1); //Attendre descente d'un front d'etincelle
|
||||
prec_H = micros(); //heure de début de cette periode
|
||||
Delai_et_Flash();//Emettre le flash après attente D_deg
|
||||
// pc(T);pc(D_deg);
|
||||
while (digitalRead(Etin) == 0); //Attendre remontée du signal d'etincelle
|
||||
while (digitalRead(Etin) == 1); //Attendre descente du prochain front d'etincelle
|
||||
T = micros() - prec_H; //Descendu, calculer T
|
||||
Delai_et_Flash();//Emettre le flash après attente D_deg
|
||||
Ts2 = T / 2; //On emettra le flash environ 360° après l'étincelle (4temps) ou 180°(2 temps)
|
||||
D_deg = float(T * deg_dem) / float(cycle) + Ts2; //Délai en µs pour les degrés demandés,2 ou 4 temps
|
||||
Affic_N_et_deg_dem();//Cette fonction dure 7.5ms environ, donc à partir de 8000t/mn(4temps)
|
||||
//l'étincelle immédiatement suivante n'est pas detectée donc le flash manque 1 fois sur 3.
|
||||
deg_Inc = 0;//RAZ de l'increment des degrés
|
||||
if (digitalRead(Inter) == 0) //Si l'inter du codeur est poussé, geler l'affichage
|
||||
{ delay(1000); while (digitalRead(Inter) == 0);//Encore poussé, attendre
|
||||
delay(500); //Continuer
|
||||
while (digitalRead(Etin) == 1); //Attendre descente d'un front d'etincelle
|
||||
prec_H = micros(); //heure de début de cette periode
|
||||
Delai_et_Flash(); //Emettre le flash après attente D_deg
|
||||
// pc(T);pc(D_deg);
|
||||
while (digitalRead(Etin) == 0); //Attendre remontée du signal d'etincelle
|
||||
while (digitalRead(Etin) == 1); //Attendre descente du prochain front d'etincelle
|
||||
T = micros() - prec_H; //Descendu, calculer T
|
||||
Delai_et_Flash(); //Emettre le flash après attente D_deg
|
||||
Ts2 = T / 2; //On emettra le flash environ 360° après l'étincelle (4temps) ou 180°(2 temps)
|
||||
D_deg = float(T * deg_dem) / float(cycle) + Ts2; //Délai en µs pour les degrés demandés,2 ou 4 temps
|
||||
Affic_N_et_deg_dem(); //Cette fonction dure 7.5ms environ, donc à partir de 8000t/mn(4temps)
|
||||
//l'étincelle immédiatement suivante n'est pas detectée donc le flash manque 1 fois sur 3.
|
||||
deg_Inc = 0; //RAZ de l'increment des degrés
|
||||
if (digitalRead(Inter) == 0) //Si l'inter du codeur est poussé, geler l'affichage
|
||||
{ delay(1000); while (digitalRead(Inter) == 0); //Encore poussé, attendre
|
||||
delay(500); //Continuer
|
||||
}
|
||||
while (digitalRead(Etin) == 0); //Attendre remontée du signal d'etincelle
|
||||
while (digitalRead(Etin) == 0); //Attendre remontée du signal d'etincelle
|
||||
}
|
||||
|
||||
//**********************************************************
|
||||
//Macro ps(v) de debug pour imprimer le numero de ligne, le nom d'une variable, sa valeur
|
||||
//puis s'arreter definitivement
|
||||
|
|
Loading…
Reference in New Issue