Assemblage de programme.

Bonjour,je viens vers vous pour fusionner deux programmes qui fonctionnent parfaitement individuellement et que j’arrive pas à mettre en commun. J’explique mon problème, j’ai comme projet de récupérer les données d’un capteur de vent(anémomètre) et de les transférées sur un Serveur WEB , ayant déjà essayer pas mal de choses je reviens toujours au même point. Je vous fais part de mes programmes qui fonctionnent parfaitement individuellement:

Serveur WEB

#include <SPI.h> //bibliothèqe pour SPI
#include <Ethernet.h> //bibliothèque pour Ethernet
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x2B, 0xB7}; //adresse mac de votre carte
byte ip[] = {172, 19, 67, 14}; //adresse IP
EthernetServer serveur(80); // déclare l'objet serveur au port d'écoute 80
int sensorValue = 0;
const int sensorPin = 0;
int val=0;
int ane= 0;
void setup() { 
  pinMode(2, INPUT); // sur le port 2
  digitalWrite(2, HIGH); // impulssion haute
  Serial.begin (9600); //initialisation de communication série
  Ethernet.begin (mac, ip); //initialisation de la communication Ethernet
  Serial.print("\nLe serveur est sur l'adresse : ");
  Serial.println(Ethernet.localIP()); //on affiche l'adresse IP de la connexion
  serveur.begin(); // démarre l'écoute
}
void loop() 
{
  EthernetClient client = serveur.available(); //on écoute le port
  if (client) { //si client connecté
    Serial.println("Client en ligne\n"); //on le dit...
    if (client.connected()) { // si le client est en connecté
      while (client.available()) { // tant qu'il a des infos à transmettre
        char c=client.read(); // on lit le caractère  
        Serial.write(c);// on l'écrit sur le moniteur série
        delay(1); //delai de lecture
      }
     client.println ("HTTP/1.1 200 OK");
      client.println ("Content-Type: text/html; charset=ascii");
      client.println ("Connection: close");
      client.println ( ); 
      client.println("<meta charset='utf-8'>");
      client.println("<html>"); //début du code html
      client.println("<head>"); //entête
      client.println("<style> body { background-color:skyblue;}</style>");
      client.println ("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"1\">");
      client.println("<header>");
      client.println("<title>Suiveur Solaire</title>"); //titre de la fenêtre
      client.println("</h1>");
      client.println("</head>");//fin d'entête
      client.println("<body>"); //corps
      client.println("<h1><u><p align=center>Suiveur Solaire</p></u></h1>"); //titre en grosse lettres
      client.println("<hr>"); //ligne horizontale
     { // boucle pour parcourir les pins
        client.print("<h1>Luminosite en %"); // affichage
        client.print(" : "); // affichage
        sensorValue= analogRead(0);
        sensorValue = map(sensorValue,0,1023,0,100);
        client.print(sensorValue);
        client.println("%</h1>");
        client.print("
"); //saut de ligne
      }
      for (int p=1;p<2;p++){ // boucle pour parcourir les pins
        client.print("<h1>Valeur potentiometre V"); // affichage
        client.print(" : "); // affichage
        val = analogRead(p);
        val = map(val,0,1023,0,5);
        client.print(val);
        client.print("
"); //saut de ligne
      }
      {
        for (int p=2;p<2;p++);
        client.print("<h1>Anemometre"); // affichage
        client.print(":");
        ane = digitalRead(2);
        client.print(ane);
        client.println("Km/h</h1>");
        client.print("
");
      }
      client.println("<hr>"); //ligne horizontale
      client.println("</body>"); //fin du corps
      client.println("</html>"); //fin du code html
      client.stop(); //on déconnecte le client
      Serial.println("Fin de communication avec le client");
    }
  }
}

Programme qui récupère les données sur un LCD:

const float pi = 3.14159265;  // Nombre Pi
int period = 1000;           // Période de mesure (miliseconde)
int delaytime = 1000;        // Temps entre les mesures (miliseconde)
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) 

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);
}
 
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 > 80)
  {
    lcd.setCursor(0,9);
    lcd.print("Securite");
  }
  if (speedwind < 80)
  {
    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++;
}

Explique mieux ton besoin : tu veux ajouter l’affichage LCD dans le code du serveur HTML ?

Ce n’est pas très compliqué, mais il y a un truc bizarre dans tes codes. Dans le serveur, la vitesse du vent est indiquée comme ceci :

        client.print("<h1>Anemometre"); // affichage
        client.print(":");
        ane = digitalRead(2);  // <-- mesure du capteur
        client.print(ane);
        client.println("Km/h</h1>");

C’est à dire que le nombre affiché est la mesure analogique directe du capteur.

Dans le code du LCD, la vitesse est calculée par une formule plus complexe (qui doit être la bonne je pense) :

void WindSpeed(){
  speedwind = ((((2 * pi * radio * RPM)/60) / 1000) / 1000) * 3600;  // Calculer la vitesse du vent en km/h
}

Mais RPM est calculé à partir du comptage des tours de l’anémomètre (avec une interruption pour les compter).

Donc il faut déjà faire un choix entre ces deux manières de compter, afin que les données du LCD et du serveur soient cohérentes.

Ensuite, il faut que tu isoles dans le second code les lignes qui servent à mesurer, calculer et afficher sur le LCD la vitesse du vent. Tu les fourres dans une fonction calcul_de_la_vitesse que tu appelles à l’endroit où tu écris sur le serveur. Ça donnera :

        client.print("<h1>Anemometre"); // affichage
        client.print(":");
        ane = calcul_de_la_vitesse();
        client.print(ane);
        client.println("Km/h</h1>");

Et tu déclares bien ton LCD dans le code du serveur (comme c’est fait dans l’autre code), et ça devrait aller.

Au passage, quelques bonnes pratiques pour grouper 2 codes.

Oui en gros la vitesse du vent qui est afficher sur le LCD je voudrais la prendre et la mettre sur le site.

      client.print("<h1>Anemometre"); // affichage
        client.print(":");
        ane = digitalRead(2);  // <-- mesure du capteur
        client.print(ane);
        client.println("Km/h</h1>");

La vitesse du vent est comme ceci car le prof voulais d’abord que j’affiche le moment ou l’ILS est actionné pour avoir un 1 et quand il est pas actionné il est à 0 sur le Serveur.

      ane = digitalRead(2);  // <-- mesure du capteur

Le 2 correspond au port de l’arduino.

En ce qui concerne ce que vous m’avez dis je ne comprend pas vraiment tous
“Donc il faut déjà faire un choix entre ces deux manières de compter, afin que les données du LCD et du serveur soient cohérentes.”
Puis le prof m’a dis qu’il ne voulais pas de LCD dans le programme du Serveur,c’est à dire que ce qui est m’est utile dans le code 2 pour le LCD ne doit pas être dans le code du Serveur.
Il est possible de me montrer pour ce que ça donne en code ??

En espérant que vous comprenez tous mon charabia :’)

Bonjour,

benjifit:
Bonjour,je viens vers vous pour fusionner deux programmes qui fonctionnent parfaitement individuellement

Parfaitement?

S’agissant du second code (lecture de l’anémomètre, un programme que vous avez copié), cela me surprend car vous n’avez [apporté] aucune correction aux erreurs qui vous ont été signalées dans votre premier fil.

Cordialement,
bidouilleelec

bidouilleelec:
Bonjour,

Parfaitement?

S’agissant du second code (lecture de l’anémomètre, un programme que vous avez copié), cela me surprend car vous n’avez aucune correction aux erreurs qui vous ont été signalées dans votre premier fil.

Cordialement,
bidouilleelec

Le code marche parfaitement et à était vérifier par mon professeur et il est donc bon :slight_smile:

Donc, il te faut juste ajouter dans ton code serveur les lignes qui permettent de calculer la vitesse du vent ? Sans afficher sur un LCD.

