sequence sur le portd

@JP bravo pour l'émulateur, ça permettra de tester plus simplement des scénari (avez vous poussé la sophistication jusqu’à traiter de A à F pour envoyer des configurations 4 bits arbitraires ?)

sur ce point:

jpbbricole:
Le câblage avec le récepteur se fera
7 -> 4
8 -> 5
9 -> 6
10 -> 7

Je suis en vadrouille donc sur mon smartphone et donc j'ai pas facilement accès au contenu du zip mais je suppose qu'il faut aussi relier les GND des 2 cartes pour que ça fonctionne. peut-être bon de le rajouter dans les recommandations pour le prochain testeur

J-M-L:
(avez vous poussé la sophistication jusqu’à traiter de A à F pour envoyer des configurations 4 bits arbitraires ?)
je suppose qu'il faut aussi relier les GND des 2 cartes pour que ça fonctionne. peut-être bon de le rajouter dans les recommandations pour le prochain testeur

Pour le GND c'est fait (Ah la force de l'habitude)
Pour de A à F, la honte je n'y avait même pas pensé (Là c'est plus la force de l'habitude mais l'âge :confused: )

Quand je te dis que grâce à toi je vais friser la perfection :slight_smile:

Cordialement
jpbbricole

jpbbricole:
Quand je te dis que grâce à toi je vais friser la perfection

LOL

J'ai l'impression qu'on ne sera jamais d'accord sur l'usage de le classe String dans des codes de démos pour des débutants ni sur le manque du break; quand vous recevez le '\n' dans votre écoute du port série...

mais bon - c'est un monde libre - l'important c'est de se faire plaisir

Je jetterai un oeil au code ce soir - si ça vous intéresse je pourrais partager mes impressions, mais j'ai l'impression que ça vous fâche (alors que c'est vraiment constructif et orienté débat d'idées).

Bonsoir

la question va paraitre bete, mais pourquoi vous declarez

byte masqueNettoyage = B11110000;

et aussi
void loop()
{
byte pindVal = PIND & B11110000;

c' est pas suffisant le masque dans la loop ?

merci encore pour votre aide , je teste , je teste

KdH76:
la question va paraitre bete, mais pourquoi vous declarez

Non c'est le programmeur qui est bête!!!

byte pindVal = PIND & masqueNettoyage;                                           // Pour masquer les bits inutiles
 if (pindVal > 0)
 {
 delay(5);                                                              // Attente que tout les bits soient positinnés (sorte d'antirebonds)
 pindVal = PIND & masqueNettoyage;                                            // Pour masquer les bits inutiles

Il faut corriger cette ligne aux 2 places
byte pindVal = PIND & masqueNettoyage;

le programme tourne quand même tant que l'on ne change pas l'emplacement, j'ai ajouter cette variable masqueNettoyage après-coup pour rendre le programme plus souple à gérer.

Cordialement
jpbbricole

je testerais demain soir

merci jpb

Allez quelques commentaires promis - qui valent ce qu’ils valent puisque je pense que votre code est fonctionnel pour l’objectif du test

Dans l’émetteur:

  • bon y’a des Strings… :slight_smile: mais quitte à les utiliser autant ne pas non plus doubler l’usage mémoire.
    au lieu de faire commandeRecue.toCharArray(commandeRecueChar, commandeLongueure);utilisez juste un const char * commandeRecueChar = commandeRecue.c_str(); (cf la doc de c_str() ) pour accéder au buffer en lecture

vous pourrez toujours lire avec un int freqIndex = (int)commandeRecueChar[i];le cast en (int)n’est pas nécessaire puisqu’un char est un entier signé sur 8 bits, il migre donc automatiquement dans un entier signé 16 bits sans soucis.

  • vous transformez tout en String rien que pour m’embêter je suis sûr… :slight_smile:
    Serial.print(String(bitRead(freqIndex, i)));pourquoi ne pas faire tout simplement Serial.print(bitRead(freqIndex, i));pas besoin d’instancier une chaîne et de stocker la conversion dedans pour ensuite juste imprimer et détruire la chaîne…

  • pour la lisibilité au lieu d’utiliser les code ASCII vous pouvez directement utiliser un caractère

if (freqIndex > 64)                          // Si caractere >= A
		{freqIndex -= 7;}
		freqIndex -= 48;

→ utiliser ‘A’ ou ‘0’

  • comme déjà dit, je préconise l’ajout du break après avoir reçu le ‘\n’
		char monChar = (char)Serial.read();                          // Lecture caracteres
		if (monChar == '\n')                                         // Si caractere Nouvelle Ligne (Lf 0xA ou 10) donc fin de ligne
		{
			monCommandNew  = true;                                   // Flag de nouvelle chaine recue
			break; // <<<==== ICI

		}

de manière générale ça permet d’avoir dans le buffer de lecture une ligne de commande à traiter alors que sinon, si vous avez déjà entamé la réception de la ligne suivante, vous allez la rajouter dans cette ligne. (bien sûr je ne recommande pas la classe String non plus, un bon buffer qu’on remplit suffit au lieu de créer des petites Strings en faisant monCommandRx += monChar; (quand la reserve est dépassée).

  • toujours sur les Strings pour éviter d’en créer plus que de nécessaire et remplir la mémoire, quand vous en passez une en paramètre essayez de la passer par référence quand c’est possible → au lieu devoid monitCmdRecue(String commandeRecue)faitesvoid monitCmdRecue(String& commandeRecue)

voilà. mais comme dit plus haut - c’est fonctionnel pour l’objectif fixé, c’est ce qui compte. Ensuite ce sont des choix personnels ou style de programmation.

J’avais codé un truc similaire au votre pour l’émission, mais j’étais allé à l’essentiel et m’attachant à basculer toutes les pins en même temps donc par manipulation des ports.

Si ça vous tente de commenter en retour et me dire ce que vous auriez fait différemment. c’est fonctionnel pour un UNO et assez condensé.

// Emetteur pour Arduino UNO
// définir les pins qui vous interessent dans le masque 
// elles doivent être contigües dans le PORT B (digital pin 8 to 13)

const byte masquePinActives = B011110; // ici on prend donc  D9, D10, D11, D12 (et pas D8 ni D13)

const unsigned long  longueurImpulsion = 100ul; // durée de l'impulsion en Millisecondes
const unsigned long  longueurPause = 135ul;     // durée de pause en Millisecondes

const byte decalageMasque = __builtin_ctz(masquePinActives); // le nombre de 0 à droite du masque

void setup() {
  Serial.begin(115200);
  DDRB |= masquePinActives; // on met en sortie les bits qui nous interessent dans le masque et ne touche pas les autres
  PORTB &= (byte) (~masquePinActives); // on met les sorties choisies à 0
}

void loop() {
  if (Serial.available()) {
    char c = Serial.read();
    byte elementSequence = 0xFF;

    if ((c >= '0') && (c <= '9')) elementSequence = c - '0';
    else if ((c >= 'a') && (c <= 'f')) elementSequence = c - 'a' + 10;
    else if ((c >= 'A') && (c <= 'F')) elementSequence = c - 'A' + 10;

    if (elementSequence != 0xFF) {
      PORTB |= (elementSequence << decalageMasque);
      delay(longueurImpulsion);
      PORTB &= (byte) (~masquePinActives); // on met les sorties choisies à 0
      delay(longueurPause);
    }
  }
}

si ça vous tente je vous donnerai mon avis sur le récepteur, si ça sert à quelque chose (mais globalement il fait je job aussi je pense)

La seule chose que je dirais cependant pour KdH c’est de changer le

	while (tonValeur != 0)                                                     // Attente fin tonalité
	{tonValeur = PIND & B11110000; delay(100);}

en

	while (tonValeur != 0)                                                     // Attente fin tonalité
	{tonValeur = PIND & B11110000; }

ou de mettre un délai plus petit pour éviter tout risque sur le timing (et noter que le timeout n’arrivera pas si on ne reçoit pas la trame nulle, c’est une partie bloquante du code que l’approche par machine à état réglait)

J-M-L:
voilà. mais comme dit plus haut - c'est fonctionnel pour l'objectif fixé, c'est ce qui compte. Ensuite ce sont des choix personnels ou style de programmation.

Allez quelques commentaires promis - qui valent ce qu'ils valent puisque je pense que votre code est fonctionnel pour l'objectif du test

Voilà à peu près tout ce qu'il y a retenir, c'est du pure J-M-L.
Ne perds pas ton précieux temps à faire le même exercice avec le programme récepteur....

Bonne journée
Cordialement
jpbbricole

jpbbricole:
Voilà à peu près tout ce qu'il y a retenir, c'est du pur J-M-L.

Chacun sa façon de voir - je pense qu'il y a bcp à retenir. L'étude de cas, la confrontation des idées dans un respect mutuel fait partie des meilleurs moyens d'enrichir sa pratique.

J'ai l'impression que vous prenez les commentaires constructifs sur votre code ou les rappels à la théorie sous-jacente comme des critiques personnelles ou je ne sais quel manque de respect Ce n'est pas le cas.

Et pourtant vous réagissez à chaque fois soit avec agressivité ou sarcasme.

Voir qu'il y a plusieurs chemins menant à des codes fonctionnels, comprendre que deux solutions vraiment différentes peuvent répondre à un même besoin exprimé, évaluer les bienfaits de chacune des deux approches est quelque chose de positif.

Le commentaire sur la gestion du 'A' à 'F' par exemple (quelle que soit l'approche) a permis d'améliorer la fonctionnalité de votre simulateur.

Mon bout de code avec des opération d'arithmétique booléenne (les & et |) sur les ports montre comment arriver à mettre les pins rapidement en conformité plutôt qu'en passant par plusieurs digitalWrite() (que vous traitez dans le récepteur avec un petit delay() pour attendre la stabilisation - donc c'est fonctionnel comme je dis) mais permet de se rapprocher de la specification du système de @KdH76 qui fait tout en 1 cycle.

Votre code d'écoute du port série sans le break; après réception du marqueur de fin de ligne de commande fonctionnera dans 90% des cas - mais comme on l'a vu dans une autre discussion ne fonctionnait pas si le rythme d'arrivée des données est trop rapide... c'est bien de le comprendre...

La notion de passage par référence au lieu de créer des copies d'objets, c'est important pour la mémoire et la performance. c'est bien de savoir que ça existe...

bref l'objectif est de faire progresser chacun des lecteurs du forum qui se plonge un peu dans un fil de discussion, y compris moi même. Ne ramenez donc pas tout à votre personne.

Ma contribution ici est dans ce but - aider à faire progresser toute la communauté en apportant mon experience et mes idées, les confronter, développer des passions et peut-être pour les jeunes leur donner une ambition pour une future carrière dans l'ingénierie (on en manque tant en France). Et j'en retire bcp de l'expérience des autres aussi, bref "bien vieillir" en se challengeant les neurones..

@JML
J'approuve totalement la mise au point.
Personne n'a la vérité absolue, et personne ne peut se permettre de déclarer que sa solution est la meilleure.
Dans la vie réelle il n'y a que des cas particuliers qui sont gérés à partir de règles universelles.
C'est bien là toute la difficulté pour proposer LA solution qui SEMBLE la mieux adapté.

L'important est de comprendre ce que l'on fait et de ne pas se contenter de voir que cela fonctionne.

Je te renvoie la balle : moi qui suis une quiche en programmation je ne rate jamais de lire tes réponses et celles de quelques autres aussi :grin: ,même si parfois elles volent un peu haut pour moi.
J'ajoute que dans mon domaine de prédilection, l'électronique, à 72 ans passés je continue à apprendre des autres parce qu'on ne peut pas être universel.
C'est en admettant et en pratiquant ces règles simples que l'on progresse et pas autrement, toute autre attitude n'est que brassage d'air.

@68tjs

moi j’ai un passé de matheux et ingénieur en informatique ( un tout petit poil plus jeune que vous) - mais je suis un grand débutant amateur concernant l’électronique et je lis donc avec intérêt vos posts et explications.

Vos années d’experience dans la vraie vie, avec tous les soucis qu’on peut trouver, ça vaut son pesant de cacahuète (au moins) et ça me permet d’explorer de nouveaux territoires.

J'approuve totalement la mise au point.

+1

Bonsoir

bref l'objectif est de faire progresser chacun des lecteurs du forum qui se plonge un peu dans un fil de discussion, y compris moi même. Ne ramenez donc pas tout à votre personne.

Ma contribution ici est dans ce but - aider à faire progresser toute la communauté en apportant mon experience et mes idées, les confronter, développer des passions et peut-être pour les jeunes leur donner une ambition pour une future carrière dans l'ingénierie (on en manque tant en France). Et j'en retire bcp de l'expérience des autres aussi, bref "bien vieillir" en se challengeant les neurones..

A 70 ans, autodidacte a 95% pour les questions traitées sur ce forum, je signe des deux mains !
J'ai progressé avec les développements, compléments, précisions, des uns et des autres qui permettent de dépasser 'l'a peu près', 'à peu près' qui se révèle en général décevant sur le terrain.

ça ca tourner à la conversation pour le bar :slight_smile:

bonne soirée à tous

68tjs:
@JML
J'approuve totalement la mise au point.

+1 itoo

Bonsoir à tous

On apprend tout les jours, quelque soit l'age.

je pense qu'il y à des programmes plus facile à comprendre selon qu'on soit novice, intermediaire ou expert.

aujourd'hui je préfere un programme plus long avec plus d'étape et de commantaire plus mieux comprendre.

Nous l'améliorerons, ensemble au fur et à mesure que mes compétences monterons.

tout le monde apprend de tout le monde.

il y plein de façon de faire les choses, les règles de bases restent les mêmes.

Cordialement,

KDH

KdH76:
On apprend tout les jours, quelque soit l'age.
je pense qu'il y à des programmes plus facile à comprendre selon qu'on soit novice, intermediaire ou expert.
aujourd'hui je préfere un programme plus long avec plus d'étape et de commantaire plus mieux comprendre.

Oui vous avez 2 codes au moins pour explorer - ça devrait vous permettre d'en faire un troisième à votre sauce!

bonsoir

je suis désolé d'insister mais je ne comprends toujours pas :

if ((pindVal == sequValeurs[sequEnCours]) && !sequAtteinte) // On met le masque sequValeurs[n] sur la valeur lue pour comparer

plus exactement sequValeurs[sequEnCours]

Cordialement,

KDH

sequValeurs[sequEnCours]va chercher dans le tableau sequValeurs l'entrée numéro sequEnCours

donc on compare si ce que l'on voit sur les pins (après masquage) correspond à l'entrée courante attendue.

je laisse JP commenter sur le && !sequAtteinte