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

Le problème exposé dans ce sujet a été résolu.

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();
        }
      }

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 :-° ).

+0 -0

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?)

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

1=> entier '1' => chaîne de caractère représenter le chiffre 1

1 != '1'

C'est la grande histoire de l'informatique.

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é

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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