Arduino Forum

International => Français => Topic started by: benjifit on May 15, 2019, 09:07 am

Title: algorigramme
Post by: benjifit on May 15, 2019, 09:07 am
bonjour,
je voudrais qu'on m'aide pour créer un algorigramme, il faut qui soit simple et cours de premier niveau par rapport au programme ci-dessous:
Code: [Select]
const float pi = 3.14159265;  // Nombre Pi
int period = 1000;           // Période de mesure (miliseconde)
int delaytime = 1000;        // 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) 
// include the library code:
#include <LiquidCrystal.h>
// Test utilisation servomoteur SG90 //

#include <Servo.h>
 
Servo monservo;  // crée l'objet pour contrôler le servomoteur

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup()
{
  pinMode(2, INPUT); // sur le port 2
  digitalWrite(2, HIGH); // impulssion haute
  Serial.begin(115200); // Port série a 115200 baud
   
  Serial.println("Anemometre"); // affichage sur moniteur serie
  Serial.println("**********"); // idem
  Serial.print(" Mesure toutes les secondes : "); //idem
  Serial.println();
  lcd.begin(16,2);
  monservo.attach(9);  // utilise la broche 9 pour le contrôle du servomoteur
}
 
void loop()
{
  Sample++;
  windvelocity();
  RPMcalc();
  WindSpeed();
  Serial.print(speedwind); // afficher le vent sur moniteur serie
  Serial.print(" [km/h] "); // afficher sur miniteur serie
  Serial.println();
delay(1000); // affichage toutes les  vsecondes
  Serial.print(" Mesure suivante... "); // afficher sur moniteur serie
  Serial.println();
   lcd.setCursor(0,0); // affiche sur le première ligne
  lcd.print(speedwind); // afficher le vent sur le lcd
  lcd.print(" [km/h] "); // afficher sur le lcd
  if (speedwind > 50)
  {
     monservo.write(70); // positionne le servomoteur à 70°
    lcd.setCursor(0,9);
    lcd.print("Securite");
  }
  if (speedwind < 50)
  {
    delay(3000);
     monservo.write(35); // positionne le servomoteur à 35°
    lcd.setCursor(0,9);
    lcd.print("                 ");
 
  }
 
}
 
// 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
}
//declaration de addcount
void addcount()
{
  counter++;
}

Merci.
Title: Re: algorigramme
Post by: al1fch on May 15, 2019, 09:10 am
Bonjour

tout est là, https://troumad.developpez.com/C/algorigrammes/ (https://troumad.developpez.com/C/algorigrammes/)  reste à faire....excellent exercice scolaire

N.B pour du simple et cours : regrouper dans un seul rectangle les séquences qui ont le même objet
Title: Re: algorigramme
Post by: benjifit on May 15, 2019, 09:14 am
d'accord merci beaucoup pour votre aide je vais faire cela avec ce cours
Title: Re: algorigramme
Post by: fdufnews on May 15, 2019, 10:03 am
Si je peux me permettre les commentaires ne sont pas très utiles voir faux

Code: [Select]
 pinMode(2, INPUT); // sur le port 2

Ce commentaire n'explique rien. Tu devrais dire port 2 en entrée

Code: [Select]
 pinMode(2, INPUT); // sur le port 2
  digitalWrite(2, HIGH); // impulssion haute

Dans ce cas, le commentaire du digitalWrite est faux. La broche 2 étant configurée en entrée faire un digitalWrite(2, HIGH) ne génère pas une impulsion haute mais active le pullup interne. Au passage, il serait bon de connaitre la différence entre état et impulsion.

Ces 2 lignes pourraient d'ailleurs être remplacées par un
Code: [Select]
pinMode(2, INPUT_PULLUP); // configure la pin 2 en entrée avec un pullup
qui serait plus clair

Le summum étant
Code: [Select]
#define PIN_ANEMOMETRE 2
pinMode(PIN_ANEMOMETRE , INPUT_PULLUP); // Connexion anémomètre en entrée avec un pullup

qui serait plus clair


Title: Re: algorigramme
Post by: dbrion06 on May 15, 2019, 10:18 am
En passant, si vous souhaitez que votre compteur soit partagé entre le fil principal et l'interruption, vous gagneriez à le déclarer en volatile, pour éviter que l'optimiseur ne l'évapore ( ce qui fait gagner de la place mémoire et des cycles); sinon, les resultats peuvent être étranges.