Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - bobyAndCo

Pages: 1 ... 25 26 [27] 28 29 ... 58
391
Ce n’est pas indispensable mais ce serait souhaitable de mettre en place une petite messagerie « binaire ». Ce serait plus élégant et un peu plus efficient.

Du type :

-   codage du module sur 4 bits par exemple (ce qui autorise 16 modules)
-   type (Relais, Alimentation via L298, Signal, Moteur d'aiguillage, Eclairage de bâtiment ou de rue) sur 3 ou 4 bits
-   le numéro doit pouvoir être codé sur 4 bits (possible jusqu’à 7 bits)
-   l’état se code sur 1 bit (0 ou 1)

Au total 13 bits qui pourront être porté à 16 bits (si j’ai vu juste à certains endroits) puisque de toutes les façons il faudra 2 octets de données.

Pour la lecture du message, ce ne sera pas bien différent de ce qui existe actuellement, il faudra juste ajouter une lecture des bits à l’intérieur des 2 octets envoyés.

C’est codé en quel langage côté smartphone ? Ce serait bien d’envoyer ce code aussi !

392
Juste petite suggestion : Essaye d'envoyer des bits (7 donc) au lieu de 7 octes (8 fois plus lourds). D'où aussi mon erreur ci-dessus car ça me paraissait tellement évident que ça devait être de bits.

393
En réalité, je pense que ce n'est pas 4R0001R ou 4R0001T par exemple.

Et d'ailleurs je dis une connerie car ce ne sont pas des bits mais des octets

Quand tu fais Serial.print(commande_recue[i]); et que tu as :

4⸮⸮⸮⸮⸮⸮
R⸮⸮⸮⸮⸮⸮
0⸮⸮⸮⸮⸮⸮
0⸮⸮⸮⸮⸮⸮
0⸮⸮⸮⸮⸮⸮
1⸮⸮⸮⸮⸮⸮
R⸮⸮⸮⸮⸮⸮

On voit que 'R' est le premier octets utile suivi de 6 autres octets. Ce sont probablement des ascii < 33, des caractères invisibles que le Serial.print restitue avec des ?

Ce qui m'étonne c'est que l'on ne retrouve plus ici le ';' qui te servait de séparateur commande_recue = hc06.readStringUntil(';');
Ca vaut le coup de chercher à analyser la chaine d'envoi qui je pense a un problème (trop de caractères) mais sinon, il y a un moyen simple de s'en sortir par programmation (je n'ai pas dit élégant et peu couteux en ressources)

394
Il faudrait voir ta chaine envoyée par le smartphone. A priori, ta chaine est une suite de 7 bits répétée 7 fois (différentes bien sûr).
1° série de 7 bits on a '4' + 6 ?
2° série de 7 bits on a 'R' + 6 ?
etc...

alors que bien sur, les 7 bits devraient être à suivre. En fait j'ai bien l'impression que tu envoies 49 bits alors que 7 suffisent

395
Bon je n'ai pas testé car je n'ai pas le hard correspondant. Il y a peut-être une ou deux coquilles !

Concernant l'ESP32, le code réalisé avec l'IDE d'Arduino sera totalement compatible

396
Il y a plusieurs explications plausibles qui s’additionnent sans doute.

1° Le bluetooth n’est pas réputé pour sa vitesse. De plus ici paramétré à 9600 bauds !

2° Est que le HC6 utilise un Hardware Serial (TX1-RX1, TX2-RX2 ou TX3-RX3 du Mega)  ou SoftwareSerial ? Ca marchera plus vite en hardware serial.

3° Rationnalisez votre code, voir ci-dessous. J’avais fait un petit article sur l’utilisation des tableaux pour les codes répétitifs comme ici : https://www.locoduino.org/spip.php?article227

4° Le switch comportant de nombreux cas est consommateur de ressources. Il doit tester tous les cas jusqu’à celui qui est le bon. Si c’est dans les premières lignes, c’est bon, si par contre c’est vers la fin c’est plus long. Mais c’est toujours mieux que if, elseif qui lui teste tou les cas.

5° Evitez autant que possible les String au profit des char[] ou char*

6° Pourquoi ne pas utiliser un ESP32 qui tourne tout de même 12 x plus vite qu’un Mega et qui a le bluetooth intégré ?

Voilà quelques pistes et du code optimisé. Attention, le premier relais n’est plus le numéro un mais le numéro zéro !!!


const byte relais[] = { A7, A6, A5, A4, A3, A2, A1, A0, 22, 24, 26, 28, 30, 32, 34, 36 };

char commande_recue[7];
byte num_relais;

#define hc06 Serial1

void setup() {

  hc06.begin(9600);  // HC-06 module - Pins 18 (TX1) & 19 (RX1) on MEGA             // initialise le port série RX1 TX1 Bluetooth

  for (byte el : relais) {
    pinMode(el, OUTPUT);
    digitalWrite(el, HIGH);
  }
}

void loop() {

  if (hc06.available()) {
    for (byte i = 0; i < 7; i++)
      commande_recue[i] = hc06.read();

    if ((commande_recue[0] == '4') && (commande_recue[1] == 'R')) {
      num_relais = ((byte)commande_recue[4] - 48) * 10 + ((byte)commande_recue[5] - 48);
      digitalWrite(relais[num_relais], commande_recue[6] == 'R' ? 1 : 0);    // On envoie la commande
    }
  }
}

397
Infos et bonnes affaires / Re : ESP32 "bonne affaire"
« le: juin 05, 2021, 10:11:41 pm »
@Dominique -> Tu veux que je t'en envoie une ou deux par courrier ?

398
Infos et bonnes affaires / Re : ESP32 "bonne affaire"
« le: juin 05, 2021, 02:11:59 pm »
Les ESP32 sont vraiment de très bons produits pour le prix. Excusez du peu, 240 Mhz pour la plupart des modèles, 4Mo de mémoire flash dont on pourra allouer 1, 2 ou 3 Mo pour un vrai stockage de fichiers pour des applications ou un site internet propre à l’ESP32. PWM sur toutes les broches, WiFi, Bluetooth, 3 x UART, CAN (avec nécessité d’ajouter un MCP2562) et double cœur !!!

Et même si vous ne développez pas en utilisant les deux cœurs, de nombreuses librairies le font pour vous comme les librairies CAN par exemple.

Les broches supplémentaires disponibles sur la version 38 pins par rapport à la 30 ne sont que des broches dont l’utilisation est limitée en usage normal (comme le précise msport). La 30 pins offre donc des services similaires.

C’est donc vraiment une belle petite bête.

Pour ceux qui sont habitué à écrire en C/C++, il y a des possibilités d’écriture qui n’existe pas dans le langage Arduino comme le tout bête mais bien pratique printf : printf("Valeur lue : %d\n", val)

Pour les extensions, moi je me suis fabriqué ma propre petite carte avec un convertisseur 5V (le convertisseur de l'ESP n'est sollicité que pour passer de 5v à 3,3v) et un "vrai" MCP2562 pour le CAN.



GERBER en PJ pour ceux que ça peut intéresser

399
Serialport est un module NodeJs qui doit être importé !

https://www.npmjs.com/package/serialport

400
Vos projets / Re : projet centrale "LaBox" wifi DCC++ Can
« le: mai 20, 2021, 09:02:48 am »
Dans la suite d'échanges sur ce fil au sujet du MCP2562 implanté avec un ESP32 et aux recommandations de Jean-Luc,

https://forum.locoduino.org/index.php?topic=922.msg13002#msg13002

voici le montage que j'ai réalisé sur un PCB. Cela fonctionne parfaitement jusqu'à 1Mbs.

Sur la photo, il s'agit d'une petite carte "universelle" pour simplifier l'utilisation des ESP32 et en particulier la connexion CAN, mais cela vaut pour toutes autres utilisations.

Exit pour moi les CJMCU-230 SN65HVD230 foireuses !


401
Un article intéressant à ce sujet dans Loco Revue du mois de mai. Et surtout pour ceux qui pensent que l’on ne peut pas faire de stay alive en N vous serez surpris. Des idées intéressantes pour loger ces précieuses réserves d’énergie pour nos locomotives.

402
Trucs & astuces / Re : Re : ESP32/ESP8266 - vitesse d'exécution
« le: avril 24, 2021, 09:52:13 am »
Bonjour bobyAndCo,

Comme tu peux le voir dans mon code j'avais un peu essayé l'utilisation d'un tableau de clients, mais comme je l'ai dit dans un message précédent, tant que le client n'envoie pas de requête, client.available donne 0 et impossible d'extraire les adresses ip des clients connectés.
Est-ce normal ?

Note que la limitation de 4 clients est due à l'ESP8266.

Ton code est bon (avec quelques compléments comme je le montre plus haut). Mais il ne faut pas fermer la connection comme tu le fais ligne 171  wificlient[i].stop(); // close the connection

403
Trucs & astuces / Re : ESP32/ESP8266 - vitesse d'exécution
« le: avril 24, 2021, 09:39:48 am »
Sinon, je n'ai toujours pas eu le temps de charger le code mais je pense que la partie graphique en svg doit être sympa, j'ai hâte de voir. Dans cette attente, peux-tu envoyer des copies d'écrans ?

404
Trucs & astuces / Re : ESP32/ESP8266 - vitesse d'exécution
« le: avril 24, 2021, 09:34:44 am »
Je pense que tu confonds deux choses :

client[i] = server.available();
et

client[i].available()
Un client peut être connecté : client[i].connect(IP, Port) mais n'avoir envoyé aucune requête client[i].available() ce qui renvoie 0 pour false en booleen !




405
Trucs & astuces / Re : ESP32/ESP8266 - vitesse d'exécution
« le: avril 24, 2021, 08:07:09 am »
J’ai bien regardé l’application, il va être compliqué d’introduire l’utilisation des websockets car ça oblige à reprendre tous le code (en js et en C/C++) et il y a déjà eu beaucoup de travail de fait.

Si de plus le temps du rafraichissement périodique ne semble pas te poser de problème, il n’est pas nécessaire de changer ce point.

Par contre, pour le rafraichissement, ce qui peut être fait, qui est très simple avec le code actuel et qui pourra au moins réduire de moitié le temps de réponse des requêtes est effectivement de ne pas fermer les connexions.

Il faut déterminer le nombre de connections maxi que l’on souhaite ne pas dépasser, j’ai compris que c’était 4.

Soit un define (ma préference)
#define MAX_CLIENTS 4
Ou une constante

byte maxClients = 4 ;
Créer un tableau d’instance de WiFiClient

WiFiClient client[MAX_CLIENTS];


Et dans le loop, on créé une boucle et on vérifie que, si un client cherche à se connecter, si ce n’est pas déjà le client courant :

for (byte i = 0; i < MAX_CLIENTS; i++) {
    if (!client[i]) {
      client[i] = server.available();
    }

Si le client n’est pas déjà connecté :

vérifier si la connexion d’un client a déjà été faite ou pas :

else {
      if (!client[i].connect(IP, Port)) {
        ….;
      }

Et on incrémente une variable d’état : alreadyConnected[i]
Et

else if (!alreadyConnected[i]) {  // ce client n'est pas connecté
        ….
      }

On peut donc de cette manière accepter jusqu’à MAX_CLIENTS qui ne sont jamais fermés, et parfaitement identifiés.

Ensuite pour le client concerné, on vérifie s’il y a une requête :

if (client[i].available()) {
Ca ne nécessite que très peu de modifications du code actuel.

J’ai vu aussi qu’il y avait pas mal de String. C’est une classe couteuse en ressources et je chercherais à substituer des pointeurs de char * ou des tableaux de char[] ce qui revient (à peu près) au même.

Pages: 1 ... 25 26 [27] 28 29 ... 58