C'est plus simple, mais comme ton prof est certainement en train de lire ces messages, je ne vais pas te donner la solution. D'ailleurs, c'est peut-être moi ton prof ... :grin:

Il faut que tu arrives à comprendre ce que fait ta loop :

void loop()
{
  Sample++;
  windvelocity();
  RPMcalc();
  WindSpeed();
  Serial.print(speedwind); // afficher le vent sur moniteur serie
  Serial.print(" [km/h] "); // afficher sur moniteur serie
  Serial.println();
delay(1000); // affichage toutes les secondes
  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 > 80)
  {
    lcd.setCursor(0,9);
    lcd.print("Securite");
  }  
}

Pour t'avancer un peu j'en ai viré une partie qui ne te servira pas.

Les lignes qui affichent sur le LCD seront à changer par des lignes qui écriront sur ton serveur. Est-ce que tu comprends le fonctionnement de l'anémomètre couplé à l'Arduino ? C'est à dire, est-ce que tu comprends comment l'Arduino mesure une vitesse de rotation ? C'est là que se situe la difficulté et elle est un peu cachée dans ton programme...

lesept:
Donc, il te faut juste ajouter dans ton code serveur les lignes qui permettent de calculer la vitesse du vent ? Sans afficher sur un LCD.

C'est plus simple, mais comme ton prof est certainement en train de lire ces messages, je ne vais pas te donner la solution. D'ailleurs, c'est peut-être moi ton prof ... :grin:

Il faut que tu arrives à comprendre ce que fait ta loop :

void loop()

{
  Sample++;
  windvelocity();
  RPMcalc();
  WindSpeed();
  Serial.print(speedwind); // afficher le vent sur moniteur serie
  Serial.print(" [km/h] "); // afficher sur moniteur serie
  Serial.println();
delay(1000); // affichage toutes les secondes
  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 > 80)
  {
    lcd.setCursor(0,9);
    lcd.print("Securite");
  } 
}


Pour t'avancer un peu j'en ai viré une partie qui ne te servira pas.

Les lignes qui affichent sur le LCD seront à changer par des lignes qui écriront sur ton serveur. Est-ce que tu comprends le fonctionnement de l'anémomètre couplé à l'Arduino ? C'est à dire, est-ce que tu comprends comment l'Arduino mesure une vitesse de rotation ? C'est là que se situe la difficulté et elle est un peu cachée dans ton programme...

L'arduino mesure les impulsions des 2 ILS,en fonction du temps. Donc cela me permet d'avoir la vitesse en m/s qui me permet ensuite de la passer en Km/H

Qu'appelles-tu "ILS" ?

Au passage, ton code a des petits problèmes : ceci n'est pas bon (et ça ne devrait pas compiler d'ailleurs)

  unsigned long millis();                    
  long startTime = millis();

Il faut écrire :

  unsigned long startTime = millis();

Ton calcul du nombre de tours par secondes doit être assez imprécis, car tu fais des divisions entières :
RPM=((counter/2)*60)/(period/1000);Passe en float et utilise des constantes "float" aussi comme 2.0 ou 60.0

lesept:
Qu'appelles-tu "ILS" ?

Au passage, ton code a des petits problèmes : ceci n'est pas bon (et ça ne devrait pas compiler d'ailleurs)

  unsigned long millis();                    

long startTime = millis();


Il faut écrire :


unsigned long startTime = millis();




Ton calcul du nombre de tours par secondes doit être assez imprécis, car tu fais des divisions entières :
`RPM=((counter/2)*60)/(period/1000);`Passe en float et utilise des constantes "float" aussi comme 2.0 ou 60.0

ILS est le contacteur qu'il y à dans l’anémomètre à chaque fois qu'il est activé, Il y a une impulsion et on peut entendre un tic.

lesept:
Ton calcul du nombre de tours par secondes doit être assez imprécis, car tu fais des divisions entières :

RPM=((counter/2)*60)/(period/1000);

Passe en float et utilise des constantes "float" aussi comme 2.0 ou 60.0

Qu'entendez vous par float ?

C'est un nombre à virgule