Je ne peux pas tester mon programme

Bonjour à tous ! D'abord merci d'avoir prêté attention à ce message ! Voici mon problème, j'ai un programme Arduino que je ne peux pas tester car je n'ai pas le matériel adéquat. En effet, je fais ce programme dans le cadre d'un projet de terminale, et le matériel est donc en permanence dans l'établissement. Or, les vacances étant là, je ne peux pas le tester et j'aimerais vraiment avancer cette partie. Est-ce que quelqu'un pourrait m'aider ? Quelqu'un qui pourrait vérifier la validité de mon code, autre que le compilateur, car si celui-ci me donne les erreurs de syntaxe, il n'aide pas concernant la simulation du programme. Merci beaucoup !

Je proposerai bien d'investir dans une carte, mais si elle interagit avec des éléments extérieurs c'est délicat... Il existe visiblement des émulateurs de cartes, je ne sais pas ce qu'on peut en faire puisque je ne les ai jamais testé. Le problème reste le même, je pense: comment émuler les capteurs et actionneurs reliés à la carte? Peut-être que certains émulateurs permettent de simuler également des entrées/sorties?

Autrement, il te reste la solution que tu appliques déjà: écrire, compiler, et faire le plus possible sans avoir le montage sous les yeux, en essayant d'anticiper les problèmes pour n'avoir que des menues corrections à appliquer lorsque tu sera en mesure de le tester réellement!

il y a un simulateur en ligne ici

Je compte effectivement en acheter une, toutefois j'aurais là encore besoin de vos conseils avisés !! Mais cela dépendra de l'argent que je reçois, j'ai aussi beaucoup (trop) d'autres projets !

rjnc38: il y a un simulateur en ligne ici

Merci ! Mais pourrais-tu m'indiquer comment l'utiliser ?

Bonjour et bienvenue,

Peux tu nous donner plus d'informations sur ton projet, le cahier des charges, la carte et les capteurs ?

Et tu peux mettre ton code en utilisant les balises dans ton message.

Amicalement,

J-F

Déjà un grand merci à vous de bien vouloir m'aider, c'est super ! :) Ensuite, voici mon code :

/*La fonction de ce programme est d'afficher les minutes qui passent sur la première ligne d'un LCD "Adafruit"
 *Et les secondes sur la deuxième ligne
 */


//Initialisation des variables
//INSERER LES BIBLIOTHEQUES ADAFRUIT                                        //Insertion des bibliothèques de l'afficheur LCD "Adafruit"

float Passage = 0;                                                          //Déclaration d'une variable "Passage" en float, utilisée pour tronquer les chiffres
int Min = 0;                                                                //Déclaration des variables utilisées pour l'incrémentation
int Sec = 0;
int DizMin = 0;                                                             //Déclaration des variables utilisées pour l'affichage
int DizSec = 0;
int UnitMin = 0;
int UnitSec = 0;


void setup()                                                                //Initialisation du programme
{                                                 
  /*lcd.begin(16,2);                                                        //Initialisation du LCD
   *lcd.setCursor(3,0);                                                     //Initialisation de l'affichage
   *lcd.print("Minutes");
   *lcd.setCursor(3,1);
   *lcd.print("Secondes");
   */
}

void loop()                                                                 //Boucle
{
  Passage = Min/10;                                                         //On attribue la valeur de (int)Min/10 à la variable (float)Passage
  DizMin = Passage;                                                         //On attribue la valeur de (float)Passage à la variable (int)DizMin
  UnitMin = Min-(10*DizMin);                                                //On attribue la valeur de (int)Min-(10*(int)DizMin) à la variable (int)UnitMin
  Passage = Sec/10;                                                         //On attribue la valeur de (int)Sec/10 à la variable (float)Passage
  DizSec = Passage;                                                         //On attribue la valeur de (float)Passage à la variable (int)DizSec
  UnitSec = Sec-(10*DizSec);                                                //On attribue la valeur de (int)Sec-(10*(int)DizSec) à la variable (int)UnitSec
/*lcd.setCursor(0,0);                                                     //Affichage des variables sur l'écran LCD
 *lcd.print(DizMin);
 *lcd.setCursor(1,0);
 *lcd.print(UnitMin);
 *lcd.setCursor(0,1);
 *lcd.print(DizSec);
 *lcd.setCursor(1,1);
 *lcd.print(UnitSec);
 */
  delay(1000);                                                              //Délai d'une seconde
  Sec = Sec+1;                                                              //Incrémentation de la variable Sec (secondes)
  if(Sec==59)                                                               //Test si la variable Sec est égale à 59
  {
    if(Min=!59)                                                               //Test si la variable Min (minutes) est différent de 59
    {
      Min = Min+1;                                                              //Alors incrémentation de la variable Min (minutes)
      Sec = 0;                                                                  //Et remise à 0 de la variable Sec (secondes)
    }
    else                                                                      //Sinon (Si la variable Min (minutes) est égaleà 59)
    {
      Min = 0;                                                                  //Alors remise à 0 de la variable Min (minutes)
      Sec = 0;                                                                  //Et remise à 0 de la variable Sec (secondes)
    }
  }
}

