Go Down

Topic: Petit problème de programmation sur arduino uno Wifi. (Read 421 times) previous topic - next topic

Vidou12

Bonjour à tous.

Ce post risque d'être long je vous préviens :).

J'ai un petit problème de programmation.

En fait, je me sers d'un arduino uno wifi pour piloter une porte de poulailler depuis internet (donc n'importe ou dans le monde...).

J'ai déjà fait ce programme qui fonctionne :

Code: [Select]
#include <Wire.h>
#include <Servo.h>
#include <UnoWiFiDevEd.h>
#include <Adafruit_MotorShield.h>

const unsigned char fdc_bas = 2; // Initialise la constante (const) de type caractère (char) et de nom "fdc_bas" à la valeur "2" : broche arduino sur laquelle ce trouve l'information du fin de course bas.
const unsigned char fdc_haut = 3; // Initialise la constante (const) de type caractère (char) et de nom "fdc_haut" à la valeur "3" : broche arduino sur laquelle ce trouve l'information du fin de course haut.
const unsigned char pin_alim_relais = 4;
const unsigned char pos_init_servo_gauche = 5; // Initialise la constante (const) de type caractère (char) et de nom "pos_init_servos" à la valeur "90" : position initiale des servos moteurs.
const unsigned char pos_init_servo_droit = 175;
const unsigned char pin_analog_tension_batterie = 0;

const float valeur_max_tension_mesuree_batterie = 4.53;
const float valeur_min_tension_mesuree_batterie = 3.76;

bool valeur_fdc_haut = false; // Initialise la variable de type booléen et de nom "valeur_fdc_haut" à l'état bas (0, "false").
bool valeur_fdc_bas = false; // Initialise la variable de type booléen et de nom "valeur_fdc_bas" à l'état bas (0, "false").
bool erreur = false; // Initialise la variable de type booléen et de nom "erreur" à l'état bas (0, "false").
bool porte_fermee = true;

Adafruit_MotorShield motorshield_1 = Adafruit_MotorShield(); // Crée un objet "Adafruit_MotorShield" (qui est un shield adafruit controleur moteur), de nom "motorshield_1", avec l'adresse I2C par defaut (sans cavaliers sur la carte pour les adresses).

Adafruit_StepperMotor *moteur = motorshield_1.getStepper(200, 2); // Créé un objet "Adafruit_StepperMotor" (moteur pas à pas), de nom "moteur", avec en paramètres, nombre de pas par tours ("200"), et port sur le shield : ("2" : M3 et M4)

Servo servo_gauche; // Créé un objet "Servo" de nom "servo_gauche", représentant le servomoteur de gauche.
Servo servo_droit; // Créé un objet "Servo" de nom "servo_droit", représentant le servomoteur de droite.

void setup()
{
    pinMode (fdc_haut, INPUT); // Définit la pin "fdc_haut" (3), comme etant une entrée ("INPUT").
    pinMode (fdc_bas, INPUT); // Définit la pin "fdc_bas" (2), comme etant une entrée ("INPUT").
    pinMode (pin_alim_relais, OUTPUT);

    digitalWrite (pin_alim_relais, HIGH);

    motorshield_1.begin();  // Initialise la communication avec shield à la fréquence max ; par defaut : 1.6KHz (1600 bauds/s).
    moteur->setSpeed(350);  // Initialise la vitesse max du moteur "moteur" à 350 rpm.

    servo_gauche.attach(9); // Définit la pin "9", comme etant la sortie du signal pour le servomoteur de gauche : "servo_gauche".
    servo_droit.attach(10); // Définit la pin "10", comme etant la sortie du signal pour le servomoteur de droite : "servo_droit".
    
    Wifi.begin(); // Initialise le serveur wifi.
    Wifi.println(F("Web Server is up")); // Préviens le serveur que tout est ok et prêt à etre utilisé.
}

void loop()
{
    while(Wifi.available())
    {
      process(Wifi);
    }
  delay(50);
}

void process(WifiData client)
{
  String command = client.readStringUntil('/');

  if (command == "webserver")
  {
    WebServer(&client);
  }
}
 
