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 :

Vulnérabilité du code face aux imprévus


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2023
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Vulnérabilité du code face aux imprévus
    Bien le bonjour à tous.

    J'ai écrit un code Arduino que j'ai essayé de simuler via le logiciel "PROTEUS", mais malheureusement pour moi, ça ne fonctionne pas comme je le souhaite.

    Lors de la simulation sous Proteus, lorsque j'appuis sur le bouton trois (Btn3), le système ne répond plus (même lorsque j'appuis sur un autre bouton ) et seule la ledB clignote.

    J'aimerai comprendre pourquoi le système ne répond plus lorque j'appuis sur le bouton 3 (Btn3).

    Quelqu'un peut-il m'aider à comprendre pourquoi ?

    Voici le code source ci-dessous :


    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
     
    /* instructions de pré-compilation pour définir les variables ledR,....,Btn2*/ 
    #define ledR 6   
    #define ledB 7
    #define piezo 8
    #define Btn1 10          // boutons pour le piezo
    #define Btn2 11          // boutons pour led rouge
    #define Btn3 12          // boutons pour led bleue
    #define INPUT_MODE 0     // Mode pull-UP pour les boutons
    /* instructions de pré-compilation pour définir les variables ledR,....,Btn2*/
     
    /*Variable globales*/
    char  statebtn1;         // Variable pour garder l'etat du bouton 1
    char  statebtn2;         // Variable pour garder l'etat du bouton 2
    char  statebtn3;         // Variable pour garder l'etat du bouton 3
    long int timenextledR;
    long int timenextledB;
    long int timeBtn = millis();
    /*Variable globales*/
     
    /*Etats du système*/   
    char LedRL=2;
    char LedRI=7;
    char LedBH=3;
    char LedBI=8;   
    char LedBL=4;
    char LedBF=9; 
    char pieH=5;   
    char pieL=6;  
    char stateledR=2;   
    char stateledB=4; 
    char statepie=6; 
    char act; 
    /*Etats du système*/
     
    /*Déclaration des fonctions*/
    void event(int a,int b,int c);   // fonction pour scructer les evènements
    char condition();              // fonction pour vérifier les conditions 
    void action(char a);              // fonction pour faire les actions
    /*Déclaration des fonctions*/
     
     
    void setup() {
      for(int i=6;i<9;i++){       // boucle pour configurer les variables ledR,...,piezo en sortie
        pinMode(i,OUTPUT);
      }
      for(int j=10;j<13;j++){     // boucle pour configurer les variables Btn1 et Btn2 en entrée
        pinMode(j,INPUT_PULLUP);
      }
    }
     
    void loop() {
     event(Btn1,Btn2,Btn3);
     condition();
     action(act);
    }
     
    void event(int a,int b,int c){          // fonction pour scructer les evènements
      if(digitalRead(a) == INPUT_MODE && millis() - timeBtn > 500){
            timeBtn = millis();
            statebtn1=1;      //variable pour dire bouton 1 appuyé
      }
      if(digitalRead(b) == INPUT_MODE && millis() - timeBtn > 500){
            timeBtn = millis();
            statebtn2=1;      //variable pour dire bouton 2 appuyé
      }
      if(digitalRead(c) == INPUT_MODE && millis() - timeBtn > 500){
            timeBtn = millis();
            statebtn3=1;      //variable pour dire bouton 2 appuyé
      }
    }
     
    char condition(){
      if(statebtn1==1){
        if(statepie==pieL){
            act=1;
        }
        else if(statepie==pieH){
            act=2;
        }
        statebtn1=0;
      }
      if(statebtn2==1){
        if(stateledR==LedRL){
            act=3;
        } 
        statebtn2=0; 
      }
      if(stateledR==LedRI){
            act=4;
      }
      if(statebtn3==1){
        if(stateledB==LedBL){
            act=5;
        }
        else{
          act=8;
        }
        statebtn3=0;
      }
      if(stateledB==LedBH){
            act=6;
      }
      if(stateledB==LedBI){
            act=7;
      }
      if(stateledB==LedBF){
            act=5;
      }
      return act;
    }
     
    void action(char a){
      switch(a){
          case 1:
            digitalWrite(piezo,HIGH);
            statepie=pieH;
            act=0;
          break; 
          case 2:
            digitalWrite(piezo,LOW);
            statepie=pieL;
            act=0;
          break;
          case 3:
            digitalWrite(ledR,HIGH);
            timenextledR=millis();
            stateledR=LedRI;
            act=0;
          break;
          case 4:
            if(millis()-timenextledR>=1500){
                digitalWrite(ledR,LOW);
                stateledR=LedRL; 
            }
            act=0;
          break;
          case 5:
            digitalWrite(ledB,HIGH);
            timenextledB=millis();
            stateledB=LedBH;
            act=0;
          break;
          case 6:
            if(millis()-timenextledB>=1000){
              digitalWrite(ledB,LOW);
              stateledB=LedBI; 
            }
            act=0;
          break;
          case 7:
            if(millis()-timenextledB>=2000){
              stateledB=LedBF; 
            }
            act=0;
          break;
          case 8:
            digitalWrite(ledB,LOW);
            stateledB=LedBL;
            act=0;
          break;
      } 
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 330
    Points : 4 148
    Points
    4 148
    Par défaut
    bonjour,

    le type de variable pour millis() doit être un unsigned long ou son alias uint32_t.

    Ce n'est pas l'appui (la transition) des boutons qui est détecté mais son état bas. Il y a donc une autorépétition durant tout l'appui (comme un clavier répète une touche enfoncée). Est-ce voulu ?

    Une demi seconde entre lecture des boutons ?

    La gestion des actions et des événements suppose l'unicité (une seule action à un moment donné). Par exemple, dans la gestion des événements c'est le dernier pris en compte qui reste, les autres sont oubliés.

    Je pense qu'il faut revoir cela. Event() doit modifier l'état du système à partir des seuls transitions à 0 des boutons (les seules entrées). Peut être le fusionner avec condition().

    Les leds se verraient dotées d'un état plus riche dont action gèrerait la dynamique. L'un des moyens est de créer un type énumération {ledOff, ledOn, Blink1Off, Blink1On, Blink2Off, Blink2On}, deux blinks car il semble qu'il y ait deux types de clignotement.

    Il n'y a aucune raison pour qu'action() ne traite qu'un cas de la configuration (switch() ) alors que plusieurs éléments peuvent avoir changé d'état.

    Ce ne sont que des propositions.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2023
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Concernant les variables pour millis(), je les ai modifié en "unsigned long", comme vous me l'avez suggéré, mais le problème persiste encore.

    Les boutons poussoirs sont configurés en mode "PULLUP", donc le "INPUT_MODE" (zero) représente l'état d'une entrée lorsque le bouton poussoir ( connecté à cette entrée ) est actionné.

    Lorsqu'on appuis sur un bouton poussoir, il envoie du "zero volt" ( et non pas du "5" ou "3.3 volt") à l'entrée où il est connecté.

    Pour ce qui est du reste de votre message, je dois avouer que je ne parviens pas à comprendre ce que vous vouliez me dire par là.


    S'il vous plaît, pouvez-vous modifier mon code en y apportant les modifications que vous me suggérez de faire ?

    Car je ne comprends pas ce que vous me proposez de faire.

    Merci

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    ce qu'il essayait de vous expliquer c'est que vous détectez l'état du bouton (appuyé ou pas) alors que ce qui vous intéresse c'est le CHANGEMENT d'état (passage de pas appuyé à appuyé)

    il y a dans l'IDE arduino un tuto sur la détection de changement d'état : https://docs.arduino.cc/built-in-exa...hangeDetection
    étudiez cela et c'est ce qu'il faut mettre dans votre code

    une autre façon de faire c'est de prendre l'une des nombreuses bibliothèques de gestion des boutons, elles font cela pour vous.

Discussions similaires

  1. Vulnérabilité de NPM face à du code malicieux ?
    Par niusha dans le forum NodeJS
    Réponses: 2
    Dernier message: 03/04/2016, 18h34
  2. [A-03] Code sensible aux majuscules
    Par Chris 81 dans le forum VBA Access
    Réponses: 9
    Dernier message: 01/10/2008, 12h00
  3. Comment associer le code ASCII aux caractères
    Par y.medium dans le forum C
    Réponses: 18
    Dernier message: 18/11/2007, 16h20
  4. Génération de code : accès aux méthodes
    Par Yannick_from_31 dans le forum Langage
    Réponses: 7
    Dernier message: 29/08/2007, 15h57
  5. [Sécurité] Contrôle d'accès au code et aux données
    Par davcha dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 27/06/2007, 09h39

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