วันอังคารที่ 29 กันยายน พ.ศ. 2552

GPS หยอดเหรียญ ???











































ดองใว้นาน!!! ตัวหยอดเหรียญ ตอนนั้นซื้อมา 20 บาท ที่ตลาดเซพวัน ดองจนลืม วันนี้จับมาปัดฝุ่น เลยเอามาต่อ MCU เล่น แต่ก็คิดไม่ออกว่าจะทำอะไร จึงจับรวมกับ GPS และ จอ 3310 เป็น GPS หยอดเหรียญ
จากรูปที่สอง เป็นรูปที่ยังไม่หยอดเหรียญ เมื่อหยอดแล้วจะได้รูปที่สามครับ พร้อมทั้งนับเวลาถอยหลังเป็นวินาที (บันทัดสุดท้ายของรูปที่สาม) ซึ่งการเช็คหยอดเหรียญนั้น เช็คแบบ Interrupt ทำให้สามารถหยอดเหรียญได้อย่างต่อเนื่อง การนับถอยหลังก็นับเวลาจากฐานเวลา GPS ซึ่งก็เดินตรงดี แถมด้วยเวลา GPS หลุด(จับดาวเทียมไม่ได้)ก็จะหยุดทำการนับเวลาถอยหลังด้วย เมื่อสัญญานมาก็จะทำการนับถอยหลังต่อ ทำให้ผู้ใช้บริการไม่ขาดทุนได้ข้อมูลตามที่จ่ายเงิน ไม่เอาเปรียบผู้บริโภค เอิ๊กๆ ขนาดจำลอง เล่นเอาซะเต็มที่เลย จากการทดลองนี้ทำให้ข้าพเจ้า ได้ศึกษาและเรียนรู้การติดต่อเครื่องหยอดเหรียญกับไมโครคอนโทรลเลอร์ ( หลอกเครื่องหยอดเหรียญไม่ได้ ) มันมีวงจรเช็คน้ำหนักแบบไม่ต้องช่างน้ำหนักได้ด้วย เก่งจริงๆ ขนาดรุ่นเก่านะนี่ ถ้ารุ่นใหม่ หมดสิทธิหลอกเครื่องแน่นอน

โค๊ดครับ
#include <18f452.h>
#include
#use delay(clock=30000000)
#fuses HS,NOPROTECT,NOWDT,NOBROWNOUT
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=GPS,stream=HOSTPC,stream=B,errors)

#include
#include
#include


#define nok_sclk PIN_B6
#define nok_sda PIN_B5
#define nok_dc PIN_B4
#define nok_cs PIN_B3
#define nok_res PIN_B2

//char image[];

char timei[10],lati[15],loni[15],speedi[10],dayi[10];
float time,lat,lon,speed,day;
float lat1,lat2,lat3,lon1,lon2,lon3,time0,time1,time2,time3,day0,day1,day2;
float t1,t2,t3,d1,d2,d3;

char char_row,charsel,charpos,chardata; // for nokia_3310 lcd
int16 ddram;
int32 plot_value32;
int32 plot_umsb,plot_lmsb,plot_ulsb,plot_llsb;

int16 nub=0;
#INT_EXT
void EXT_ISR(void)
{
delay_us(200);
nub=nub+60;
}