void WebServer(WifiData *client)
{

  int index = -1;
  unsigned long int temps = millis();
  
  index = client->parseInt();

  client->println("HTTP/1.1 200 OK");
  client->println("Content-Type: text/html");
  client->println();

  client->println(F("<!DOCTYPE html>"));
  client->println(F("<html>"));
  client->println(F("<head>"));
  client->println(F("<meta charset=\"utf-8\">"));
  
  if (index == 1)
    {    
      valeur_fdc_haut = digitalRead(fdc_haut);
      valeur_fdc_bas = digitalRead(fdc_bas);
      
      if (erreur || (valeur_fdc_haut && valeur_fdc_bas) || (!valeur_fdc_haut && !valeur_fdc_bas))
      {
        page_erreur_ouverture(client);

        servo_gauche.write(pos_init_servo_gauche);
        delay(20);
        servo_droit.write(pos_init_servo_droit);
        delay(20);

        if (!porte_fermee)
        {
          do
            {
              moteur->step(3, BACKWARD, INTERLEAVE);
              valeur_fdc_bas = digitalRead(fdc_bas);
            } while (valeur_fdc_bas && millis() - temps < 12000); // Valeur 1 = inactif, 0 = actif.  

          porte_fermee = true;
        }
        
        moteur->release();
        erreur = false;
      }
              
      else if (valeur_fdc_haut && !valeur_fdc_bas) // Si le fin de course bas est actif et le fdc haut inactif (porte fermée) :  Valeur 1 = inactif, 0 = actif.
        {
          page_ouverture(client);
          unsigned long int temps = millis();

          servo_gauche.write(pos_init_servo_gauche);
          delay(20);
          servo_droit.write(pos_init_servo_droit);
          delay(20);
          
          do
            {
              moteur->step(3, FORWARD, DOUBLE);
              valeur_fdc_haut = digitalRead(fdc_haut);
            } while (valeur_fdc_haut && millis() - temps < 6000); // Valeur 1 = inactif, 0 = actif.  

          porte_fermee = false;

          if (valeur_fdc_haut)
          {
            erreur = true;
          }
          else
          {
            servo_gauche.write(92);
            delay(20);
            servo_droit.write(90);
            delay(1020);
            moteur->release();
          }
        }
      
      else if (!valeur_fdc_haut && valeur_fdc_bas)
        {
          page_ouverture_fini(client);
        }
    }

  else if (index == 0)
    {    
      valeur_fdc_haut = digitalRead(fdc_haut);
      valeur_fdc_bas = digitalRead(fdc_bas);

      if (erreur || (valeur_fdc_haut && valeur_fdc_bas) || (!valeur_fdc_haut && !valeur_fdc_bas))
      {
        page_erreur_fermeture(client);

        moteur->step(1, BACKWARD, MICROSTEP);
        
        servo_gauche.write(pos_init_servo_gauche);
        delay(20);
        servo_droit.write(pos_init_servo_droit);
        delay(20);

        if (!porte_fermee)
        {
          do
            {
              moteur->step(3, BACKWARD, MICROSTEP);
              valeur_fdc_bas = digitalRead(fdc_bas);
            } while (valeur_fdc_bas && millis() - temps < 12000); // Valeur 1 = inactif, 0 = actif.  

          porte_fermee = true;
        }
        
        moteur->release();        
        erreur = false;
      }
      
     else if (valeur_fdc_bas && !valeur_fdc_haut) // Si la porte est ouverte : Valeur 1 = inactif, 0 = actif.
        {    
          page_fermeture(client);

          moteur->step(1, BACKWARD, MICROSTEP); // Verrouille la porte pour eviter qu'elle tombe.
          
          servo_gauche.write(pos_init_servo_gauche);
          delay(20);
          servo_droit.write(pos_init_servo_droit);
          delay(1020);
          
          unsigned long int temps = millis();
          
          do
            {
              moteur->step(3, BACKWARD, INTERLEAVE);
              valeur_fdc_bas = digitalRead(fdc_bas);
            } while (valeur_fdc_bas && millis() - temps < 12000); // Valeur 1 = inactif, 0 = actif.

            porte_fermee = true;

          if (valeur_fdc_bas)
          {
            erreur = true;
          }
          
          delay(1000);
          moteur->release();
        }
    
    else if (!valeur_fdc_bas && valeur_fdc_haut)
      {
        page_fermeture_fini(client);
        digitalWrite (pin_alim_relais, LOW);
      }
  }
  
  else if (index == 10)
  {
    page_etat(client);
  }
}
}

