qui peut me renseigner sur la façon dont l'Ardruino "lit" son prg?

Bonjour.
voila mon soucis.

je viens du visual basic (3) ou l'on peut presque tout se permettre (et prendre de très mauvaises habitudes).
j'ai un petit prog qui tourne. je l'ai adapté en grande majorité avec du copié/collé de tutos.

mon prog est composé:

  • D'une routine wattmètre qui lit ma production solaire a l'aide de pinces (openenergymonitor.org/)
  • D'une autre du même tonneau qui lit ma consommation électrique.
  • D'une autre qui relève la téléinfo EDF.
  • Et de l'exemple webserveur de l'atelier ardruino affin d'afficher tout cela sur ma tablette.

chaque routine fonctionnent parfaitement..... mais quand tout est lancé ça ne fonctionne plus correctement.
Pouvez vous me dire si l'Ardruino déroule son programme en suivant une par une ses lignes de code, ou bien si il travaille différament ?

explications de ce qui ne va pas:

exemple 1) tout fonctionne parfaitement:
routine solaire
routine consommation
routine serveur

exemple 2) tout fonctionne parfaitement:
routine téléinfo EDF
routine serveur

exemple 3) plus d'affichage web!!
routine solaire
routine consommation
routine téléinfo EDF
routine serveur