BYTE const TABLE5[240]=
{0x00,0x00,0x00,0x00,0x00, // 20 space ASCII table for NOKIA LCD: 96 rows * 5 bytes= 480 bytes
0x00,0x00,0x5f,0x00,0x00, // 21 !
0x00,0x07,0x00,0x07,0x00, // 22 "
0x14,0x7f,0x14,0x7f,0x14, // 23 #
0x24,0x2a,0x7f,0x2a,0x12, // 24 $
0x23,0x13,0x08,0x64,0x62, // 25 %
0x36,0x49,0x55,0x22,0x50, // 26 &
0x00,0x05,0x03,0x00,0x00, // 27 '
0x00,0x1c,0x22,0x41,0x00, // 28 (
0x00,0x41,0x22,0x1c,0x00, // 29 )
0x14,0x08,0x3e,0x08,0x14, // 2a *
0x08,0x08,0x3e,0x08,0x08, // 2b +
0x00,0x50,0x30,0x00,0x00, // 2c ,
0x08,0x08,0x08,0x08,0x08, // 2d -
0x00,0x60,0x60,0x00,0x00, // 2e .
0x20,0x10,0x08,0x04,0x02, // 2f /
0x3e,0x51,0x49,0x45,0x3e, // 30 0
0x00,0x42,0x7f,0x40,0x00, // 31 1
0x42,0x61,0x51,0x49,0x46, // 32 2
0x21,0x41,0x45,0x4b,0x31, // 33 3
0x18,0x14,0x12,0x7f,0x10, // 34 4
0x27,0x45,0x45,0x45,0x39, // 35 5
0x3c,0x4a,0x49,0x49,0x30, // 36 6
0x01,0x71,0x09,0x05,0x03, // 37 7
0x36,0x49,0x49,0x49,0x36, // 38 8
0x06,0x49,0x49,0x29,0x1e, // 39 9
0x00,0x36,0x36,0x00,0x00, // 3a :
0x00,0x56,0x36,0x00,0x00, // 3b ;
0x08,0x14,0x22,0x41,0x00, // 3c < 3d =" 0x00,0x41,0x22,0x14,0x08,">
0x02,0x01,0x51,0x09,0x06, // 3f ?
0x32,0x49,0x79,0x41,0x3e, // 40 @
0x7e,0x11,0x11,0x11,0x7e, // 41 A
0x7f,0x49,0x49,0x49,0x36, // 42 B
0x3e,0x41,0x41,0x41,0x22, // 43 C
0x7f,0x41,0x41,0x22,0x1c, // 44 D
0x7f,0x49,0x49,0x49,0x41, // 45 E
0x7f,0x09,0x09,0x09,0x01, // 46 F
0x3e,0x41,0x49,0x49,0x7a, // 47 G
0x7f,0x08,0x08,0x08,0x7f, // 48 H
0x00,0x41,0x7f,0x41,0x00, // 49 I
0x20,0x40,0x41,0x3f,0x01, // 4a J
0x7f,0x08,0x14,0x22,0x41, // 4b K
0x7f,0x40,0x40,0x40,0x40, // 4c L
0x7f,0x02,0x0c,0x02,0x7f, // 4d M
0x7f,0x04,0x08,0x10,0x7f, // 4e N
0x3e,0x41,0x41,0x41,0x3e // 4f O 48
};

