Bonjour.
J'ai un petit souci, j'envoi un nombre de mon PC vers mon arduino en liaison série, c'est un nombre de 4 chiffres.
Ce que je cherche à faire est de découper ce nombre en 2x2 chiffres et utiliser le résultat pour faire fonctionner un switch ( les 2 premiers chiffres comme valeur switch et les 2 autres comme valeur case ).
Je n'ai rien trouvé en ce sens.
Merci .
Jacques
J'ai fait un petit oubli, après avoir séparé les chiffres et fait fonctionné les "switch" j'envoie une valeur (X) à un arduino slave en DMX serial.
Sur le PC j'ai conçu une application "DMX" en VB net, l'arduino sert de relai vers les slaves.
grosso modo, j'aurais aimé faire ceci:
X = valeur serial reçu, on coupe X en 2, les 2 premiers chiffres servent comme valeur switch les 2 autres comme valeur case.
Suivant la case, j'envoie un code vers les slaves ( canal, code couleur LED et ou code moteur ).
Voili voilou voila .
Je n'ai rien trouvé.
Merci pour le lien mais le code ne correspond pas.
Ce que je cherche est uniquement en INT pas en STRING qui est refusé par le switch.
Je dois avouer que je ne suis pas du tout spécialiste en codage C++ et que je débute en arduino.
J'ai beau avoir 70 ans, il n'y a pas d'âge pour apprendre.
Cordialement.
Jacques.
Comment est envoyé le nombre en question, sous forme d'une chaîne de caractères ou sous forme binaire?
Définis clairement les entrées et les sorties.
- le type
- le format d'échange
Cela permettra de répondre plus surement à ton besoin.
Bonjour,
Si X est la valeur reçue alors
uint8_t X1=X/100; // deux chiffres de poids fort
uint8_t X2=X%100; // deux chiffres de poids faible
Mais comme le dit @fdufnews il faut savoir comment est transmis le nombre en question. S'il est transmis en acsii il faut convertir la chaine reçue en nombre.
Bonjour, si tu veux envoyer deux valeurs, le mieux est de faire ce que te préconise @jpbbricole.
Es tu obligé t'utiliser un un nombre à 4 chiffres?
Es tu sûre qu'il ne risque pas d'avoir de changement sur le nombre de chiffre dans le future?
En générale sur le port séries indépendamment du type réel des données envoyés, on envois toutes les données sous formes de chaine de caractère séparé par un séparateur(ex ";", la virgule pouvant être utilisé en Français comme séparateur des nombres réels).
Il est de plus très simple de convertir ta chaine de caractère en entier ou même nombre décimal
String value1 = "100";
int valueInt = value1.toInt()+10;
Serial.println(valueInt);
Bonjour et merci pour ces réponses.
L'envoie de l'application PC est une chaine de caractères de 0101 à 9999.
Ce que je cherche à faire:
A = Serial.read();
B = extraire les 2 derniers chiffres de A
switch (A)
{
case B:
"code envoyé vers le slave"
break;
}
Merci.
Jacques
Il n'y a aucun séparateur entre les envois?
Comment détermine-t-on que l'on reçoit le premier caractère d'un groupe de quatre?
Donc, il faudrait que je place un séparateur tel que " ; " par exemple ?
Mais ensuite, comment faire car avec le code que tu m'as donné j'arrive à faire accepter au switch les 2 premiers chiffres mais pas les 2 derniers .
En fait, les 2 premiers chiffres correspondent au canal, les 2 derniers aux codes couleurs, les 2 séries sont donc liées.
Je n'ai pas encore peaufiné mon code PC donc je peux faire ce qu'il faut et changer le code, le tout est que je puisse commander les LEDS.
Merci.
void loop()
{
while (Serial.available())
{
String r = Serial.readString();
String sub = r.substring(0, 2);
String sub1 = r.substring(2, 4);
int val1 = sub.toInt();
int val2 = sub1.toInt();
/* AFFICHAGE DU CODE DECOUPE */
lcd.setCursor(0,0); lcd.print(r); lcd.print(" ");
lcd.setCursor(0,1); lcd.print(val1); lcd.print(" ");
lcd.setCursor(0,2); lcd.print(val2); lcd.print(" ");
/* ************************* */
switch(val1)
{
case 1: // val2 n'est pas accepté
digitalWrite(LED,HIGH);
break;
case 4:
digitalWrite(LED,LOW);
break;
}
}
}
La clause case ne peut contenir qu'une constante tu ne peux pas faire
case val2:
En fait ta demande est mal formulée. Dans le post #3 il y a un début d'explication mais ton usage de switch et case embrouille plus l'explication qu'autre chose.
Tu ne décris pas clairement ton besoin.
Tu reçois 2 nombres:
- le premier est un numéro de canal
- le second une fonctionnalité
C'est bien ça?
Concernant le numéro de canal, dans le programme que tu veux réaliser sur l'Arduino. Quelle est sa fonction?
- permettre à ton Arduino de se reconnaître sur un bus de donnée pour qu'il sache que la donnée qui arrive lui est destiné?
- donner accès à une sous-fonction dans ton programme?
Donne des exemples pratiques de ce que tu veux obtenir.
Effectivement, je ne suis pas clair.
Ce que je cherche à faire :
De mon application PC via le port série, j'envoie sur l'arduino un code composé de 4 chiffres, les 2 premiers servent à identifier le canal (switch de 01 à 99) les 2 suivants les couleurs attribuées au canal choisi (case de 01 à 10).
Suivant le canal et la couleur, une commande "pseudo DMX" est envoyée sur un arduino slave (de slave canal 1 à slave canal 10) qui agit en fonction des codes envoyés dans 'case'.
( Pas évident à expliquer en clair ).
En bref, j'aimerais que mon code envoyé depuis le PC serve à sélectionner un switch et sa case correspondante.
Ex: si j'envoie 0110 depuis le PC ça signifie le canal 01 et le code 10.
Merci pour le temps passé.
Jacques
Clarifie.
Qu'entends-tu par pseudo DMX?
Sur un autre port série (ou plusieurs)?
A quel débit?
Et d'ailleurs quel Arduino utilises-tu? Les cartes basiques ne disposent que d'un seul port série matériel ce qui restreint les possibilités car il faut alors utiliser une émulation de port série par logiciel.
Effectivement, j'utilise un NANO comme master et le pseudo DMX c'est parce que la sortie se fait sur un MAX485 mais ça n'a rien à voir avec un vrai DMX ( erreur de langage ) mille excuses.
Le fait que tu utilises un Nano implique que si tu as des liaisons série supplémentaires elles seront gérées par la librairie softwareSerial.
Il y a quelques conséquences à cela:
- si tu gères plusieurs liaisons avec softwareSerial, une seule instance peut être active en réception à un instant donné. Mais si je comprends bien cela ne te concerne pas.
- le débit maximum est limité à 115200 bauds
- comme c'est une émulation de port série cela occupe plus le CPU donc il sera moins réactif s'il a de la charge de calcul par ailleurs.
Tu n'as pas répondu aux autres questions, en particulier est-ce que les numéros de canaux que tu reçois correspondent à des ports série distincts ou est-ce seulement un numéros de canal que tu propages.
Voilà ce que je comprends de ton besoin. La première boite, c'est ce que fait le début du petit bout de programme que tu as mis un peu plus haut. Pour la seconde boite je n'ai toujours pas les idées claires sur ce que tu veux faire.
X X Y Y
|
V
________________________
| |
| |
________________________
/ \
/ \
V V
canal paramètre
| |
V V
________________________
| |
| ??? |
________________________
| |
V V
? ?
Effectivement, je n'ai qu'un port série je n'avais pas pensé à ça.
Comme je n'ai qu'un port série, que le PC l'utilise déjà et que les slaves sont en parallèles aussi sur le même port ça ne va pas fonctionner.
Je pense que je vais continuer comme j'avais prévu au départ, à savoir une console classique avec boutons et laisser tomber le PC pour le moment.
Je verrai par la suite à utiliser un MEGA plus tôt qu'un NANO.
Merci encore pour tout.
Cordialement
Jacques.
Bonjour Jacques
Il est utilisé par quoi, si c'est pour la programmation depuis l'IDE Arduino, il ne sert que pour la programmation, après il est libre. C'est juste un peu plus "acrobatique" que de développer quelque chose qui utilise Serial, mais c'est jouable. Il faut juste faire attention de ne pas "demander" ce port à 2 endroits, sinon erreur annoncée.
Cordialement
jpbbricole
Rebonjour Jacques
Encore un complément d'information,:
Pour faciliter le développement et de par là le traitement des données reçues du PC, tu peux te passer du programme du PC et introduire tes chiffres directement dans la ligne de commande du moniteur,
c'est le même "chemin" que ce qui vient du PC.
Ne pas oublier les réglages:
Si tu ne veux pas de terminaison, c'est aussi possible.
Une fois ton programme au point, tu fermes le moniteur de l'IDE et connectes le PC et tu essaies.
Cordialement
jpbbricole
Je n'ai pas testé, mais tu pourrais continuer à utiliser le port série pour piloter l'arduino master et utiliser une liaison I2C pour tes arduino esclaves.
Tu ne pourras jamais faire ça.
c'est parce que dans ce code, A et B doivent être connus dès la compilation.
Or dans ton cas, il ne le sont pas, puisque reçus pendant l'exécution du programme.
Il va falloir trouver une autre façon de programmer.
Désolé.
EDIT: pardon, c'est B qui doit être connu dès la compilation.
Quant à A c'est a-priori une valeur, alors je ne comprends pas ton switch - un switch se fait sur une variable.
Tu t'es mis en tête de traiter ton problème avec un switch, mais ça va pas le faire à mon avis.