Imprimante thermique qui imprime en boucle

Bonjour communauté de l’Arduino

Je suis encore novice dans le domaine, et ai suivi de nombreux tutoriels pour m’aider: en vain. Je viens donc ici en espérant déranger personne! Pardonnez si il y a quelques anglicismes et termes inadéquats, je me suis jusque là basée sur de la documentation en anglais.

Pour mon projet, j’aimerais tout simplement appuyer sur un bouton et que mon imprimante thermique imprime un petit ticket disant “test”.

Seulement, dès que j’appuie sur le bouton, l’imprimante se met juste à imprimer en boucle (normal, le texte à imprimer est dans le void loop). J’ignore comment demander à la machine de n’imprimer qu’une fois.

J’ai essayé d’utiliser la boucle while, en vain.

Un autre problème moins grave est que mon imprimante imprime “P#” à chaque void setup dans le coin supérieur gauche du ticket.

Matériel _
Arduino Uno
Bouton
Imprimante thermique (Adafruit)
Résistances, planche de circuit etc.

Voici le code. Je sais que mon utilisation du while est complètement fausse…

#include <SoftwareSerial.h>
#include <Thermal.h>

const int buttonPin1 = 5;
const int ledPin =  13;

int printer_RX_Pin = 2;
int printer_TX_Pin = 3; 
int buttonState = 0; 

Thermal printer(printer_RX_Pin, printer_TX_Pin, 19200);

void setup(){
    // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin1, INPUT);
  Serial.begin(9600); 
   
  printer.feed(); //advance one line
  printer.feed(); //advance one line
  
}

void loop(){
   buttonState = digitalRead(buttonPin1);
   if (buttonState == HIGH) {
  
   printer.setSize('S'); 
   printer.println("test"); 
   
    printer.feed(10); 

  do { } while (1>0);

  } else {
    do { } while (1>0);
 
  }
  
  }

La loop fonctionne en boucle en permanence. Si tu veux faire une tâche une seule fois, et rien d'autre, il s suffit de tout mettre dans le setup.

Si c'est un peu plus compliqué, une tâche à faire une seule fois au milieu d'autres en boucle, il faut utiliser un drapeau, c'est à dire une variable booléenne que tu initialises à false dans le setup et que tu passes à true lorsque tu as exécuté cette tâche.

Au moment du lancement de l'exécution de cette tâche, il faut tester si ton drapeau est à false, si oui tu exécutes et tu passes à true.

Bonjour

poupoune:
Seulement, dès que j'appuie sur le bouton, l'imprimante se met juste à imprimer en boucle (normal, le texte à imprimer est dans le void loop).

J'ai essayé d'utiliser la boucle while, en vain.

Ce qu'écrit lesept est fort :slight_smile: juste , mais :
La boucle do { } while (1 > 0); aurait elle été optimisée?
j'ai essayé en simulant un bouton toujours appuyé (buttonState = HIGH; ) et en remplaçant printer par Serial et le println ne s'effectue qu'une seule fois.

Bizarre ???

Cordialement,
bidouilleelec

Bonjour,

Il faut que tu testes le l'enfoncement de ton bouton c'est à dire le changement d'état et l'appui du bouton sinon ça va imprimer tant que tu appuieras sur le bouton.
Les do while que tu as mis pour essayer de résoudre le problème vont bloquer complètement ton programme.

Bonjour kamill

kamill:
Les do while que tu as mis pour essayer de résoudre le problème vont bloquer complètement ton programme.

ll me semble lire que poupoune écrit que cela ne bloque rien du tout?

Cordialement,
bidouilleelec

bidouilleelec:
ll me semble lire que poupoune écrit que cela ne bloque rien du tout?

Bonjour bidouilleelec,

Ca m'étonnerait fort. Avec le code fourni le programme est complètement bloqué qu'on appuie ou pas sur le bouton.
Notre ami poupoune nous a fourni un des codes non fonctionnels qu'il a réalisé au cours de ses essais.

Merci beaucoup pour votre temps, votre aide et vos suggestions!

lesept:
La loop fonctionne en boucle en permanence. Si tu veux faire une tâche une seule fois, et rien d'autre, il s suffit de tout mettre dans le setup.

Il s'avère en fait que j'essaie de programmer le comportement de l'imprimante pour qu'elle n'imprime que quand j'appuie sur un bouton, et non juste au démarrage.

lesept:
Si c'est un peu plus compliqué, une tâche à faire une seule fois au milieu d'autres en boucle, il faut utiliser un drapeau, c'est à dire une variable booléenne que tu initialises à false dans le setup et que tu passes à true lorsque tu as exécuté cette tâche.

Au moment du lancement de l'exécution de cette tâche, il faut tester si ton drapeau est à false, si oui tu exécutes et tu passes à true.

Merci pour ce conseil! Je crois comprendre (et me permets de reformuler pour m'assurer que c'est le cas): il faut que j'initialise un état dans le setup (ex. le bouton n'est pas enfoncé) qui change dans la loop (ex. le bouton est enfoncé) ce qui exécute la tâche que je veux (ex. l'imprimante imprime une seule fois)?

kamill:
Bonjour,

Il faut que tu testes le l'enfoncement de ton bouton c'est à dire le changement d'état et l'appui du bouton sinon ça va imprimer tant que tu appuieras sur le bouton.
Les do while que tu as mis pour essayer de résoudre le problème vont bloquer complètement ton programme.

Oui, effectivement ce code ne marche pas: c'était pour essayer de corriger mon problème et ça a tout bloqué à la place. Sinon, juste avant, l'imprimante n'imprimait pas seulement quand j'appuyais sur le bouton, mais en continu sans s'arrêter du tout.

Je crois comprendre (et me permets de reformuler pour m’assurer que c’est le cas): il faut que j’initialise un état dans le setup (ex. le bouton n’est pas enfoncé) qui change dans la loop (ex. le bouton est enfoncé) ce qui exécute la tâche que je veux (ex. l’imprimante imprime une seule fois)?

C’est pratiquement ça : dans la loop, l’état change lorsque le bouton est enfoncé. Lorsque la tâche est exécutée, tu remets l’état à false et tu attends le prochain appui sur le bouton

Comme je te l'ai dit il faut que tu testes l'enfoncement du bouton.
Pour faire ça il faut mémoriser l'état précédent du bouton

lire etat bouton
Si etat different de etatPrecedent
etatPrecedent=etat
Si etat est appuyé
Impression
finSi
finSi