thermal printer + keypad matrix

Forum dédié aux produits Adafruit

thermal printer + keypad matrix

Message non lude Ayzak » Ven 6 Nov 2015 10:53

Bonjour,

Je voudrais réaliser une intéraction entre le keypad et l'imprimante thermique adafruit pour faire des facturation.
J'entre le prix sur le keypad, et lorsque j'appuie sur "#" pour imprimer le prix à l'endroit prévu dans la mise en page du ticket. J'aimerais également faire en sorte que l'appuie sur la touche "*" reset si jamais on se trompe en tapant le prix.

Le problème que je rencontre, c'est que la première impression est niquel seulement la deuxième a un "#" qui s'affiche avant le prix, et je n'arrive pas à comprendre pourquoi ....

Je pense qu'il faut que je précise que je débute en arduino, et que c'est mon premier projets arduino.

Voici mon code:

Code: Tout sélectionner
#include "Adafruit_Thermal.h"
#include "logo.h"
#include "adalogo.h"
#include "QrCode.h"
#include "Keypad.h"

// Here's the new syntax when using SoftwareSerial (e.g. Arduino Uno) ----
// If using hardware serial instead, comment out or remove these lines:

#include "SoftwareSerial.h"
#define TX_PIN 6 // Arduino transmit  YELLOW WIRE  labeled RX on printer
#define RX_PIN 5 // Arduino receive   GREEN WIRE   labeled TX on printer

SoftwareSerial mySerial(RX_PIN, TX_PIN); // Declare SoftwareSerial obj first
Adafruit_Thermal printer(&mySerial);     // Pass addr to printer constructor

/*Configuration du pavé numérique.*/
const byte ROWS = 4; //4 lignes.
const byte COLS = 3; //3 colonnes.

char keys[ROWS][COLS] = {
   {'1','2','3'},
   {'4','5','6'},
   {'7','8','9'},
   {'*','0','#'}
};

byte rowPins[ROWS] = {7, 8, 9, 10}; //Connexion entre la pin arduino et la ligne du clavier.
byte colPins[COLS] = {11, 12, 13}; //Connexion entre la pin arduino et les colonnes.

String prix = "";

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); //keymap"Keypad.h"

void setup() {
  pinMode(2,INPUT);
  Serial.begin(9600); //initialisation de la vitesse de transfert de données entre arduino et port série du PC
  keypad.addEventListener(keypadEvent); // Add an event listener for this keypad

}

void loop(){
  char key = keypad.getKey(); //Récupération de ce qui est saisi sur le pavé numérique.
   
   if(key){ //Si il y a saisi
     prix += key ;
   }
}

void keypadEvent (KeypadEvent key)
{
  switch (keypad.getState())
  {
    case PRESSED :
      if (key == '#'){
          printInno(prix);
         
      }
    break;

    case PRESSED :
      if(key == "*"){
        prix = "";
      }
  }
}

void printTest(String var){
 
  // NOTE: SOME PRINTERS NEED 9600 BAUD but here is 19200.
  mySerial.begin(19200);  // Initialize SoftwareSerial
  //Serial1.begin(19200); // Use this instead if using hardware serial
  printer.begin();        // Init printer (same regardless of serial type)
 
  /*Innofab*/
  printer.justify('C');
  printer.inverseOn();
  printer.println(var);
  printer.inverseOff();
 
  printer.feed(2);
 
  printer.sleep();      // Tell printer to sleep
}

void printInno(String var){
  // NOTE: SOME PRINTERS NEED 9600 BAUD but here is 19200.
  mySerial.begin(19200);  // Initialize SoftwareSerial
  //Serial1.begin(19200); // Use this instead if using hardware serial
  printer.begin();        // Init printer (same regardless of serial type)
 
  /*Innofab*/
  printer.justify('C');
  printer.inverseOn();
  printer.println(F("Innofab"));
  printer.inverseOff();
 
  /*Innofab logo*/
  // Print the 75x75 pixel logo in logo.h:
  printer.printBitmap(logo_width, logo_height, logo_data);
 
  /*Text*/
  printer.justify('L');
 
  printer.println(F("Facture pour un montant de : "));
  //printer.println(F("\n"));

  printer.boldOn();
  printer.underlineOn();
  printer.println(var + " euros");
  printer.boldOff();
  printer.underlineOff();
  printer.println(F("\n"));

  /*Innofab Facebook QrCode*/
  // Print the 135x135 pixel logo in QrCode.h:
  printer.printBitmap(QrCode_width, QrCode_height, QrCode_data);
  //printer.println(F("\n"));

  /*Adafruit*/
  // Print the 75x75 pixel logo in adalogo.h:
  printer.printBitmap(adalogo_width, adalogo_height, adalogo_data);
  printer.justify('C');
  printer.println(F("Thermal printer"));
  printer.println(F("Powered by adafruit"));
  printer.feed(2);
 
  printer.sleep();      // Tell printer to sleep

  prix = "";
  mySerial.end();
 
}


Merci pour votre patience et l'aide que vous m'apporterez !
Ayzak
 
Messages: 8
Inscription: Mar 2 Juin 2015 19:41

Re: thermal printer + keypad matrix

Message non lude Ayzak » Mar 10 Nov 2015 13:03

Quelqu'un aurait-il une idée ? :S
Ayzak
 
Messages: 8
Inscription: Mar 2 Juin 2015 19:41

Re: thermal printer + keypad matrix

Message non lude Ayzak » Jeu 12 Nov 2015 14:12

Petit up.

J'ai contourné le problème, en mettant la touche * en RELEASED et en vidant la variable "prix"

Code: Tout sélectionner
 case RELEASED :
                    if(key == '*'){
                       prix = " ";
                   }
break;


Ceci me permet (en appuyant dessus avant de taper un prix) de palier au problème du '#'.
Ayzak
 
Messages: 8
Inscription: Mar 2 Juin 2015 19:41

Re: thermal printer + keypad matrix

Message non lude Laetitia » Lun 7 Déc 2015 11:42

Bonjour,

Je vois deux petits soucis dans votre code :
- la gestion de l'appui sur les touches dans la loop() alors que tout devrait être géré dans la fonction keypadEvent() définie plus bas,
- le switch/case du keypadEvent présente deux fois le même cas "PRESSED", et aucune action par défaut.

Je vous invite à aller consulter le tutoriel sur l'utilisation du clavier matriciel, la code est assez similaire, il ne vous restera qu'à l'adapter :)
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse


Retourner vers Adafruit

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité