1.8 Mélangeons les programmes pour aller plus loin !

Et si on mélangeait les programmes que nous avons créé ?
On va commencer par combiner les programmes Blink led et celui sur l’utilisation du moniteur Série !

Les programmes de base :

Voici les deux programmes sur lesquels on va se baser :

// Blink avec #define
// Pour prendre les bonnes habitudes dès le départ

#define LEDPIN 13 //Associe 13 au mot " LEDPIN " dans le programme 
//ce qui a pour conséquence de tout simplement remplacer tout les LEDPIN dans le programme par  13.


#define PAUSEON 500 //Associe 500 à PAUSEON.

#define PAUSEOFF 500// Associe 500 à PAUSEOFF

void setup() { 

pinMode(LEDPIN, OUTPUT); //Déclare le numéro de pin associé à LEDPIN comme une sortie = pinMode(13, OUTPUT);

} 

void loop() { 

digitalWrite(LEDPIN,HIGH); //Place le pin digital 13 à l'état HAUT (5V) -> Led allumée
delay(PAUSEON); //Met en pause le programme pendant la valeur de PAUSEON en ms

digitalWrite(LEDPIN,LOW); //Place le pin digital 13 à l'état BAS (0V) -> Led éteinte
delay(PAUSEOFF); //Met en pause le programme pendant la valeur de PAUSEOFF en ms
}
// define 
#define TEMPSENMEMEOIRE 3000 // votre arduino est un poisson rouge qui retient votre prénom pendant 3000 secondes

//Variables :
String msg = "  "; //Variable de type suite de caractère qui est initialisé avec un espace vide

void setup()
{
Serial.begin(9600);
Serial.println("Salut ! Quel est ton prenom ?");
}

void loop()
{
if (Serial.available() ) 
{ 
msg = Serial.readString(); //Stocke le message sous forme de String dans msg
Serial.print("--> "); //Affiche une flèche
Serial.println(msg); //Puis votre message
Serial.print( "Salut " ); 
Serial.println(msg); //Puis votre 
Serial.println(""); //Puis on saute une ligne
delay(TEMPSENMEMEOIRE); // on attend que le temps de mémoire qu'on a choisi en defien
msg =" "; //On oublie le prénom , on vide la mémoire
Serial.println("Salut ! Quel est ton prenom ?");
}
}

Le premier programme permet de faire clignoter une led et le second permet d’effectuer une tâche en fonction du texte envoyé, on pourrait donc essayer de faire un programme permettant de changer l’état de la led en fonction du texte envoyé.

Créer un programme à partir de ces programmes :

Pour combiner deux programmes, il vous faut procéder étape par étape, la première étant de vérifier que les variables utilisées dans les programmes ne sont pas les mêmes. Dans notre cas il n’y en a pas donc on va débuter le programme tout en séparant bien ce qui concerne la led et ce qui concerne la communication Série :

//Informations nécessaires pour la led :
#define LED 13

//Informations nécessaires pour la communication série :
#define BAUDRATE 9600 //9600 bauds par défaut
int recep;  //Variable de test pour la réception
String msg; //Variable contenant le message

Puis on remplit le setup() :

void setup() {
  //Déclaration de la led en tant que sortie :
  pinMode(LED, OUTPUT);

  //Initialisation de la liaison Série :
  Serial.begin(BAUDRATE);
}

Et enfin on s’attaque au coeur du programme. Première étape, on vérifie qu’une donnée est disponible dans l’interface Série :

if (Serial.available() > 0) //Si un message a été reçu :
{

}

Et si oui on effectue les actions souhaitées :

if (Serial.available() > 0) //Si un message a été reçu :
  {

  msg = Serial.readString(); //Lit le message reçu comme une suite de caractères
  Serial.print(msg); //Affiche le message dans l'interface Série
  
    if (msg == "on") //Test du message pour on
    {
      digitalWrite(LED, HIGH); //Allume la led
      Serial.println(" OK"); //Affiche OK sur l'interface Série afin de montrer que l'opération est terminée
    }

    else if (msg == "off") //Test du message pour off
    {
      digitalWrite(LED, LOW); //Éteint la led
      Serial.println(" OK"); //Affiche OK sur l'interface Série afin de montrer que l'opération est terminée
    }
    else //Si le message n'est ni on ni off = Sinon
    {
      Serial.println(" -> Commande inconnue");
    }
  }

Une toute fois toutes les parties assemblées on obtient ce programme :

//Informations nécessaires pour la led :
#define LED 13

//Informations nécessaires pour la communication série :
String msg; //Variable contenant le message

void setup() {
  //Déclaration de la led en tant que sortie :
  pinMode(LED, OUTPUT);

  //Initialisation de la liaison Série :
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) //Si un message a été reçu :
  {

  msg = Serial.readString(); //Lit le message reçu comme une suite de caractère
  Serial.print(msg); //Affiche le message dans l'interface Série
  
    if (msg == "on") //Test du message pour on
    {
      digitalWrite(LED, HIGH); //Allume la led
      Serial.println(" OK"); //Affiche OK sur l'interface Série afin de montrer que l'opération est terminée
    }

    else if (msg == "off") //Test du message pour off
    {
      digitalWrite(LED, LOW); //Éteint la led
      Serial.println(" OK"); //Affiche OK sur l'interface Série afin de montrer que l'opération est terminée
    }
    else //Si le message n'est ni on ni off = Sinon
    {
      Serial.println(" -> Commande inconnue");
    }
  }
}
Programme complet

Maintenant que le programme est terminé, vérifiez que rien ne court-circuite votre carte, branchez-la à votre PC et téléversez le programme. Une fois ceci fait, ouvrez le moniteur série, il vous permettra de commander la led grâce aux commandes on et off comme ceci :

ss (2016-07-20 at 01.34.40)

 

Si ce n’est pas le cas, vérifiez bien qu’en bas à droite, le mode est « Pas de fin de ligne ».

Vous voici maintenant capable de faire réagir votre carte à des messages envoyés par l’interface Série !

 

Maintenant si on incluait une librairie aussi pour corser la chose ? 

C’est parti !

Vous vous rappelez du dernier  code du chapitre précédent avec la table d’ordonnancement ? Et bien on va le combiner avec le code qui est juste au dessus !

Voici donc un autre exemple de codes combinés, avec cette fois incluant une librairie, la librairie ScheduleTable !

#include <ScheduleTable.h>  // on inclue la librairie

#define LED 13  // On définie le pin sur laquelle est la led qu'on va faire clignoter

// On définie la table d'ordonnancement 
ScheduleTable blinkLED(2,1000); //(Nombres d'actions, sur 1000ms)



//Informations nécessaires pour la communication série :
String msg; //Variable contenant le message

void setup() {

  
  //Initialisation de la liaison Série :
  Serial.begin(9600);

  
  pinMode(LED, OUTPUT);

  blinkLED.at(100,ledON);
  blinkLED.at(600,ledOFF);

}

void loop() {
  ScheduleTable::update(); //Met à jour la table
  if (Serial.available() > 0) //Si un message a été reçu :
  {

  msg = Serial.readString(); //Lit le message reçu comme une suite de caractère
  Serial.print(msg); //Affiche le message dans l'interface Série
  
    if (msg == "on") //Test du message pour on
    {
      blinkLED.start(); //Fais tourner la table infiniment
      Serial.println(" OK"); //Affiche OK sur l'interface Série afin de montrer que l'opération est terminée
    }

    else if (msg == "off") //Test du message pour off
    {
        blinkLED.stop(); // arrête la table
      Serial.println(" OK"); //Affiche OK sur l'interface Série afin de montrer que l'opération est terminée
    }
    else //Si le message n'est ni on ni off = Sinon
    {
      Serial.println(" -> Commande inconnue");
    }
  }
}

//Les actions :
void ledON()             //Allumer la led
{
  digitalWrite(LED, HIGH);
}

void ledOFF()            //Eteindre la led
{
  digitalWrite(LED, LOW);
}

 

Si vous êtes arrivés jusque là Bravo ! N’hésitez pas à combiner d’autres parties de code vu dans l’ouvrage 😉 On apprend jamais mieux qu’en expérimentant ! Donc allez y essayez !

Pour ceux qui le souhaitent on va finir ce tome par un petit récapitulatif de tout ce qu’on a vu dans cet ouvrage !

 

<- Retourner à la page précédente | Passer à la page suivante ->

4 réflexions sur « 1.8 Mélangeons les programmes pour aller plus loin ! »

  1. Bonsoir,

    les comparaisons de String n’ont pas l’air de fonctionner ici.
    Malgre le fait que je tape bien on et off (et que c’et affiche dans la console), j’ai:

    on -> Commande inconnue

    (ou off).

    Est-ce que c’est bien la methode ?
    Merci

    1. Bonjour,

      Pouvez vous vérifier que le moniteur série est bien paramétré pour n’ajouter aucun caractère spécial en fin de ligne.
      Le bouton en bas à droite à côté de réglage du baud rate doit indiquer « Pas de fin de ligne » .

  2. Bonjour,
    Auriez-vous l’amabilité de m’indiquer pour quelle raison ne déclare-t-on pas et n’initialise-t-on pas les variables dans le Setup?
    Merci
    Cordialement J-P

    1. Bonjour,

      En C (language Arduino) Si une variable est déclarée dans une fonction elle n’existe et n’est utilisable que dans cette fonction. De plus quand on quitte la fonction dans laquelle la variable est définie alors elle est « détruite ».
      C’est ce qu’on appel la portée d’une variable.
      Le setup, c’est une fonction. On peut y déclarer une variable ( exemple : « int number= 10; » mais si on le fait, cette variable ne sera utilisable que dans le setup…

      Du coup souvent une astuce c’est de définir la variable qu’on veut pouvoir utiliser partout, en global, c’est à dire avant même le setup, en dehors de toute fonction.
      Ainsi la variable pourra être utilisé partout, aussi bien dans le setup, que dans la fonction main, et dans toute autre fonction.
      Cependant il n’est pas recommander d’abuser des variables globales, une ou deux ça va, mais si vous en avez trop ça peut rendre le code plus compliqué à lire … Il est généralement recommandé de créer des variables au plus bas niveau où on en a besoin… Ainsi le code est généralement mieux organisé et plus facile à lire.
      Autre possibilité si on veut conserver la valeur contenu dans une variable entre deux appels d’une fonction, au lieu de faire une variable globale uniquement pour cette raison alors il existe les variables de type « static ». C’est une variable qui s’initialisera une seule fois, la première fois où elle est appelée et elle ne sera pas détruite quand on sort de la fonction.
      Exemple :  » static int number = 0;  » qu’on peut mettre dans notre loop, number sera alors initialisé à 0 une seule fois… en faisant « number++; » dans le loop la variable number contiendra le nombre de fois ou la loop a été exécuté depuis que votre arduino est allumée…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *