Bonjour,
Je comprends pas exactement ton "architecture", pour résumer tu souhaites diriger ton robot à distance en utilisant un lien "internet", c'est bien ça?
Si ma compréhension est bonne, je suis etonné que tu fasses un server.accept() a chaque tour de boucle, si je comprends bien la doc succinct de cette fonction, ça ouvre une connexion depuis ton serveur.
Il suffit de l'ouvrir une fois et après d'attendfre des commandes (à voir si ya du time-out) et avoir une commande de déconnexion. Quand tu n'as pas de client tu attends alors une connexion mais dès que tu es connecté tu n'ouvre plus de nouvelle connexion, juste tu processes les commandes.
La ça me semble être une implémentation style "serveur web" qui balance la page qui va bien à un client, dans ton cas tu n'as pas besoin de gérer plusieurs clients en même temps, mais un client et des commandes pour ce même client (on peut donc garder la connexion ouverte).
Moi j'essayaierais de mettre en place un algo du style:
1. tant que pas de connexion, j'attends une connexion
2. tant que pas de commande j'attends une commande
3. procésser la commande recu
4. retour au 2 (ou 1 si commande de déconnexion)
C'est un algo vu de très haut et très simpliste, mais au moins ça te permet d'avoir des "sessions" qui évite de refaire des connexions en permanence, l'établissement d'une connexion reste couteux donc autant les éviter le plus possible.
Bien sur ce que je dis là s'applique si le server.accept() ouvre une nouvelle connexion à chaque passage, si en cas de connexion déjà ouverte ça ne réouvre pas c'est caduque.
Après pour continuer à optimiser un peu, il faudrait aussi travailler sur protocole en lui même, l'envoie de string de commande "human readable" est certes pratiques pour le debug ou autre mais vraiment pas optimal, tu as un set d'une dizaine de commande, autant envoyer juste un octet (par exemple 00h pour stop, 01h pour forward etc.) qui sera plus facile a "comprendre" pour ton pogramme. Il faudrait tester pour voir mais le readString est surement couteux, la comparaison sur les strings aussi.
Dans l'absolu pour gagner le plus en temps il faudrait fonctionner avec des pointeurs sur tes fonctions "stop", "forward", etc., ça permet d'éviter de tester les valeur, en gros tu stockes un pointeur de chaque fonction dans un tableau, et quand tu recois ton octet, tu vérifies qu'il est dans le bon range (pas négatif et pas plus grand que ton tableau) et tu execute directement la fonction à l'index de ton tableau.
A voir si c'est possible en arduino mais il me smble que oui.
par exemple: (ça doit fonctionner mais n'ayant pas d'arduino sous la main j'ai pas testé)
//tu créés un type "pointeur sur fonction"
typedef void (*FunctionPointer) ();
//tu créés ton tableau de pointeur de fonctions
FunctionPointer commandes[2] = {stop,avance, recule};
//les méthodes sur lequel on pointe
void avance() {
myStepper1->setDirection(LOW);
myStepper2->setDirection(LOW);
myStepper1->start();
myStepper2->start();
}
void recule() {
myStepper1->setDirection(HIGH);
myStepper2->setDirection(HIGH);
myStepper1->start();
myStepper2->start();
}
void stop() {
myStepper1->stop();
myStepper2->stop();
}
void loop() {
//[...] metre en place ce que tu veux, la connexion etc.
// On rçoit la commande
icom = client.read();
//on check le range, je considère que c'est signé, on doit pouvoir optimiser
if (icom > 0 && icom < 2) {
//on traite la commande
commandes[icom]();
}
// [...] tu finis le traitement
}
Dans le cas d'un protocole du genre, ca te permet d'aller très vite sans faire de comparaison, ça amèliore donc forcément la latence, ca te gagne aussi un temps d'exécution a peu prêt constant que tu utilises la premier ou la derniere commande
Si on prend ton algorithme pour le moment tu as peu de fonctionnalités mais si tu arrives a mettons 100 fonctions différentes et que la comparaison prend ne serait ce que 10ms (j'espere que c'est moins sur l'arduino ), tu auras un décalage d'une seconde entre effectuer la 1ere ou la derniere commande.
En gros façon, si tu veux réduire la latence, il faut faire le strict minimum en utilisant le plus de fonctions très simples voir directement des décalages, pointeurs de fonctions etc pour gagner en temps de traitement.
Bon courage pour la suite