Skip to content

Instantly share code, notes, and snippets.

@thinkchip
Created January 14, 2017 01:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save thinkchip/ff6c0056932d22ea36ba0b6c0ef6014f to your computer and use it in GitHub Desktop.
Save thinkchip/ff6c0056932d22ea36ba0b6c0ef6014f to your computer and use it in GitHub Desktop.
Example Arduino MDB Coin changer communication Lite
/*
*/
#include <SoftwareSerial.h>
#define TERM_COIN 0x02
#define TERM_COIN_INIT 0x01
#define TERM_COIN_STOP 0x02
#define TERM_COIN_POLL 0x03
#define TERM_COIN_TUBE 0x05
#define TERM_COIN_PAYOUT 0x07
#define TERM_COIN_ACCEPTED 0x08
#define TERM_COIN_SETUP 0x0c
#define TERM_COIN_IDENTIFICATION 0x0d
enum{
dumb=0,init_coin,setup_coin,tubes_coin,id_coin,poll_coin,payout_coin
};
String console;
int state_easymdb=0;
unsigned long timer=0;
byte bufferin_easymdb[30]={0};
int pointerin_easymdb=0;
int checksum_easymdb=0;
bool flag_easymdb=false;
byte cointype_buffer[16]={0};
int coin_realvalscaling=0;
byte StringGlobal[6]={0};
byte str_init_coin[5]={0x02,0x01,0x00,0xff,0x02};
byte str_tubes_coin[5]={0x02,0x05,0x00,0xff,0x06};
byte str_setup_coin[5]={0x02,0x0c,0x00,0xff,0x0d};
byte str_id_coin[5]={0x02,0x0d,0x00,0xff,0x0e};
byte str_poll_coin[5]={0x02,0x03,0x00,0xff,0x04};
byte str_coin_enable[9]={0x02,0x08,0x00,0xff,0xff,0xff,0xff,0xff,0x05};
byte str_coin_disable[9]={0x02,0x08,0x00,0x00,0x00,0x00,0x00,0xff,0x09};
SoftwareSerial easymdb(10, 11); // RX, TX
void display_menu(void);
void EasyMDBTask(void);
void ConvertPriceDecimal(uint16_t money);
void CleanBufferinEasyMDB(void);
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
// set the data rate for the easymdb port
easymdb.begin(115200);
display_menu();
}
/********************************************************
*
********************************************************/
void loop() { // run over and over
if (easymdb.available()) {
byte c=easymdb.read();
bufferin_easymdb[pointerin_easymdb++]=c;
if(bufferin_easymdb[pointerin_easymdb-2]==0xff && pointerin_easymdb>2){
int checksum_temp=checksum_easymdb & 0x00ff;
if(checksum_temp==c){
//end of message
flag_easymdb=true;
pointerin_easymdb=0;
}else{
checksum_easymdb += c;
}
}else{
checksum_easymdb += c;
}
}
if (Serial.available()) {
char c=Serial.read();
Serial.write(c);
console += c;
if (c == '\n'){
state_easymdb= console.toInt();
console = "";
}
}
EasyMDBTask();
}
/********************************************************
*
********************************************************/
void display_menu(void){
Serial.println("Arduino EasyMDB example\r");
Serial.println("Init coin press 1\r");
Serial.println("Setup coin press 2\r");
Serial.println("Tubes coin press 3\r");
Serial.println("Id coin press 4\r");
Serial.println("Coin accepted press 5\r");
Serial.println("Coin inhibit press 6\r");
Serial.println("Coin poll press 7\r");
}
/********************************************************
*
********************************************************/
void EasyMDBTask(void){
if(state_easymdb==1){
state_easymdb=0;
Serial.println("Selected init coin");
//send data to easymdb
easymdb.write(str_init_coin,5);
}else if(state_easymdb==2){
state_easymdb=0;
Serial.println("Selected setup coin");
easymdb.write(str_setup_coin,5);
}else if(state_easymdb==3){
state_easymdb=0;
Serial.println("Selected tubes coin");
easymdb.write(str_tubes_coin,5);
}else if(state_easymdb==4){
state_easymdb=0;
Serial.println("Selected id coin");
easymdb.write(str_id_coin,5);
}else if(state_easymdb==5){
state_easymdb=0;
Serial.println("Selected accepted coins");
easymdb.write(str_coin_enable,9);
}else if(state_easymdb==6){
state_easymdb=0;
Serial.println("Selected inhibit coins");
easymdb.write(str_coin_disable,9);
}else if(state_easymdb==7){
state_easymdb=0;
Serial.println("Selected poll coin");
easymdb.write(str_poll_coin,5);
}
//check response
if(flag_easymdb==true){
flag_easymdb=false;
if(bufferin_easymdb[0]==TERM_COIN && bufferin_easymdb[1]==TERM_COIN_INIT){
//init coin response
if(bufferin_easymdb[2]==1){
Serial.println("Init coin changer OK");
}else{
Serial.println("Init coin changer ERROR");
}
}else if(bufferin_easymdb[0]==TERM_COIN && bufferin_easymdb[1]==TERM_COIN_SETUP){
//setup data print
Serial.println("Setup coin OK");
//level 1 byte
Serial.print("Level ");
Serial.println(bufferin_easymdb[2],DEC);
//country 2 bytes
int country = bufferin_easymdb[3]<<8;
country |= bufferin_easymdb[4];
Serial.print("Country ");
Serial.println(country,HEX);
//scaling 1 byte
Serial.print("Scaling ");
Serial.println(bufferin_easymdb[5],DEC);
if(bufferin_easymdb[5]<10){
coin_realvalscaling=10*bufferin_easymdb[5];
}else{
coin_realvalscaling=bufferin_easymdb[5];
}
//decimal places 1 byte
Serial.print("Decimal places ");
Serial.println(bufferin_easymdb[6],DEC);
//coin type routing 2 bytes
int cointype=bufferin_easymdb[7]<<8;
cointype |= bufferin_easymdb[8];
Serial.print("Coin type routing ");
Serial.println(cointype,HEX);
//coin type accepted 16 bytes
for(int i=0;i<16;i++){
cointype_buffer[i]=bufferin_easymdb[i+9];
if(cointype_buffer[i]!=0){
Serial.print("Cointype ");
Serial.print(i);
Serial.print(":");
Serial.println(cointype_buffer[i],DEC);
}
}
}else if(bufferin_easymdb[0]==TERM_COIN && bufferin_easymdb[1]==TERM_COIN_POLL){
//coin poll
//received 10 bytes that mean 5 events (2 bytes per event)
for(int i=0;i<8;i=i+2){
if((bufferin_easymdb[i+2] & 0xc0)==0x40){
//coin deposited
int type_coin = bufferin_easymdb[i] & 0x0f;
int routing = bufferin_easymdb[i] & 0x30;
int cash = cointype_buffer[type_coin] * coin_realvalscaling;
ConvertPriceDecimal(cash);
Serial.print("Coin value inserted:");
Serial.write(StringGlobal,6);
if(routing==0){
Serial.println("To cashbox");
}else{
Serial.println("To tubes");
}
}
}
}else if(bufferin_easymdb[0]==TERM_COIN && bufferin_easymdb[1]==TERM_COIN_TUBE){
//tubes 16 bytes state
//tube full status
int tubefullstatus=bufferin_easymdb[2]<<8;
tubefullstatus |= bufferin_easymdb[3];
Serial.print("Tube full status:");
Serial.println(tubefullstatus,HEX);
//value in each tube
for(int i=0;i<16;i++){
int valtubes=bufferin_easymdb[i+4];
if(valtubes!=0){
Serial.print("Number of coins in tube ");
Serial.print(i);
Serial.print(" : ");
Serial.println(valtubes);
}
}
}
CleanBufferinEasyMDB();
display_menu();
}
}
/*********************************************************
*
*******************************************************/
void ConvertPriceDecimal(int money){
int centesima,decima,centena,decena,unidad,val;
centena = money/10000;
centena += 0x30;
val = money%10000;
decena = val/1000;
if(decena>9)decena=0x30;
decena += 0x30;
val = money%1000;
unidad = val/100;
unidad += 0x30;
val = money%100;
decima = val/10;
decima += 0x30;
val = money%10;
centesima = val;
centesima += 0x30;
StringGlobal[5]=(byte)(centesima);
StringGlobal[4]=(byte)(decima);
StringGlobal[3]='.';
StringGlobal[2]=(byte)(unidad);
if(decena>0x30){
StringGlobal[1]=(byte)(decena);
}else{
StringGlobal[1]=' ';
}
if(centena>0x30){
StringGlobal[0]=(byte)(centena);
}else{
StringGlobal[0]=' ';
}
}
/**********************************************************
*
*********************************************************/
void CleanBufferinEasyMDB(void){
for(int i=0;i<30;i++){
bufferin_easymdb[i]=0;
}
pointerin_easymdb=0;
checksum_easymdb=0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment