Table des matières

Portail arduino

tutoriel-diy-portail-motorise-miniature-arduino

Code arduino

portail001.ino
/*
 * Ce programme controle le fonctionnement d'un petit protail domotisé. 
 * Si le badge présenté devant le lecteur RFID est bon, alors le portail s'ouvre. 
 * Il se referme apres le passage de la voiture (détécté par le capteur ultrason) ou bien apres 10 secondes d'inactivité.
 * Même scénario si on appuie sur un bouton de la télécommande infrarouge. Si on souhaite sotir de l'intérieur,
 * le capteur ultrason le détecte et ouvre le portail puis le referme 3 secondes après.
 * Le coulissement de la porte est assuré par un servomoteur à rotation continue. 
 * Des interrupteurs de fin de course permettent de stoper le coulissement du portail.
 * Une led est allumée quand le portail est en mouvement puis clignote quand celui ci est ouvert.
 * Enfin un lcd piloté en i2c donne des informations sur l'ouverture et la fermeture du portail ainsi que sur la validité du badge.
 */
 
#include <Wire.h>    //librairiepour la communication i2c
#include <LiquidCrystal_I2C.h>    //librairie pour utliser un écran lcd avec un module i2c
LiquidCrystal_I2C lcd(0x27,16,2);     //spécification de l'adrese du module
 
#include <IRremote.h>   //librairie pour la communication infrarouge
 
#define pin_recepteur_infra 10   //variable contenant le numéro du pin ou est coonnecté le recepteur infrarouge
IRrecv monRecepteur_infra(pin_recepteur_infra);    //création d'un nom pour le recepteur connecté au pin 8
decode_results message_recu;    //variable contenant le message recu par le recepteur infrarouge
 
#include <Servo.h>    //on inclut une librairie pour utiliser le servomoteur
Servo monServo;   //on déclare l'utilisation d'un servomoteur nommé "monServo"
 
#include <SPI.h>    //librairie pour la communication SPI entre l'arduino et le module RFID
#include <RFID.h>   //librairie pour utiliser le module RFID
 
RFID monModuleRFID(9,8);   //déclaration des broches de connection du module RFID
int UID[5];   //tableau pour stocker le numéro d'identification lue par le lecteur RFID
int badge_BLEU[5] = {54,112,133,24,219};    //tableau contenant le numéro d'identification de mon badge bleu
byte badge_lu = 0;    //pour savoir si un badge a été lu
byte ouverture_porte = 0;   //cette variable indique si on peut ou non ouvrir le portail
unsigned long fermeture_defaut = 0;   //pour fermer le portail si ila été ouvert et que aucune voiture ne passeau bout de 3 seconde
 
#define bouton_fin 7   //pin ou est connecté le bouton poussoir de fin de course quand le portail est fermé
#define bouton_debut 4   //pin ou est connecté le bouton poussoir de debut de course quand le portail est fermé
#define pin_servo 3   //pin sur lequel est connecté le servomoteur qui actionne le portail.
#define pin_ledV 6    //la led verte qui indique que le badge est bon 
#define pin_ledR 5    //la led rouge qui indique que le badge est non valide
#define pin_LED_portail 2   //led qui clignote quand le portail est ouvert
 
//capteur ultrason
#define pin_TRIGGER 12
#define pin_ECHO 11
 
byte E_accent[8] = //création d'un tableau contenant le caractère spécial 'é'
 {
  B00001,
  B00110,
  B00000,
  B01110,
  B10001,
  B11111,
  B10000,
  B01110
 };
 
void setup()
{
  Serial.begin(9600);
  //portail
  monServo.attach(pin_servo);   //on déclare la broche de connection du servo(digitale 11 PWM)
  monServo.write(98);   //onmet le servomoteur en arrêt
  pinMode(bouton_debut, INPUT);    //le bouton de debut de course est configuré en entrée
  pinMode(bouton_fin, INPUT);    //le bouton de fin de course est configuré en entrée
  pinMode(pin_LED_portail, OUTPUT);
 
  //Module RFID
  SPI.begin();    //on initialise la communication SPI vers lemodule RFID
  monModuleRFID.init();   //on initialise le module RFID
  pinMode(pin_ledV, OUTPUT);
  pinMode(pin_ledR, OUTPUT);
 
  //recepteur infrarouge
  monRecepteur_infra.enableIRIn();    //commande pour activer le module infrarouge
  monRecepteur_infra.blink13(true);   //active une led lors de la recepteion des données
  //ultrason
  pinMode(pin_TRIGGER, OUTPUT);   //on met le pin trigger en sortie
  pinMode(pin_ECHO, INPUT);   //on met le pin echo en entré
 
  //lcd
  Wire.begin();   //initialisation de la communication i2c
  lcd.init();   //initialisation du module lcd
  lcd.backlight();  //activation du rétroéclairage de l'écran
  lcd.createChar(1,E_accent);   //création d'un caractère spécial pour faire un e accent
 
}
 
void loop()
 {
   //affichage de la phrase : "Accés vérouillé"(avec l'insértion du caractère spécial 'é')
   lcd.home();
   lcd.clear();
   lcd.print("Acc");
   lcd.write(1);
   lcd.print("s v");
   lcd.write(1);
   lcd.print("rouill");
   lcd.write(1);
   test_badge();   //fonction pour lire le badge RFID présenté
   verification_badge();    //fonction pour vérifier que le badge présenté est valide
   test_telecommande_infra();    //fonction pour savoir si le bouton "play/pause" de la telecommande infrarouge à été activé
   souhait_sortie();    //si une voiture souhaite sortir par le portail depuis l'intérieur
 }
 
