C pour Arduino : lire une séquence stockée dans une variable char

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

Je suis bloqué depuis pas mal de temps sur un problème pour un projet sur arduino :

Je souhaite exécuter des instructions en fonction d'une sorte de "partition" stockée dans un char. En gros j'ai mon char, chaque caractère représentant une action a effectuer : "0" faire ceci, "1" faire cela donc "010010101" alterner suivant la séquence demandée.

mais j'ai beau essayer je n'y parviens pas. Voici mon code, si quelqu'un a une idée je suis preneur.

 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
 #include <stdio.h>
 #include <string.h>
 #define ledPin 13                  //utilise la led interne pin 13


const char sequence[] = "0101000011111111111100000000011"; //séquence a éxecuter
const int boutonPin = 7;            // bouton placé sur le pin 7
bool etatBouton = 1;                // variable de l'etat du bouton

void action0();
void action1();
void clignote();

void setup() {
  Serial.begin(9600);                 // ouvre la communication entre l'arduino et le PC 
  pinMode(ledPin, OUTPUT);         // la led est une sortie
  pinMode(boutonPin, INPUT);       // le bouton est une entree
  Serial.print("pret");
}

void loop() {
delay(500);
etatBouton= digitalRead(boutonPin);  // on lit l'etat du bouton
  if (etatBouton == LOW) {           // si le bouton est appuyé, on execute la séquence
    Serial.print("bouton appuye, depart sequence \n");
    digitalWrite(ledPin, HIGH);
    for (int i =0; i<31; i++) {
      if (sequence[i] == 0){         // si le Ième caractere caractere est un zero on effectue l'action0
        action0();
        }
      else if (sequence[i] == 1) {   // si le Ième caractere caractere est un un on effectue l'action1
        action1();
        }
      else {
        clignote();
        }
      }

  }
  Serial.print("termine");
}



void action0() {
  Serial.print("0");    //l'action est simplifiée pour gagner en lisibilité
}

void action1() {
  Serial.print("1");
}

void clignote() {
   digitalWrite(ledPin, HIGH); 
   delay(300);
   digitalWrite(ledPin, LOW); 
   delay(300);
   digitalWrite(ledPin, HIGH); 
   delay(300);
   digitalWrite(ledPin, LOW);
}

J'ai aussi essayé avec strcmp mais ca ne fonctionne pas non plus…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 if (etatBouton == LOW) {
    Serial.print("bouton appuye, depart sequence \n");
    digitalWrite(ledPin, HIGH);
    for (int i =0; i<31; i++) {
      if (strcmp(sequence[i], "0") == 0){
        action0();
        }
      else if (strcmp(sequence[i], "1") == 0) {
        action1();
        }
      else {
        clignote();
        }
      }
+0 -0

Salut,

peut-être que "sequence[i]" (ligne 28 et 31 de ton code) est juste un caractère non modifiable et du coup, tu dois utiliser les apostrophes autour du 1 et du 0 ?

J'ai jamais utilisé Arduinio, je peux me tromper (comme ça arrive souvent, d'ailleurs :-° ).

Édité par Ilearn32

+0 -0
Auteur du sujet

Hello, Déjà, merci pour vos réponses rapide! :)

pourquoi faire un tableau de char plutot qu'un tableau de boolean ?

juke

J'ai essayé aussi mais je n'y arrive pas…

peut-être que "sequence[i]" (ligne 28 et 31 de ton code) est juste un caractère non modifiable et du coup, tu dois utiliser les apostrophes autour du 1 et du 0 ?

Ilearn32

Effectivement j'avais compris que je comparais des choux et des carottes mais je ne voyais pas comment m'en sortir, j'ai essayé de remplacer 0 par "0" mais le résultat n'était pas bon non plus.

C'est juste que dans les 2 cas, ton test est incorrect. Je te laisse chercher comment utiliser strcmp. Par contre pour :

1
 else if (sequence[i] == 1)

Ici tu compares quoi ? Regarde les types que tu compares :)

AmarOk

J'ai finalement réussi en mettant '1' au lieu de "1" ou 1 tout court, je ne savais pas qu'il existait une réelle différence entre ' et "… (noobs !) mais je ne comprends tout de même pas totalement, pour :

1
else if (sequence[i] == 1)

je compare la valeur renvoyée à l'adresse i avec la valeur 1 non? Ça devrait marcher (enfin visiblement pas mais pourquoi?)

+0 -0

J'ai finalement réussi en mettant '1' au lieu de "1" ou 1 tout court, je ne savais pas qu'il existait une réelle différence entre ' et "… (noobs !) mais je ne comprends tout de même pas totalement, pour :

1
else if (sequence[i] == 1)

je compare la valeur renvoyée à l'adresse i avec la valeur 1 non? Ça devrait marcher (enfin visiblement pas mais pourquoi?)

Rémi

Salut !

Pas tout à fait. ;) En fait 1 vaut… 1 (quelle surprise !) mais dans ton tableau ce ne sont pas des entiers (int) mais des caractères (char). Or la valeur d'un caractère se trouve dans la table ASCII. Ainsi, le caractère '1' vaut 49. Donc tu veux savoir si 49 = 1, ce qui est bien sûr toujours faux.

EDIT : grillé

Édité par PG06

“I don't love studying. I hate studying. I like learning. Learning is beautiful.” – Natalie Portman

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte