la suite du post precedent
Voici le résultat de la mesure de la vitesse et la deceleration avec excel, du programme precedent
Pas envie de mettre 2 fils d’alimentation et 1 fil de communication entre le compteur et l’éclairage arrière entre le compteur et la partie éclairage arrière. Donc une commination série Bluetooth HC06 a été choisie. Il sera possible d’indiquer sur le compteur rétroéclairer, l’état de la batterie arrière.
Le code de la récepteur et qui gère le clignotement
#include
#include
//#include
#define led12 12 //
#define led11 11 //
#define led10 10 //
byte temps12=0;
byte temps11=0;
byte temps10=0;
byte c=0;
bool flag12=0;
bool flag11=0;
bool flag10=0;
bool flagnight=0;
void setup() {
pinMode(led12, OUTPUT); //lumiere gauche, direction
pinMode(led11, OUTPUT); //lumiere centrale, stop et eclairage
pinMode(led10, OUTPUT); //lumiere gauche, direction
Serial.begin(9600);
//SoftwareSerial Serial(0, 1); // RX, TX mais il n'y a pas trop le choix sur la nano
Timer1.initialize(400000); // initialize timer1, and set a 0,1 second period => 100 000 pour 0.01s 10 000
Timer1.attachInterrupt(Routinetimer1); // attaches le sous programme Routinetimer1 as a timer overflow interrupt
}//fin setup
// Interruptions tous les 400ms fait par le timer1***********************************
void Routinetimer1() {
temps12++;
temps11++;
temps10++;
if (temps12<15 && flag12==1) {if ( digitalRead(12)== 1 ) {digitalWrite(12,LOW);} else {digitalWrite(12,HIGH);}} //clignotement pendant 15=6s/0.4s gauche
if (temps12>15 && flag12==1) {flag12=0;digitalWrite(led12,LOW);}
if (temps10<15 && flag10==1) {if ( digitalRead(10)== 1 ) {digitalWrite(10,LOW);} else {digitalWrite(10,HIGH);}} //clignotement pendant 15=6s/0.4s droite
if (temps10>15 && flag10==1) {flag10=0;digitalWrite(led10,LOW);}
if (temps11<15 && flag11==1) {if ( digitalRead(11)== 1 ) {digitalWrite(11,LOW);} else {digitalWrite(11,HIGH);}} //clignotement pendant 15=6s/0.4s stop
if (temps11>15 && flag11==1) {flag11=0;
if (flagnight==1) {digitalWrite(11,HIGH);}
if (flagnight==0) {digitalWrite(11,LOW);}
}
}//fin routineinterruption
///////////////////////////////////////////// Boucle correspondant à la fonction main
void loop() {
while (Serial.available()) { c=Serial.read();//Serial.print(c,DEC);
if (c==48) {digitalWrite(led11,LOW);flagnight=0;} //0 arret en continu
if (c==49) {digitalWrite(led12,HIGH);digitalWrite(led10,LOW);flag12=1;flag10=0;temps12=0;} //1 direction gauche +5s
if (c==50) {digitalWrite(led11,HIGH);flag11=1;temps11=0;} //2 feu stop
if (c==51) {digitalWrite(led10,HIGH);digitalWrite(led12,LOW);flag10=1;flag12=0;temps10=0;} //3 direction droite +5s
if (c==52) {digitalWrite(led11,HIGH);flagnight=1;} //4 allumage en continu
}
} // fin loop
A la place de faire de nombreux essais, sur le vélo pour vérifier le programme de la mesure vitesse et de la décélération, un Arduino génère les impulsions de l’aimant.
Voici le code du générateur de front qui fait varier la vitesse pour verifier le bon fonctionnement du programme
#include
#include
#include
#include
#define led12 12 //
LiquidCrystal lcd(9, 3, 4, 5, 6, 7); // LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Configuration des variables
unsigned int temps=0;
unsigned int tempsmono=0;
float tempsperiode=0;
float tempsdecelerat;
float tempsdec=0;
float a=0;
float b=0;
float deceleration;
bool flag;
// the setup function runs once when you press reset or power the board
void setup() {
pinMode(led12, OUTPUT); //
Serial.begin(9600); //57600
Timer1.initialize(1000); // initialize timer1, and set a 0,1 second period => 100 000 pour 0.01s 10 000
Timer1.attachInterrupt(Routinetimer1); // attaches le sous programme Routinetimer1 as a timer overflow interrupt
TCCR2B = (TCCR2B & 0b11111000) | 0x01; //pin 3 32khz
a=0.144; //((400-40)/tdecel); 400 correspond à 4.5km/h , 40 à 45km/h utilsation 4 aimants (4.5-45)/(2.5s*3.6)=4.5m/s^2
b=40; //coefficient de le deceleration
Serial.print(a,3);
Serial.print(";");
Serial.println(b,3) ;
}//fin setup
// Interruptions tous les 1ms fait par le timer1***********************************
void Routinetimer1() {
temps++;
tempsperiode++;
tempsmono++;
//*
if (tempsperiode<50) {deceleration=2000;} //creation profil acceleration et decele
if (tempsperiode>=50 && tempsperiode<2500) {deceleration=-0.2*(tempsperiode-50)+400;
if (deceleration<40) {deceleration=40;}
} //acceleration
if (tempsperiode>=2500 && tempsperiode<3500) {deceleration=40;}
if (tempsperiode>=3500 && tempsperiode<6000) {deceleration=a*(tempsperiode-3500)+b;} //deceleration
if (tempsperiode>=6000 && tempsperiode<7000 ) {deceleration=1000;}
if (tempsperiode>=7000) {tempsperiode=0;}
//*/
//Serial.print(tempsperiode,0) ;
//Serial.print(";");
//Serial.println(deceleration,0) ;
//deceleration=40; //4 aimants, 400=>4.5km/h 40=>45km/h valeur fixe de vitesse
if (temps>=deceleration && flag==0) {digitalWrite(led12,HIGH);tempsmono=0;flag=1;temps=0; } //monostable=10ms
if (flag==1 && tempsmono>=4) {digitalWrite(led12,LOW);flag=0;}
}//fin routineinterruption
///////////////////////////////////////////// Boucle correspondant à la fonction main
void loop() {
} // fin loop
Avec la batterie, du compteur, on pourrait faire aussi un éclairage blanc vers l’avant Mais, cela sera une autre histoire….