suiveur solaire sti2d projet

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

Bonjour,

Mets ton programme en entier. Il en manque une partie.
Profites en pour indiquer comment est connecté l’anémomètre.

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 ...

D'accord merci je vais tester cela et je vous tiens au courant dans la semaine

"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
}

hello
plusieurs erreurs

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
}

merci beaucoup je teste le programme demain en cours avec tout le matériel et je vous dis ça dans l’après midi

1/A quoi sert :

  unsigned long millis();

?

2/

 long startTime = millis();

millis() renvoie un unsigned long .

Cordialement,
bidouilleelec

bonjour,
le programme m'affiche toujours 0km/h je ne sais vraiment pas comment régler se problème.
merci

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

la vitesse affiche toujours 0 avec ce 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
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}

Affichez RPM et counter...

je sais pas comment faire je suis complétement perdu

Serial.print("RPM"); Serial.println(RPM); 
Serial.print("counter");Serial.println(counter);

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

hello
si tu as bien testé avec le code que tu nous postes:

tu appelles la fonction winvelocity() qui autorise la prise en compte des interruptions pendant 1 seconde.

pendant cette seconde, les interruptions incrémentent une variable appelée "counter".

ensuite, tu va calculer le nombre de rotations avec "counter" dans la fonction RPMCalc()

la variable RPM contient donc le nombre de rotations.

et pour finir tu affiches sur le moniteur une variable "speedwind" que:

tu n'as jamais calculée et qui est bien évidemment à zéro. et qui le sera toujours.