j'ai fait des prints, mais je ne comprend pas j'ai ( j'ai un niveau très bas en prog: je copie et colle)
Autant les cas 1 et 2 sont extrement stable
autant le cas 3 est instable le serveur ne fonctionne qu'aléatoirement!

J'utilise pour le relevé téléinformation EDF la librairie pour créer un port série virtuel, j'ai vue sur le net que cette librairie consommait énormément de ressources, mais bon je me dit au pire cela devrait mettre du temsp a remplir mes variables!!

je n'ai pas d'avertissement du compilateur, je ne suis pas limite en mémoire

mon prog est grosso modo structuré comme cela:

dans le loop:
solaire()
conso()
teleinfo()
web()

après le loop

void solaire()
{
routine
}

void conso()
{
routine
}

void teleinfo()
{
routine
}

J'aurais peut etre du commencer comme tout le monde: par le commencement :confused:

alaindepicardie:
J'aurais peut etre du commencer comme tout le monde: par le commencement :confused:

oui ou alors postez tout le code pour qu'on regarde...ça sent le problème mémoire effectivement mais ça peut être autre chose, peut-être la ligne 42...

:slight_smile:

Sinon faire un petit cours en C pour commencer à vous éloigner du basic c’est pas une mauvaise idée...

bonsoir, bonne nuit.
je jette un petit coup d'œil avant de me coucher... au cas ou!
et j'ai déjà des réponses... Merci

Comme on peut le constater, ça fait vraiment n'importe quoi.

La raison en est qu'il y a des interactions entre les bouts de programme rajoutés, parce que leurs durées d'exécutions s'ajoutent au lieu de fusionner (si un bout de programme attend, il bloque les autres), et parce qu'en règle générale ils ne peuvent pas partager d'eux-mêmes la même ressource en bonne intelligence.

humm! je suis mal!!!

quelle solution voyez vous?

j'avais vue quelque part la machine a état, serait ce une solution?
en fait comme ça de ma petite porte j'espérais obtenir ce fonctionnement:

  • tu exécute le solaire, tu range gentiment les résultats dans un coin
  • puis, tu exécute la conso et tu fait pareil... ainsi de suite.
  • Enfin tu prend tout les résultat que tu as mis dans ton coin et tu exécute le web.

La effectivement quand c'est tres chargé certaines routine ne se terminent pas!

@ pour poster le code, il faut que je le nettoie (et ce n'est rien de le dire), et franchement vue le niveau ici je n'ose pas trop :frowning:
Merci

ps

je pensais qu'en appelant une fonction, le programme ne s'occupait que de cette fonction, puis une fois terminé retournait a la ligne suivante du loop et ainsi de suite comme en basic

Haaaa! ou il est le debug du basic ou l'on voit se colorer les lignes en fonction de l'exécution. C'est tres facile ainsi de suivre le déroulement du prg et de voir ou il passe et si il saute une étape
Il y a pas d'outils pour le langage ardruino?

je pensais qu'en appelant une fonction, le programme ne s'occupait que de cette fonction, puis une fois terminé retournait a la ligne suivante du loop et ainsi de suite comme en basic

Salut

C'est exactement pareil. Aucune exécution en parallèle.
Et quand la loop se termine, elle est exécutée à nouveau, en boucle.

Haaaa! ou il est le debug du basic ou l'on voit se colorer les lignes en fonction de l'exécution. C'est tres facile ainsi de suivre le déroulement du prg et de voir ou il passe et si il saute une étape

Rien ne t'empêche d'écrire sur la console avec des Serial.println() pour visualiser ce qui se passe.

Tu devrais parler des ressources matérielles, comment tout ceci est branché.

Sur quelle carte travailles-tu ?

@+

Haaaa! ou il est le debug du basic ou l'on voit se colorer les lignes en fonction de l'exécution. C'est tres facile ainsi de suivre le déroulement du prg et de voir ou il passe et si il saute une étape
Il y a pas d'outils pour le langage ardruino?

Le « langage arduino » n’a rien de spécifique réellement à arduino, vous codez en C++ qui a une norme internationale. la différence avec votre basic c’est que le programme que vous exécutez n’est pas « interprété » localement mais passe par une phase de compilation où toutes vos jolies lignes sont transformées en ordres de bas niveau (langage machine) pour le micro-processeur cible et téléchargé sur une plateforme distante - là où il s’executera; Pour débuguer suivant la plateforme distante il existe des outils qui permettent d’instrumenter la carte (on attache un débogueur sur le PC/Mac au processus qui s’execute sur l’Arduino) et suivre ce qu’il s’y passe, mais c’est plus compliqué que de faire un truc localement - et ce n’est dispo que sur des cartes un peu plus avancées que les UNO/MEGA. il existe aussi des simulateurs de cartes, mais c’est jamais le « vrai environnement »

bonjour
merci pour toutes ces réponses et éclaircissements.
Je vais essayer de mettre un peu d'ordre ce soir et je posterais "mon" code ( je rappelle issue de multiples tuto donc du copier/coller.
mais.....
il restera extrêmement mal écrit, je débute et je teste. Je suis en plus partit sur un programme utile pour moi, sans avoir pris le temps de commencer par allumer une led.
J'ai commencé en basic avec le comodore 64 dans les années 80. a chaque fois que j'avais besoin de quelque chose je me gribouillais un truc en VB (dont je me suis arrêté a la version 6.)
Je pensais m'adapter facilement, mais lorsque l'on gribouille un truc tous les trois/quatre ans cela ne donne que peu d'expérience. Et la! le langage est beaucoup plus stricte qu'en VB.

Tu devrais parler des ressources matérielles, comment tout ceci est branché.

Sur quelle carte travailles-tu ?

  • la carte un uno avec empilé une carte Ethernet.

pour les mesures solaire/consommation une petite carte perso couplé a des pinces SCT-013 basé sur cette idée:PV routeur low cost DIY - Le solaire à la portée de tous

j'ai réalisé ce routeur décrit ci dessus, dont j'exploite une partie des routines pour mon wattmètre, bien que j'ai considérablement modifié les routines en ajoutant un LCD, des menus, et différente fonctions: calculs des puissances instantanés, calcul de la puissance dérivée gestion des maxi et mini ça ne s'emmelle pas les pieds comme ce que je fait actuellement!
quand a la teleinfo EDF le net grouille de ressources, donc petite carte perso et routines trouvée sur le net

Je pense que tout mes soucis viennent d'une méconnaissance totale du langage et d'une mauvaise façon de structurer le programme.
car c'est tout petit, seul la librairie SerialSoftware est lourde
Merci

on a tous commencé quelque part - donc pas de soucis même si le code est un peu spaghetti :slight_smile:

bonjour
bon je crois avoir compris (en fait je n'avait pas du tout, du tout compris) !
Je vais donc commencer par le début. J'ai trouvé ici de magnifique livret (Nulentout et Bricolo) que je remercie

  • Ma grosse erreur c'est peut être d'approcher les 80 ans, mais surtout d'avoir raisonné comme en basic de mon époque ou l'on numérotait les lignes et ou le "prog se déroulait" suivant ces numéros de lignes ou était amené ou l'on voulait a l'aide de GOTO, GOSUB et RETURN!
    Toute une époque.
    Désolé d'avoir abusé de votre temps
    :wink:

Pas de soucis - continuez à vous agiter les neurones c’est bon pour la santé !
Travaillez un peu les bases du langage avec un open classroom sur le langage C (juste le début du cours, pas la partie graphique) et peut être un peu les bases du C++ puis regardez les tutos d’estimon

Bonjour Alain

alaindepicardie:
bonjour
bon je crois avoir compris (en fait je n'avait pas du tout, du tout compris) !
Je vais donc commencer par le début. J'ai trouvé ici de magnifique livret (Nulentout et Bricolo) que je remercie

  • Ma grosse erreur c'est peut être d'approcher les 80 ans, mais surtout d'avoir raisonné comme en basic de mon époque ou l'on numérotait les lignes et ou le "prog se déroulait" suivant ces numéros de lignes ou était amené ou l'on voulait a l'aide de GOTO, GOSUB et RETURN!
    Toute une époque.
    Désolé d'avoir abusé de votre temps
    :wink:

Mais vous pouvez programmer quasiment comme en BASIC "propre" (structuré) .
La grosse différence est que l'IDE Arduino met à votre disposition les fonctions setup() et loop().
Le mieux est d'expérimenter avec les exemples fournis.
Sachez qu'il existe des simulateurs d'Arduino.
N'hésitez pas à poster vos codes.

Cordialement,
bidouileelec

En fait l'IDE Arduino est l'IDE Wiring modifiée, qui elle même est issu de Processing.

Processing est une IDE qui n'exige que l'écriture "à minima" de deux fonctions :
setup() qui ne s'exécute qu'une seule fois
loop() qui tourne en boucle dans une boucle dont il est impossible de sortir --> sitôt sorti de loop() le programme y ré-entre.

Avant de lancer la compilation Processing créé un vrai fichier C/C++ autour de ces fonctions et de celles que tu ajoute.
Le fichier réellement transmis au compilateur est en tout point conforme à ce que tu peux trouver dans les cours et tutos.

On y trouve quelque chose comme cela pour la fonction main:

void main() [
   init();
   setup();
   while(1)[
       loop();
   ]
]

Le point intéressant est la fonction init() qui est ajoutée. Cette fonction configure le micro "à la mode Arduino".
Elle est nécessaire pour assurer la cohérence dans les fonctions et classes fournies par Arduino pour gérer le micro-contrôleur.

J'ajoute que la programmation sur microcontrôleur est différente de celle sur un PC qui a un système d'exploitation.

Dans un microcontrôleur les ressources sont limitées et s'il n'y avait de boucle infinie une fois arrivé en extrémité de mémoire le microcontrôleur s'arreterait. La seule façon de le relancer serait de faire un reset.
Sur un PC la problématique est la même mais ce rôle est dévolu au système d'exploitation et c'est donc transparent pour l'utilisateur..

bonsoir
Merci pour vos commentaires constructif.

De mon coté j'espère avoir réveillé chez certain de magnifiques souvenir!

.....qui évite notamment qu'on doive parfois re-numéroter tout le programme quand on doit y insérer des instructions

Mais ici, ce qui est en cause, ce n'est pas le langage ni même les différentes façons de les utiliser pour programmer.
Ce qui pose problème, ce sont les conséquences de la réunion de plusieurs programmes, qui doivent partager le même temps d'exécution et les mêmes ressources matérielles (i.e. le micro-contrôleur et ses interfaces), alors qu'à la base on les a conçus pour les utiliser individuellement et sans partage.
Ces programmes pourraient être écrits en BASIC et de façon non-structurée (ce qui est d'ailleurs tout-à-fait envisageable), le problème évoqué serait toujours présent.

holà! c'est rien de le dire!
j'avais ces routines qui tournaient depuis un bon bout de temps, et stable je les ais réunit sans réfléchir, c'était impossible de fonctionner d'autant que par exemple certaines attendaient patiement l'arrivée de certains caractères sur le port série.
Quand j'ai compris.... je n'ai jamais ete aussi vite a enlever le "code" en pièce jointe.
Le ridicule ne tue pas...... mais quand même :wink: