bonjour,
je suis en classe de terminal sti2d en SIN et je suis sur le projet d'un suiveur solaire mon but et de mettre en position de securité mon panneau solaire (90°) en cas de vent fort a l'aide d'un anémomètre de chez lextronix et d'un actionneur la partie anémomètre m'affiche toujours 0km/h
voici mon programme
const float pi = 3.14159265; // Nombre Pi
int period = 1000; // Période de mesure (miliseconde)
int delaytime = 10000; // Temps entre les mesures (miliseconde)
int radio = 70 ; // Distance du centre au capteur (mm)
unsigned int Sample = 0; // Mesure a 0
unsigned int counter = 0; // compteur
unsigned int RPM = 0; // Tours par minute
float speedwind = 0; // Vitesse du vent (km/h)
int motor = 3;
int addcount = 0
int vitmax = 10; //vitesse du vent max au dela de laquelle mise en securité
void setup()
{
pinMode(2, INPUT);
pinMode(motor, OUTPUT);
Serial.begin(115200); //Port série a 115200 baud
Serial.println("Anemometre");
Serial.println("**********");
Serial.print(" Mesure toutes les secondes : ");
Serial.println();
}
void loop()
{
Sample++;
windvelocity();
RPMcalc();
WindSpeed();
Serial.print(speedwind);
Serial.print(" [km/h] ");
Serial.println();
delay(5000);
Serial.print(" Mesure suivante... ");
Serial.println();
}
// Mesurer la vitesse du vent
void windvelocity(){
speedwind = 0;
counter = 0;
attachInterrupt(0, addcount, CHANGE);
unsigned long millis();
long startTime = millis();
while(millis() < startTime + period) {
}
detachInterrupt(1);
}
void RPMcalc(){
RPM=((counter/2)*60)/(period/1000); // Calculer tours par minute (RPM)
}
void WindSpeed(){
speedwind = ((((2 * pi * radio * RPM)/60) / 1000) / 1000) * 3600; // Calculer la vitesse du vent en km/h
voici le programme que je pense ca pourrais etre le programme final mais j'ai tester que l'anemometre et il affiche 0 km/h a chaque mesure
const float pi = 3.14159265; // Nombre Pi
int period = 1000; // Période de mesure (miliseconde)
int delaytime = 10000; // Temps entre les mesures (miliseconde)
int radio = 70 ; // Distance du centre au capteur (mm)
unsigned int Sample = 0; // Mesure a 0
unsigned int counter = 0; // compteur
unsigned int RPM = 0; // Tours par minute
float speedwind = 0; // Vitesse du vent (km/h)
int motor = 3;
int addcount = 0
int vitmax = 10; //vitesse du vent max au dela de laquelle mise en securité
void setup()
{
pinMode(2, INPUT);
pinMode(motor, OUTPUT);
Serial.begin(115200); //Port série a 115200 baud
Serial.println("Anemometre");
Serial.println("**********");
Serial.print(" Mesure toutes les secondes : ");
Serial.println();
}
void loop()
{
Sample++;
windvelocity();
RPMcalc();
WindSpeed();
Serial.print(speedwind);
Serial.print(" [km/h] ");
Serial.println();
delay(5000);
Serial.print(" Mesure suivante... ");
Serial.println();
}
// Mesurer la vitesse du vent
void windvelocity(){
speedwind = 0;
counter = 0;
attachInterrupt(0, addcount, CHANGE);
unsigned long millis();
long startTime = millis();
while(millis() < startTime + period) {
}
detachInterrupt(1);
}
void RPMcalc(){
RPM=((counter/2)*60)/(period/1000); // Calculer tours par minute (RPM)
}
void WindSpeed(){
speedwind = ((((2 * pi * radio * RPM)/60) / 1000) / 1000) * 3600; // Calculer la vitesse du vent en km/h
if (speedwind > vitmax)
{
Serial.print(speedwind);
Serial.print(" [km/h] ");
Serial.print(" mise en securite car vitmax [km/h] < ");
digitalWrite(motor, HIGH);
delay(5000);
digitalWrite(motor, LOW);
}
else{
digitalWrite(motor, LOW);
}
}
void addcount(){
counter++;
}
En supposant que c'est bien ce programme que tu utilises (ce qui me fait douter c'est que ce programme donne des erreurs de compilation), si tu obtiens 0 c'est que tu as un problème de connexion de ton anémomètre.
j'ai fait le câblage et mon prof a dis qu'il étais bon je pense que c'est un problème dans le programme mais je sais pas quel est le problème
j'ai déjà beaucoup de difficulté a comprendre et a codé en C
Bonjour,
la variable counter étant modifiée dans une interruption il faut commencer par la déclarer en volatile, ensuite tu peux l'afficher pour voir si elle évolue vraiment ...
"la variable counter étant modifiée dans une interruption il faut commencer par la déclarer en volatile, ensuite tu peux l'afficher pour voir si elle évolue vraiment ..."
C'est un int (16 bits: déjà, comme on ne peut pas remonter le temps , j'en ferais un unsigned int ou uint16_t); que se passe-t-il si, lors de l'affichage (ou de l'utilisation), la moitié a déjà été affichée, l'interruption arrête, met à jour et qu'on reprend l'affichage?
dbrion06:
... que se passe-t-il si, lors de l'affichage (ou de l'utilisation), la moitié a déjà été affichée, l'interruption arrête, met à jour et qu'on reprend l'affichage?
cela ne peut pas arriver puisqu'il détache l'interruption avant de faire les calculs
du coup ceci est que la partie anémomètre qui doit afficher la vitesse du vent en km/h est ce que le programme parait bon pour l'affichage correct de la vitesse du vent?
const float pi = 3.14159265; // Nombre Pi
int period = 1000; // Période de mesure (miliseconde)
int delaytime = 10000; // Temps entre les mesures (miliseconde)
int radio = 70 ; // Distance du centre au capteur (mm)
unsigned int Sample = 0; // Mesure a 0
volatile int counter = 0; // compteur
unsigned int RPM = 0; // Tours par minute
float speedwind = 0; // Vitesse du vent (km/h)
int motor = 3;
int addcount = 0
int vitmax = 10; //vitesse du vent max au dela de laquelle mise en securité
void setup()
{
pinMode(2, INPUT);
pinMode(motor, OUTPUT);
Serial.begin(115200); //Port série a 115200 baud
Serial.println("Anemometre");
Serial.println("**********");
Serial.print(" Mesure toutes les secondes : ");
Serial.println();
}
void loop()
{
Sample++;
windvelocity();
RPMcalc();
WindSpeed();
Serial.print(speedwind);
Serial.print(" [km/h] ");
Serial.println();
delay(5000);
Serial.print(" Mesure suivante... ");
Serial.println();
}
// Mesurer la vitesse du vent
void windvelocity(){
speedwind = 0;
counter = 0;
attachInterrupt(0, addcount, CHANGE);
unsigned long millis();
long startTime = millis();
while(millis() < startTime + period) {
}
detachInterrupt(1);
}
void RPMcalc(){
RPM=((counter/2)*60)/(period/1000); // Calculer tours par minute (RPM)
}
void WindSpeed(){
speedwind = ((((2 * pi * radio * RPM)/60) / 1000) / 1000) * 3600; // Calculer la vitesse du vent en km/h
}
1/tu "attach" l'interruption 0 et tu " detach" l'interruption 1
2/ tu n'as pas la fonction d'interruption.
testes ce code, c'est le tiens avec la correction pour les remarques
je te laisse la responsabilité des calculs que je n'ai pas vérifiés
const float pi = 3.14159265; // Nombre Pi
int period = 1000; // Période de mesure (miliseconde)
int delaytime = 10000; // Temps entre les mesures (miliseconde)
int radio = 70 ; // Distance du centre au capteur (mm)
unsigned int Sample = 0; // Mesure a 0
volatile int counter = 0; // compteur
unsigned int RPM = 0; // Tours par minute
float speedwind = 0; // Vitesse du vent (km/h)
int motor = 3;
//int addcount = 0;
int vitmax = 10; //vitesse du vent max au dela de laquelle mise en securité
void isr_anemometre()
{
counter++;
}
void setup()
{
pinMode(2, INPUT);
pinMode(motor, OUTPUT);
Serial.begin(115200); //Port série a 115200 baud
Serial.println("Anemometre");
Serial.println("**********");
Serial.print(" Mesure toutes les secondes : ");
Serial.println();
}
void loop()
{
Sample++;
windvelocity();
RPMcalc();
WindSpeed();
Serial.print(speedwind);
Serial.print(" [km/h] ");
Serial.println();
delay(5000);
Serial.print(" Mesure suivante... ");
Serial.println();
}
// Mesurer la vitesse du vent
void windvelocity(){
speedwind = 0;
counter = 0;
attachInterrupt(0, isr_anemometre, CHANGE);
//unsigned long millis();
unsigned long startTime = millis();
while(millis() < startTime + period) {};
detachInterrupt(0);
}
void RPMcalc(){
RPM=((counter/2)*60)/(period/1000); // Calculer tours par minute (RPM)
}
void WindSpeed(){
speedwind = ((((2 * pi * radio * RPM)/60) / 1000) / 1000) * 3600; // Calculer la vitesse du vent en km/h
}
Affichez les valeurs intermédiaires (RPM; counter) plutôt que le resulat des calculs: vous pourrez savoir
a) si votre interruption marche)
b) si vos conversions marchent
const float pi = 3.14159265; // Nombre Pi
int period = 1000; // Période de mesure (miliseconde)
int delaytime = 10000; // Temps entre les mesures (miliseconde)
int radio = 70 ; // Distance du centre au capteur (mm)
unsigned int Sample = 0; // Mesure a 0
volatile int counter = 0; // compteur
unsigned int RPM = 0; // Tours par minute
float speedwind = 0; // Vitesse du vent (km/h)
int motor = 3;
//int addcount = 0;
int vitmax = 10; //vitesse du vent max au dela de laquelle mise en securité
void isr_anemometre()
{
counter++;
}
void setup()
{
pinMode(2, INPUT);
pinMode(motor, OUTPUT);
Serial.begin(115200); //Port série a 115200 baud
Serial.println("Anemometre");
Serial.println("**********");
Serial.print(" Mesure toutes les secondes : ");
Serial.println();
}
void loop()
{
Sample++;
windvelocity();
RPMcalc();
Serial.print(speedwind);
Serial.print(" [km/h] ");
Serial.println();
delay(5000);
Serial.print(" Mesure suivante... ");
Serial.println();
}
// Mesurer la vitesse du vent
void windvelocity(){
speedwind = 0;
counter = 0;
attachInterrupt(0, isr_anemometre, CHANGE);
//unsigned long millis();
unsigned long startTime = millis();
while(millis() < startTime + period) {};
detachInterrupt(0);
}
void RPMcalc(){
RPM=((counter/2)*60)/(period/1000); // Calculer tours par minute (RPM)
}
[/code}
avant d'afficher la vitesse en km/h; vérifier (avec une calculette ou à la main ) si RPm est compatible avec vitesse, et counter est compatible avec RPM; si c'est le cas, c'est l'interruption à vérifier; si les calculs sont incompatibles avec votre calculette/ votre cerveau : soit changer de calculette, soit corriger ... le code