#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <SPI.h> // Pour la communication SPI
#include <SdFat.h> // Pour la communication avec la carte SD
unsigned long currentTime=0;
unsigned long previousTime=0;
long pause=500; // temps de pause des delay
byte pinsFiles[] = {5,4,3,2};
byte pinsColonnes[] = {6,7,8,9};
const byte nombreFiles = 4;
const byte nombreColonnes = 4;
char boutons[4][4] = {{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','.','D'}};
Keypad customKeypad= Keypad( makeKeymap(boutons), pinsFiles, pinsColonnes, nombreFiles, nombreColonnes);
char digicode_modifie; //retour du clavier
// tableau de code EAN pour essais
char tab_EAN [] [16]={"123456789101","123456789102","3124480186560"};
char tab_PRODUIT [] [16] = {"COCA 33CL","PEPSI","OASIS 33cl"};
char tab_PRIX [] [6] = {"12.50","10.00","7.5"};
// variables pour calculs
String premier_chaine;
float premier_chiffre = 0;
float second_chiffre = 1;
float total = 0;
float dernier_scan = 0; // pour annuler si besoin
boolean part_ent = true;
boolean code_ok = false;
// Information sur ecran I2C lcd (SDA / SCL)
LiquidCrystal_I2C lcd(0x27,16,2);
// pour la carte SD
#define SPI_SPEED SD_SCK_MHZ(4)
#define CS_PIN 53
// SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h,
// 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT.
#define SD_FAT_TYPE 3
SdFat sd;
File myFile;
String buffer;
String filename = "test";
void setup()
{
lcd.begin(16, 2); //On démarre l'écran LCD
lcd.backlight();
//for(int i=0;i<=3;i++);
lcd.setCursor(0,0); // On déplace le curseur au début de l'écran
lcd.print("CASH MACHINE");
lcd.setCursor(0,1);
lcd.print("@ Jules S");
//delay(pause);
Serial.begin(9600);
lcd.clear(); // On efface l'écran LCD
lcd.setCursor(0, 0);
lcd.print("BIENVENUE");
lcd.setCursor(0,1);
lcd.print("CHEZ Jules");
//Serial.begin(115200);
// lecture des données sur carde SD
if (!sd.begin(CS_PIN, SPI_SPEED)) {
if (sd.card()->errorCode()) {
Serial.println("SD initialization failed.");
} else if (sd.vol()->fatType() == 0) {
Serial.println("Can't find a valid FAT16/FAT32 partition.");
} else {
Serial.println("Can't determine error type");
}
return;
}
Serial.println("Files on card:");
Serial.println(" Size Name");
sd.ls(LS_R | LS_SIZE);
//Read file line by line
myFile = sd.open(filename + ".txt");
if (myFile) {
Serial.println("Read " + filename + ".txt line by line:");
while (myFile.available()) {
buffer = myFile.readStringUntil('\n');
Serial.println(buffer);
}
myFile.close();
} else {
Serial.println("error opening " + filename + ".txt");
}
}
void loop()
{
digicode_modifie = customKeypad.getKey();
switch(digicode_modifie)
{
case '0' ... '9': {
lcd.clear();
lcd.setCursor(0,0);
//premier_chiffre = premier_chiffre * 10 + (digicode_modifie - '0');
premier_chaine=premier_chaine+digicode_modifie;
premier_chiffre = premier_chaine.toFloat();
lcd.print(premier_chaine);
Serial.print("valeur € total : ");
Serial.println(total);
break;
}
case'.' : // permet d'ajouter la virgule
{lcd.setCursor(0,0);
//Serial.println("espion 3");
if (part_ent==true) {
premier_chaine=premier_chaine+".";
lcd.print(premier_chaine);
part_ent = false;
}
break;
}
case '*' : // fonction plusieurs produits identiques
{// Serial.println("espion 2");
Serial.println("valeur 1 =");
Serial.println(premier_chiffre);
Serial.println("valeur 2 =");
Serial.println(second_chiffre);
if (premier_chiffre != 0) {second_chiffre=premier_chiffre; }
lcd.setCursor(0,0);
lcd.clear();
lcd.print("Attente scanner");
lcd.setCursor(0,1);
lcd.print("quantite = ");
lcd.println(second_chiffre);
delay(pause);
lcd.setCursor(0,0);
lcd.print("Appuyer sur 'A' ");
break;
}
case 'A' : {// lancer un nouveau scan
boolean trouve = false;
currentTime=millis();
previousTime=millis();
int num_trouve;
Serial.println("nouveau scan en cours");
lcd.setCursor(0,0);
lcd.clear();
lcd.print("attente scanner");
while (Serial.available()<13) {
Serial.print("attente chiffre");
currentTime=millis();
if ((currentTime-previousTime)>3000){
Serial.print("temps dépassé");
break;}
// code scannage ici
int nombre = Serial.available();
Serial.print("nombre en buffer : ");
Serial.println(nombre);
}
String code_barre = Serial.readString();
// lcd.clear();
// lcd.print(code_barre);
code_barre.trim();
// delay(pause);
// ici processus comparaison code avec liste existante
int z = sizeof(tab_EAN)/(sizeof(char)*(sizeof(tab_EAN[0])/sizeof(char)));
int i;
for (i = 0; i < z; i++) {
//lecture ligne par ligne
String val = tab_EAN [i];
Serial.println(val);
//Serial.println("/");
if (code_barre==val) {
trouve=true;
num_trouve=i;}
}
if (trouve==true) {
Serial.print("ok trouvé ");
lcd.clear();
lcd.setCursor(0,0);
lcd.print(tab_PRODUIT [num_trouve]);
lcd.setCursor(0,1);
lcd.print("PRIX = ");
lcd.print(tab_PRIX [num_trouve]);
float prix;
prix=atof(tab_PRIX [num_trouve]);
total=total+(prix*second_chiffre);
delay(pause);
// mise a jour du dernier scan pour annulation
dernier_scan = prix*second_chiffre;
// remise a zero des variables apres scan positif
premier_chiffre = 0;
second_chiffre = 1;
premier_chaine ="";
part_ent = true;
Serial.print("dernier scan :");
Serial.println(dernier_scan);
} else {
// article non trouvé
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ERREUR CODE");
lcd.setCursor(0,1);
lcd.print("RECOMMENCEZ");
delay(pause);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TOTAL :");
lcd.setCursor(0,1);
lcd.print(total);
break;
}
case 'B' : // annulation dernier operation
{ Serial.println("annulation dernier opé");
Serial.print("Annulation du dernier scan :");
Serial.println(dernier_scan);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ANNULATION");
lcd.setCursor(0,1);
lcd.print("DERNIERE OPERATION");
if (dernier_scan==0) {
delay(pause);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("AUCUNE OPERATION");
delay(pause);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TOTAL :");
lcd.setCursor(0,1);
lcd.print(total);
} else {
Serial.print("aaq => Annulation du dernier scan :");
Serial.println(dernier_scan);
Serial.print("ancien total");
Serial.println(total);
total=total-dernier_scan;
Serial.print("nouveau total");
Serial.println(total);
delay(pause);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TOTAL :");
lcd.setCursor(0,1);
lcd.print(total);
dernier_scan=0; // pour éviter double annulation
}
premier_chaine =""; // pour remettre le chiffre a vide
break;
}
case 'C' : // rendu monnaie
{Serial.println("procédure rendu monnaie");
Serial.print("premier chiffre = ");
Serial.println(premier_chiffre);
Serial.print("second chiffre = ");
Serial.println(second_chiffre);
Serial.print("total = ");
Serial.println(total);
if (total== 0) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("PAS D'OPERATION");
delay(pause);
delay(pause);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TOTAL :");
lcd.setCursor(0,1);
lcd.print(total);
break;}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("MONNAIE RECUE ? :");
if (premier_chiffre == 0) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("MONNAIE RECUE ? :");
} else {
float rendu;
rendu = premier_chiffre-total;
if (rendu<0) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("INSUFFISANT");
premier_chiffre = 0;
second_chiffre = 1;
premier_chaine ="";
} else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("MONNAIE A RENDRE :");
lcd.setCursor(0,1);
lcd.print(rendu);
premier_chiffre = 0;
second_chiffre = 1;
premier_chaine ="";
total=0;
dernier_scan=0; // pour éviter annulation suite rendu monnaie
}
}
break;
}
case 'D' : // Permet de réintialiser le Système
{
Serial.println("re-init systeme");
total = 0;
premier_chiffre = 0;
second_chiffre = 1;
premier_chaine ="";
part_ent = true;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("REMISE A ZERO");
delay(pause);
delay(pause);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TOTAL :");
lcd.setCursor(0,1);
lcd.print(total);
break;
}
}
}