IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Modifier à la volée une variable dans une boucle


Sujet :

Arduino

  1. #1
    Membre averti

    Homme Profil pro
    Electronicien
    Inscrit en
    Février 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien

    Informations forums :
    Inscription : Février 2014
    Messages : 20
    Par défaut Modifier à la volée une variable dans une boucle
    Bonjour,

    j'ai réalisé un petit programme qui me permet de lire les data lorsqu'elles se présentent sur le port série.
    Je récupère le contenu des variables, le convertis en "int" et là mes données sont prêtes à être utilisées, mais.....c'est aussi là que je bloque.

    Dans la boucle "void loop" je ne sais pas comment interroger le port série et modifier l'état d'une sortie en fonction de la valeur reçue, tout cela de façon aléatoire.

    voici le programme, avec les dernières lignes en commentaires car elle ne fonctionnent pas comme prévu.
    Merci d'avance pour vos explications.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(10, 9); // RX, TX
     
     
    /*------------------DECLARATION DES VARIABLES-----------------*/
    int Reception=0;  	  
    String data="";   	  
    int a=0;			  
    char *tableau[5]; 	  
    String On="";
    String Off="";
    char buff[64];
    int CO2_ON;
    int CO2_OFF;
    /*------------------------------------------------------------*/
     
     
    void setup() 
    {
      pinMode(LED_BUILTIN, OUTPUT);
      Serial.begin(9600);
      delay(1000);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }
      // set the data rate for the SoftwareSerial port
      mySerial.begin(9600);
     
      if (!ds3231.begin()) {
        Serial.println("[ERREUR] Impossible d'établir la connexion avec le module DS3231");
        Serial.flush();
        while (1);
      }  
    }
     
     
     
     
    void loop()
    {
      if (mySerial.available()>0)	/*Interrogation du port serie*/
      {
     
        Reception=mySerial.read();
     
        if (char(Reception) != '\n')
        {
          data+=(char)Reception;
        }
        else 
        {
          int Taille = data.length() + 1;       /*---Longueur de la chaîne-----------------------------------------------------------------*/
          char tab_char[Taille];              /*---Tableau de type char dont les dimenssions sont égales à la longueur de la chaîne------*/
          data.toCharArray(tab_char,Taille);  /*---On passe les caractères de la chaîne dans le tableau créé précedement-----------------*/
          for (a=0; a<=4; a++)
          {
            if (a > 0)
            {
              tableau[a]=strtok(0,";");     /*découpage de la chaine au niveau des points virgules*/
              if (a == 1){Off = tableau[1];}
            }                               /*                                                    */
            else                            /*         chaque ligne du tableau                    */
            {                               /*                                                    */
              tableau[a]=strtok(tab_char,";");  /*         contient un bout de la chaine              */
              On = tableau[0];
            }
          }
        }
      }
     
      if (char(Reception) == '\n')
        {
          Reception=0;
          data="";
     
      /*------------------------CO2_ON--------------------------------------------------*/
          String strCO2;
     
          Taille=On.length();
          index = On.indexOf("=");
          index++;
          strCO2=On.substring(index, Taille);
          CO2_ON = strCO2.toInt();
     
      /*------------------------CO2_OFF--------------------------------------------------*/
          Taille=Off.length();
          index = Off.indexOf("=");
          index++;
          strCO2=Off.substring(index, Taille);
          CO2_OFF = strCO2.toInt();
      /*-------------------------------------------------------------------------------*/
          sprintf(buff, "CO2_ON:%02d   CO2_OFF:%02d", CO2_ON, CO2_OFF);
          Serial.println(buff);      /*Affichage des valeurs de CO2_ON et CO2_OFF*/
          Serial.flush();  
     
        }
     
    //  digitalWrite(LED_BUILTIN, HIGH) ;
    //  delay (CO2_ON);
    //  digitalWrite(LED_BUILTIN, LOW) ;
    //  delay (CO2_OFF);
     
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 882
    Par défaut
    soit vous utilisez les String, soit vous ne les utilisez pas du tout.

    Si vous voulez utiliser les String, vous pourriez tester l'arrivée d'un caractère qui signalerait que la trame à analyser est en train d'arriver et dans ce cas vous pourriez l'extraire de manière bloquante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (mySerial.available() > 0) {
      String reception = mySerial.readStringUntil('\n'); 
      reception.trim();
      if (reception.length() != 0) { 
        // on a reçu quelque chose
     
        // >>>>> ICI CODE D'ANALYSE <<<<<<<
     
      }
    }
    ce n'est pas forcément super robuste mais pour un composant qui émet les infos de manière structurée correctement sur le port série virtuel, ça devrait aller.

    sinon il faut faire une attente asynchrone un peu comme vous faites en remplissant un buffer, puis quand le caractère de fin est reçu vous analysez la trame.
    il y a un bon tuto sur le forum Arduino en anglais qu'il faut lire http://forum.arduino.cc/index.php?topic=396450.0


    il ya aussi bien sûr

    https://arduino.developpez.com/cahie...on-port-serie/

  3. #3
    Membre averti

    Homme Profil pro
    Electronicien
    Inscrit en
    Février 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien

    Informations forums :
    Inscription : Février 2014
    Messages : 20
    Par défaut
    Merci pour votre réponse rapide. Je regarde tout cela cet après-midi

  4. #4
    Membre averti

    Homme Profil pro
    Electronicien
    Inscrit en
    Février 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien

    Informations forums :
    Inscription : Février 2014
    Messages : 20
    Par défaut
    Je me suis inspiré de votre publication sur le forum : "Arduino : Comment gérer le temps ?", et tout fonctionne comme prévu.

    Merci pour cet apport de compétences.

    Mon projet avance, je m'emploie à présent à exploiter les infos du RTC DS3231, dans le but de démarrer, puis d'arrêter un processus à une heure définie.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    void onoff()
    {
    	if (bascule == true)
    	{
    		digitalWrite(LED_BUILTIN, HIGH);
        CO2 = CO2_ON*1000;
    	}
    	else
    	{
    	digitalWrite(LED_BUILTIN, LOW);
        CO2 = CO2_OFF*1000;
    	}
    	debut = millis();
    }
     
    void setup() 
    {
      pinMode(LED_BUILTIN, OUTPUT);
      bascule = !bascule;
      onoff();
      Serial.begin(9600);
     
    /***********
    *********
     
     
    ****/
    }
     
     
    void loop()
    {
     
    /****************
    // >>>>> ICI CODE D'ANALYSE <<<<<<<
     
     
    ************/
    	if (maintenant - debut >= CO2)
    	{
    		bascule = !bascule;
    		onoff();
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/01/2010, 16h38
  2. Creer des variables dans un boucle for
    Par zentro dans le forum Général Python
    Réponses: 2
    Dernier message: 06/04/2008, 07h22
  3. Declaration de variables dans un boucle
    Par Nohatred dans le forum C
    Réponses: 17
    Dernier message: 07/09/2006, 10h51
  4. [Optimisation?] Déclaration de variable dans les boucles
    Par romaintaz dans le forum Langage
    Réponses: 5
    Dernier message: 11/08/2006, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo