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 :
#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);
}
}
}