Vidou12

C'est assez indigeste je vous l'accorde.

Du coups j'ai voulu le rendre plus lisible avec des classes.

J'ai donc créé 2 classes :

une classe "Motorisation" et une autre "Pages_Web".

Mon fichier ino est a présent plus léger :

Code: [Select]
#include <UnoWiFiDevEd.h>
#include "Motorisation.h"
#include "Pages_Web.h"

const unsigned short int pin_analog_tension_batterie = 0;

const float valeur_max_tension_mesuree_batterie = 4.53;
const float valeur_min_tension_mesuree_batterie = 3.76;

void setup()
{
  pinMode (PIN_RELAIS_ALIM, OUTPUT);

  digitalWrite (PIN_RELAIS_ALIM, HIGH);

  Wifi.begin(); // Initialise le serveur wifi.
  Wifi.println(F("Web Server is up")); // Préviens le serveur que tout est ok et prêt à etre utilisé.

 Motorisation moteur(5,175,2,3, &pageWeb); // pos_init_servo_gauche,pos_init_servo_droit,pin_fdc_bas,pin_fdc_haut
 
 Pages_Web pageWeb(&moteur);

}

void loop()
{
  while(Wifi.available())
  {
    process(Wifi);
  }
  
  delay(50);
}

void process(WifiData client)
{
  String command = client.readStringUntil('/');

  if (command == "webserver")
  {
    WebServer(&client);
  }
}
 
void WebServer(WifiData *client)
{

  int index = -1;
  unsigned long int temps = millis();
  
  index = client->parseInt();

  client->println("HTTP/1.1 200 OK");
  client->println("Content-Type: text/html");
  client->println();

  client->println(F("<!DOCTYPE html>"));
  client->println(F("<html>"));
  client->println(F("<head>"));
  client->println(F("<meta charset=\"utf-8\">"));
  
  if (index == 1)
    {    
      moteur.ouverture_porte();
    }

  else if (index == 0)
    {    
      moteur.fermeture_porte();
  }
  
  else if (index == 10)
  {
    pageWeb.page_etat();
  }
}



Même si il reste encore quelques éléments qui peuvent être modifiés.

Mon fichier Pages_Web.h lui est celui qui me pose le problème...

Vidou12

Code: [Select]
#ifndef PAGES_WEB_H
#define PAGES_WEB_H

#include <Arduino.h>
#include "Motorisation.h"
#include <UnoWiFiDevEd.h>


class Pages_Web
{
  public :

    Pages_Web(Motorisation *s_pMoteur);

    void page_etat();
    
    void page_ouverture();
    void page_fermeture();
    
    void page_ouverture_fini();
    void page_fermeture_fini();
    
    void page_erreur_ouverture();
    void page_erreur_fermeture();


  private :

    Motorisation *pMoteur;
};






#endif


Lors de la compilation, il me sort ce message d'erreur :

Quote
In file included from sketch\Motorisation.h:8:0,

                 from sketch\Motorisation.cpp:1:

Pages_Web.h:13: error: expected ')' before '*' token

     Pages_Web(Motorisation *s_pMoteur);

                            ^

Pages_Web.h:29: error: 'Motorisation' does not name a type

     Motorisation *pMoteur;

     ^

exit status 1
expected ')' before '*' token
.

Mon fichier .cpp lui est comme ceci :

Code: [Select]
#include "Pages_Web.h"

void Pages_Web::Pages_Web(Motorisation *s_pMoteur)
{
  pMoteur = s_pMoteur;
}...


Je cherches depuis un moment sans trouver de solutions.

Si quelqu'un à une idée, piste, solution, je prendrais de bon coeur :).

Désolé pour la longueur du post...

Merci d'avoir pris le temps de me lire.

Go Up