BYTE const TABLE6[245]=
{0x7f,0x09,0x09,0x09,0x06, // 50 P
0x3e,0x41,0x51,0x21,0x5e, // 51 Q
0x7f,0x09,0x19,0x29,0x46, // 52 R
0x46,0x49,0x49,0x49,0x31, // 53 S
0x01,0x01,0x7f,0x01,0x01, // 54 T
0x3f,0x40,0x40,0x40,0x3f, // 55 U
0x1f,0x20,0x40,0x20,0x1f, // 56 V
0x3f,0x40,0x38,0x40,0x3f, // 57 W
0x63,0x14,0x08,0x14,0x63, // 58 X
0x07,0x08,0x70,0x08,0x07, // 59 Y
0x61,0x51,0x49,0x45,0x43, // 5a Z
0x00,0x7f,0x41,0x41,0x00, // 5b [
0x02,0x04,0x08,0x10,0x20, // 5c
0x00,0x41,0x41,0x7f,0x00, // 5d
0x04,0x02,0x01,0x02,0x04, // 5e
0x40,0x40,0x40,0x40,0x40, // 5f
0x00,0x01,0x02,0x04,0x00, // 60
0x20,0x54,0x54,0x54,0x78, // 61 a
0x7f,0x48,0x44,0x44,0x38, // 62 b
0x38,0x44,0x44,0x44,0x20, // 63 c
0x38,0x44,0x44,0x48,0x7f, // 64 d
0x38,0x54,0x54,0x54,0x18, // 65 e
0x08,0x7e,0x09,0x01,0x02, // 66 f
0x0c,0x52,0x52,0x52,0x3e, // 67 g
0x7f,0x08,0x04,0x04,0x78, // 68 h
0x00,0x44,0x7d,0x40,0x00, // 69 i
0x20,0x40,0x44,0x3d,0x00, // 6a j
0x7f,0x10,0x28,0x44,0x00, // 6b k
0x00,0x41,0x7f,0x40,0x00, // 6c l
0x7c,0x04,0x18,0x04,0x78, // 6d m
0x7c,0x08,0x04,0x04,0x78, // 6e n
0x38,0x44,0x44,0x44,0x38, // 6f o
0x7c,0x14,0x14,0x14,0x08, // 70 p
0x08,0x14,0x14,0x18,0x7c, // 71 q
0x7c,0x08,0x04,0x04,0x08, // 72 r
0x48,0x54,0x54,0x54,0x20, // 73 s
0x04,0x3f,0x44,0x40,0x20, // 74 t
0x3c,0x40,0x40,0x20,0x7c, // 75 u
0x1c,0x20,0x40,0x20,0x1c, // 76 v
0x3c,0x40,0x30,0x40,0x3c, // 77 w
0x44,0x28,0x10,0x28,0x44, // 78 x
0x0c,0x50,0x50,0x50,0x3c, // 79 y
0x44,0x64,0x54,0x4c,0x44, // 7a z
0x00,0x08,0x36,0x41,0x00, // 7b
0x00,0x00,0x7f,0x00,0x00, // 7c
0x00,0x41,0x36,0x08,0x00, // 7d
0x10,0x08,0x08,0x10,0x08, // 7e
0x78,0x46,0x41,0x46,0x78 // 7f
};



//
void readMessage();
void convert();
void nokia_init(void);
void nokia_write_command(char bytefornokia_command);
void nokia_write_data(char bytefornokia_data);
void nokia_write_dorc(char bytefornokia);
void nokia_gotoxy(int8 xnokia, int8 ynokia);
void nokia_erase_y(int8 ynokia);
void nokia_erase_x(int8 xnokia);
void nokia_printchar(int8 cvar);
void nokia_clean_ddram(void);
void table_to_nokialcd(void);
void nokia_plot(int8 xnokia,int8 plot_value8);
void nokia_write_data_inv(char bytefornokia_data_inv);
void nokia_clear_screen(void);
void nokia_clear_xy(int8 xnokia, int8 ynokia);
void nokia_print_uparrow(void);
void nokia_print_downarrow(void);
void nokia_print_leftarrow(void);
void nokia_print_rightarrow(void);
void nokia_print_degree(void);
void nokia_print_lowbatdegree(void);
void lcd_wrimg(char image[],unsigned char x1,y1);
void Init_MCU(void);

void lcd_wrimg(char image[],unsigned char x1,y1)
{
int tablept = 0;
unsigned char y=0,x=0,pix=0,x2=0,y2=0;

x2 = image[tablept];
tablept++;
y2 = image[tablept];
tablept++;
for (y=y1;y<(y1+y2);y++) // Draw the columns to print the character. { nokia_gotoxy(x1,y); for (x=0;x0;ddram--){nokia_write_data(0x00);}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void nokia_write_command(char bytefornokia_command)
{
output_low(nok_dc); // byte is a command it is read with the eight SCLK pulse
output_low(nok_cs); // chip enabled
nokia_write_dorc(bytefornokia_command);
output_high(nok_cs); // chip disabled
}
/////////////////////////////////////////////////////////////////////////////////
void nokia_write_data(char bytefornokia_data)
{
output_high(nok_dc);
output_low(nok_cs); // chip enabled
nokia_write_dorc(bytefornokia_data);
output_high(nok_cs); // chip disabled
}
//////////////////////////////////////////////////////////////////////////////////
void nokia_write_dorc(char bytefornokia) // serial write data or command subroutine
{
char caa;
for (caa=8;caa>0;caa--) {
output_low(nok_sclk);
// delay_us(2);
if ((bytefornokia&0x80)==0x00){output_low(nok_sda);}
else {output_high(nok_sda);}
output_high(nok_sclk);
bytefornokia=bytefornokia<<1; column="0;column!=" charsel="cvar;">0xD2)return;

for (char_row=0;char_row<5;char_row++) charpos="(((charsel&0xff)-0x20)*5);chardata=">0x4f){charpos=(((charsel&0xff)-0x50)*5);chardata=TABLE6[(charpos+char_row)];} // use TABLE6
nokia_write_data(chardata); // send data to nokia
}
nokia_write_data(0x00); // 1 byte (always blank)
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void nokia_plot(int8 xnokia,int8 plot_value8)
{
char i;
plot_value32=0;
// plot_value32=1; // unremark this if you want dotgraph instead of bargraph

for (i=0;i!=plot_value8;i++){

plot_value32=1; // remark this if you want dotgraph instead of bargraph
plot_value32<<=1; } plot_value32=2; // bottom line is always filled plot_llsb=(plot_value32&0xff); plot_ulsb=((plot_value32>>8)&0xff);
plot_lmsb=((plot_value32>>16)&0xff);
plot_umsb=((plot_value32>>24)&0xff);

nokia_gotoxy(xnokia,1);
nokia_write_data_inv(plot_umsb);

nokia_gotoxy(xnokia,2);
nokia_write_data_inv(plot_lmsb);

nokia_gotoxy(xnokia,3);
nokia_write_data_inv(plot_ulsb);

nokia_gotoxy(xnokia,4);
nokia_write_data_inv(plot_llsb);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void nokia_write_data_inv(char bytefornokia_data_inv)
{
char caa;
output_high(nok_dc);
output_low(nok_cs); // chip enabled
for (caa=8;caa>0;caa--) {
output_low(nok_sclk);
delay_us(2);
if ((bytefornokia_data_inv&0x01)==0){output_low(nok_sda);}
else {output_high(nok_sda);}
output_high(nok_sclk);
bytefornokia_data_inv=bytefornokia_data_inv>>1;
}
output_high(nok_cs); // chip disabled
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void nokia_clear_screen(void)
{
nokia_erase_y(0);
nokia_erase_y(1);
nokia_erase_y(2);
nokia_erase_y(3);
nokia_erase_y(4);
nokia_erase_y(5);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void nokia_clear_xy(int8 xnokia, int8 ynokia)
{
nokia_gotoxy(xnokia,ynokia);
nokia_printchar(" ");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void nokia_print_uparrow(void)
{
nokia_write_data(0x04);
nokia_write_data(0x02);
nokia_write_data(0x7f);
nokia_write_data(0x02);
nokia_write_data(0x04);
nokia_write_data(0x00);
}
//
void nokia_print_downarrow(void)
{
nokia_write_data(0x10);
nokia_write_data(0x20);
nokia_write_data(0x7f);
nokia_write_data(0x20);
nokia_write_data(0x10);
nokia_write_data(0x00);
}
//
void nokia_print_leftarrow(void)
{
nokia_write_data(0x08);
nokia_write_data(0x1c);
nokia_write_data(0x2a);
nokia_write_data(0x08);
nokia_write_data(0x08);
nokia_write_data(0xf8);
}
//
void nokia_print_rightarrow(void)
{
nokia_write_data(0x08);
nokia_write_data(0x08);
nokia_write_data(0x2a);
nokia_write_data(0x1c);
nokia_write_data(0x08);
nokia_write_data(0x00);
}
//
void nokia_print_degree(void)
{
nokia_write_data(0x00);
nokia_write_data(0x06);
nokia_write_data(0x09);
nokia_write_data(0x09);
nokia_write_data(0x06);
nokia_write_data(0x00);
}
//
void nokia_print_lowbatdegree(void)
{
nokia_write_data(0x00);
nokia_write_data(0x06);
nokia_write_data(0x0f);
nokia_write_data(0x0f);
nokia_write_data(0x06);
nokia_write_data(0x00);
}
//////////////////////////////////////////////////////////////////////////////
void readMessage()
{
char c;
char buffer[80];
char k;
char sentent[]="GPRMC";
int16 i,j=0,time_count=0,lat_count=0,lon_count=0,speed_count=0,day_count=0;
do
{
for(i=0;i<15;i++) k="0;k<5;k++)" c="0;" c =" fgetc(GPS);" i="0;i
{
if (buffer[i]==','){j++;}
if (j==1)
{
timei[time_count++]=buffer[i+1];
}
if (j==3)
{
lati[lat_count++]=buffer[i+1];
}
if (j==5)
{
loni[lon_count++]=buffer[i+1];
}
if (j==7)
{
speedi[speed_count++]=buffer[i+1];
}
if (j==9)
{
dayi[day_count++]=buffer[i+1];
}
}
time = atof(timei);
lat = atof(lati);
lon = atof(loni);
speed = atof(speedi);
day = atof(dayi);
}
//////////////////////////////////////////////////////////////////////////////
void convert(void)
{

day0=day*0.0001;
day1=fmod(day0,1);
day2=day0-day1;
///////////////////
d1=day2;
///////////////////
day0=day1*100;
day1=fmod(day0,1);
day2=day0-day1;
///////////////////
d2=day2;
///////////////////
day2=day1*100;
///////////////////
d3=day2;
///////////////////



time0=time*0.0001;
time1=fmod(time0,1);
time2=time0-time1;
if(time2<=17) { time2=time2+7; } else { time2=(17-time2)*-1; } time3=(time2+time1)*10000; /////////////////// t1=time2; /////////////////// time0=time1*100; time1=fmod(time0,1); time2=time0-time1; /////////////////// t2=time2; /////////////////// time2=time1*100; /////////////////// t3=time2; /////////////////// lat=lat/100; lat1=fmod(lat,1); lat2=lat-lat1; lat1=(lat1/60)*100; lat3=lat1+lat2; lon=lon/100; lon1=fmod(lon,1); lon2=lon-lon1; lon1=(lon1/60)*100; lon3=lon1+lon2; } ////////////////////////////////////////////////////////////////////////////// void Init_MCU(void) { enable_interrupts(GLOBAL); enable_interrupts(INT_EXT); ext_int_edge(H_TO_L); } ////////////////////////////////////////////////////////////////////////////// void main() { nokia_init(); Init_MCU(); while(true) { if(nub!=0) { readMessage(); convert(); nokia_clear_screen(); nokia_gotoxy(0,0); printf(nokia_printchar,"DAY : %02.0f:%02.0f:%02.0f",d1,d2,d3); nokia_gotoxy(0,1); printf(nokia_printchar,"T : %02.0f:%02.0f:%02.0f",t1,t2,t3); nokia_gotoxy(0,2); printf(nokia_printchar,"LAT : %4.5f",lat3); nokia_gotoxy(0,3); printf(nokia_printchar,"LON :%4.5f",lon3); nokia_gotoxy(0,4); printf(nokia_printchar,"SP : %3.0f",speed); nokia_gotoxy(0,5); //printf(nokia_printchar," BY NONT_PEET "); printf(nokia_printchar," %lu S ",nub); delay_ms(100); nub--; } else { output_toggle(pin_c2); nokia_clear_screen(); nokia_gotoxy(0,0); printf(nokia_printchar," R "); nokia_gotoxy(0,1); printf(nokia_printchar," M "); nokia_gotoxy(0,2); printf(nokia_printchar," U "); nokia_gotoxy(0,3); printf(nokia_printchar," T "); nokia_gotoxy(0,4); printf(nokia_printchar," I "); lcd_wrimg(aa,15,1); delay_ms(100); } } }

ไม่มีความคิดเห็น:

แสดงความคิดเห็น