Created
January 14, 2017 01:58
-
-
Save thinkchip/ff6c0056932d22ea36ba0b6c0ef6014f to your computer and use it in GitHub Desktop.
Example Arduino MDB Coin changer communication Lite
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
*/ | |
#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