void test_badge()    //on lit le badge RFID présenté
{ 
  if(monModuleRFID.isCard())    //Si il y a un badge à lire
  {
    if(monModuleRFID.readCardSerial())
    {
      Serial.print("Le code du badge est : ");
      for(char lecture=0; lecture<=4; lecture++)    //on répète 4 fois
      {
        UID[lecture] = monModuleRFID.serNum[lecture];   //on lit le numéro d'identification du badge présenté et on le stock dans le tableau UID
        Serial.print(UID[lecture]);
        Serial.print("."); 
      }
      Serial.println("");
      badge_lu = 1;    //on note que un badge a été lu
    }
    monModuleRFID.halt();   //on stop la communication avec le module RFID
  }
}
 
void verification_badge()   //fonction pour vérifier que le badge présenté est valide
{
  if(UID[0] == badge_BLEU[0] && UID[1] == badge_BLEU[1] && UID[2] == badge_BLEU[2] && UID[3] == badge_BLEU[3] && UID[4] == badge_BLEU[4])   //si le badge est bon(donc si c'est le badge bleu)
  {
    lcd.clear();
    lcd.home();
    lcd.print("Badge valide");
    digitalWrite(pin_ledV, HIGH);
    delay(1000);
    digitalWrite(pin_ledV, LOW);
    ouverture_portail();   //fonction pour ouvrir le portail
    decision_fermeture();   //cette fonction ferme autorise ou non la fermeture du portail
  }
  else if(badge_lu == 1)    //si on a déja lu le badge
  { 
    lcd.clear();
    lcd.home();
    lcd.print("Badge non valide");
    digitalWrite(pin_ledR, HIGH);
    delay(1000);
    digitalWrite(pin_ledR, LOW);
    badge_lu = 0;
  }
}
 
void ouverture_portail()    //fonction pour ouvrir le portail
{
  lcd.clear();
  while(digitalRead(bouton_debut) != 1)   //tant quele portail n'est pas complètement ouvert
  {
    monServo.write(80);   //on ouvre la porte
    digitalWrite(pin_LED_portail, HIGH);
    lcd.setCursor(0,0);
    lcd.print("Ouverture du");
    lcd.setCursor(0,1);
    lcd.print("portail...");
    fermeture_defaut = millis();
  }
  monServo.write(98);
}
 
void fermeture_portail()    //fonction pour fermer le portail
{
  lcd.clear();
  while(digitalRead(bouton_fin) != 1)   //tant que le portail n'est pas complètement fermé
  {
    monServo.write(110);   //on ferme la porte
    digitalWrite(pin_LED_portail, HIGH);
    lcd.setCursor(0,0);
    lcd.print("Fermeture du");
    lcd.setCursor(0,1);
    lcd.print("portail...");
  }
  badge_lu = 0;
  UID[0]= 0;
  monServo.write(98);
  digitalWrite(pin_LED_portail, LOW);
  //affichage de la phrase : "Accés vérouillé" (avec l'insértion du caractère spécial 'é')
  lcd.home();
  lcd.clear();
  lcd.print("Acc");
  lcd.write(1);
  lcd.print("s v");
  lcd.write(1);
  lcd.print("rouill");
  lcd.write(1);
}
 
void test_telecommande_infra()    //fonction pour savoir si le bouton "play/pause" de la telecommande infrarouge à été activé
{
  if(monRecepteur_infra.decode(&message_recu))
  {
    monRecepteur_infra.resume();    //permet au recepteur de recevoir de nouveaux messages
    if(message_recu.value == 0xFFC23D)
    {
      digitalWrite(pin_ledV, HIGH);
      delay(500);
      digitalWrite(pin_ledV, LOW);
      ouverture_portail();   //fonction pour ouvrir le portail
      decision_fermeture();   //cette fonction ferme autorise ou non la fermeture du portail
    }
  }
}
 
float distance_ultrason()   //fonction pour mersué détécté la présence d'un passage de voiture
{
  //on génere une impultion pour le TRIGGER du capteur à ultrason
  digitalWrite(pin_TRIGGER, LOW);
  delayMicroseconds(2);   //on attend 2 microsecondes
  digitalWrite(pin_TRIGGER, HIGH);
  delayMicroseconds(10);   //on attend 2 microsecondes
  digitalWrite(pin_TRIGGER, LOW);
  float distance = pulseIn(pin_ECHO, HIGH)/58.0;    //on lit en on convertit la distance en cm
  return distance;
}
 
void decision_fermeture()   //cette fonction autorise ou non la fermeture du portail
{
  while((millis() - fermeture_defaut) < 10000)   //tant que cela fait moins de 10 secondes que le portail est ouvert
  {
    lcd.home();
    lcd.clear();
    lcd.print("Portail ouvert");
    digitalWrite(pin_LED_portail, HIGH);
    delay(500);
    digitalWrite(pin_LED_portail, LOW);
    delay(500);
    if(distance_ultrason() < 10)   //si une voiture passe
    {
      fermeture_portail();
      break;
    }
  }
  fermeture_portail();
}
 
void souhait_sortie()   //si on souhaite sortir par le portail de l'intérieur
{
  if(distance_ultrason() < 10)   //si une voiture se présente
  {
    ouverture_portail();
    delay(3000);
    fermeture_portail();
  }
}

Schema