Pour ce qui est des bibliothèques Adafruit, je ne me souviens plus de la syntaxe, j'attendais d'être au lycée pour les réinsérer, c'est pour ça que toutes les fonctions d'affichage sont sous forme de commentaires, pour permettre au compilateur de ne pas péter un câble ! Ce devrait être un sous-programme qui tourne en permanence dans la carte, indépendamment des actions externes sur les capteurs. Le projet global est d'avoir une montre en braille, mais pour ça il nous faut déjà un programme d'heure ! Cette heure sera normalement réglable (donc pas vraiment indépendante, mais pour l'instant c'est juste le programme de test, pour voir si les variables réagissent comme il faut !). De plus, je suis obligé de séparer les dizaines des unités, car notre prototype, que l'on doit montrer à la fin de l'année, doit afficher les unités des minutes et les dizaines des secondes. On est donc obligé d'avoir "3" programmes distincts : 1 de test pour vérifier la réaction des variables, 1 pour le prototype avec les unités des minutes et enfin 1 "final" dans l'optique d'une simulation de commercialisation du produit idéal. Ce dernier programme est uniquement ici dans une optique d'étude, pour des raisons matérielles : un arduino au poignet alimenté par un ordi n'est pas des plus léger !

Bonsoir Peleggreg,

Pour la bibliothèque il suffit de faire une petite recherche sur internet :slight_smile:

Tu peux utiliser ce genre de code avant le setup :

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Amicalement,

J-F

Sinon il y a une erreur dans ton code au niveau des tests if...

Je te laisse chercher.

Amicalement,

J-F

JFF76: Sinon il y a une erreur dans ton code au niveau des tests if...

Je te laisse chercher.

Amicalement,

J-F

Pour ma part j'en ai même vu deux. Enfin, il y a une erreur de syntaxe, qui en principe empêchera la compilation, et une erreur de logique qui elle empêchera juste l'ensemble de fonctionner comme je suppose que l'on attend qu'il fonctionne.

Cela étant dit, il faut éviter d'utiliser les delay() dans le code, parce que ce sont des fonctions bloquantes: quand tu utilises cette fonction, le programme entre dans une boucle qui ne fait rien, en attendant que le délai spécifié soit écoulé. puisqu'il s'agit ici de mesurer le temps, il est important de changer cette manière de fonctionner. En effet, si par exemple les deux autres "programmes", pour reprendre ton terme, font leur travail en 10ms, chacune de tes "seconde" durera donc 1s (le temps du delay() ) + 10ms. Fais le calcul, au bout d' 1h40 tu auras une seconde de retard.

Pour palier à cet inconvénient, il convient de mesurer le temps écoulé à chaque boucle, grâce à la fonction millis(). Utilise une variable dans laquelle tu stocke la valeur instantanée retournée par millis() lorsque tu mets à jour ta seconde, puis à chaque début de boucle tu soustrait cette valeur à une nouvelle lecture de millis(). Lorsque la différence est d'une seconde, tu mets à jour ta seconde, et tes minutes, et tes heures, avec la fonction que tu as posté plus haut.

Il y a encore moyen de faire beaucoup mieux et précis, mais pour l'instant il serait dommage de tout embrouiller! ;)

+1 avec Troisiemetype en ce qui concerne l'utilisation de delay(), surtout qu'il s'agit d'un sous programme et en ce qui concerne millis() :

Cette variable reviens à zéro environ tous les 50 jours quand millis() est égal à : 4 294 967 295 (2exposant32 -1) car millis() est une variable de type unsigned long (non signé).

Bon courage !

Amicalement,

J-F