Proiektu honekin supermerkatutako erosteko modua erabat aldatu eta erraztea lortu nahi da. Karroari lotuta doan sistema honen helburua ordainketa sistema azkarragoa sortzea da.Bezero bakoitzak bere identifikazio pertsonala izango du.
Hau llabero bidez egingo da eta bezero bakoitzak berea izango du. Erosketa bakoitzaren hasieran erabiliko du eta erabili ezean ezin izango du erosketak burutu.
Zirkuituak 3 pultsadore izango ditu, erosketa errazteko, + botoia, - botoia eta = botoia. + botoia produktuak gehitzeko erabiliko da. - botoia, aurretik pasa diren produktuak erosketa zerrendatik kentzeko erabiliko da eta = botoia berriz erosketa bukatzean erabiliko da.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// **PROGRAMAREN FUNTZIONAMENDUA** //
// Piztu ondoren automatikoki mezu bat ageri da pantailan. //
// Mezu honek eroslea identifikatzeko llaberoa pasatzeko eskatzen dio. //
// Mezu hau agertuko da llaberoa pasa bitartean eta llaberoa pasa ordez txartela pasatzen bada, //
// ez duenez inor identifikatuko lcd-an erabiltzailea identifikatzeko llaberoa pasa dezan eskatzen jarraituko du. //
// Txartel irakurketa bakoitzean zunbadore batek soinu txiki bat sortuko du, //
// irakurketa egin dela ziurtatzeko erabiltzaileari. Gainera, irakurgailuko led argia normalean gorri kolorekoa //
// egongo da eta irakurri bitartean berde kolorekoa ipiniko da. //
// Produktuak gehitzeko erosketa karrora, gehi botoia sakatu behar da. Hau egitean, argi gorria pizten da //
// hau piztu ondoren irakurgailua prest dago edozein txartel irakurtzeko. Argi gorria piztearekin batera, lcdan //
// produktuak pasatzeko eskatzen duen mezu bat agertzen da lehen ileran //
// eta bigarrenean erosketak guztira balio duena. //
// Txartela irakurgailura pasatzean zunbadoreak soinua ateratzen du, une berean argi gorria itzali eta berdea piztuaz. //
// Txartela irakurtzean software bidez identifikatzen du zein den pasa den produktua //
// eta pantailako lehen ileran agertzen da produktua eta bere prezioa. //
// Produktua pantailaratzeaz gain, bigarren ileran agertzen den balioa eguneratzen du irakurritako produktu guztiak batuaz. //
// Erabiltzailea produktuz nahastuko balitz, akats hau zuzentzeko aukera izan dezan kenketa egiteko botoia dago. //
// Kenketa burutzeko ken botoia sakatu behar da eta kendu nahi den produktua identifikatuko duen txartela irakurgailura hurbildu behar da. //
// Kendu nahi den produktua aurrez karrora gehitua dagoela zihurtatzen da software bidez. //
// Produktua aurrez gehitu bada kendu eta "guztira" balioa eguneratzen du. //
// Produktua ez badago karroan mezu bat pantailaratzen da, karroan ez dagoela adieraziaz //
// eta ez du "guztira" balioan aldaketarik sortzen. //
// Azkenik erosketa egitea amaitutzat jotzean, bukatu botoiari eman behar zaio. //
// Hau sakatzean eskerrak emateaz gain, kaxatik pasatzeko eskatzen dio erabiltzaileari. //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// **PIC-aren LOTURAK //
// **A PORTUA** //
// A0->GEHI BOTOIA //
// A1->IRAKURGAILUAREN ENABLEA //
// A2->KEN BOTOIA //
// A3->BUKATU BOTOIA //
// A portuko gainontzeko pinak konketatu gabe daude. //
// **B PORTUA** //
// B0->Zunbadorea aktibatu eta desaktibatzeko //
// B3->Bluetooth igorlearen TXDarekin //
// B4->Bluetooth igorlearen RXDarekin //
// B5->Linea seriaren konexioa //
// B portuko gainontzeko pinak konektatu gabe daude. //
// **C PORTUA** //
// C0->Ez dago konektatua //
// C1->LCDaren Enablearekin lotua //
// C2->LCDaren RSarekin lotua //
// C3->LCDaren RWarekin lotua //
// C4->L4arekin lotua //
// C5->L5arekin lotua //
// C6->L6arekin lotua //
// C7->L7arekin lotua //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SOFTWAREA //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f876.h>
#fuses XT,NOWDT,NOPROTECT
#use delay (clock=4M)
#include "lcdfroga.c"
#use rs232(baud=2400, RCV=PIN_B5,stream=rfid)
#use rs232(baud=9600,XMIT=PIN_B4, RCV=PIN_B3,stream=bt)
#define gehitu input(PIN_A0)
#define kendu input(PIN_A2)
#define bukatu input(PIN_A3)
int8 const tag_cod [15][12] ={
{0x0A,0x33,0x41,0x30,0x30,0x30,0x36,0x45,0x31,0x38,0x31,0x0D} //L1
{0x0A,0x33,0x41,0x30,0x30,0x30,0x37,0x38,0x41,0x35,0x31,0x0D} //L2
{0x0A,0x33,0x41,0x30,0x30,0x30,0x37,0x44,0x32,0x32,0x36,0x0D} //L3
{0x0A,0x33,0x41,0x30,0x30,0x30,0x36,0x42,0x32,0x34,0x46,0x0D} //L4
{0x0A,0x30,0x33,0x30,0x30,0x35,0x35,0x43,0x41,0x33,0x39,0x0D} //L5
{0x0A,0x31,0x37,0x30,0x30,0x42,0x42,0x37,0x41,0x31,0x39,0x0D} //t1
{0x0A,0x31,0x37,0x30,0x30,0x37,0x44,0x32,0x34,0x41,0x38,0x0D} //t2
{0x0A,0x31,0x37,0x30,0x30,0x42,0x42,0x37,0x43,0x35,0x34,0x0D} //t3
{0x0A,0x34,0x46,0x30,0x30,0x39,0x45,0x33,0x31,0x32,0x44,0x0D} //t4
{0x0A,0x34,0x46,0x30,0x30,0x39,0x45,0x42,0x42,0x44,0x38,0x0D} //t5
{0x0A,0x34,0x46,0x30,0x30,0x39,0x45,0x32,0x34,0x46,0x38,0x0D} //t6
{0x0A,0x34,0x46,0x30,0x30,0x39,0x45,0x39,0x45,0x43,0x42,0x0D} //t7
{0x0A,0x34,0x46,0x30,0x30,0x39,0x45,0x42,0x33,0x30,0x41,0x0D} //t8
{0x0A,0x34,0x46,0x30,0x30,0x39,0x45,0x44,0x45,0x34,0x44,0x0D} //t9
{0x0A,0x34,0x46,0x30,0x30,0x39,0x45,0x36,0x41,0x30,0x41,0x0D} //t10
};
char a[12];// array honetan gordetzen dira tag-en balioak
float totala=0,prezioa;
int8 ilera,tag_izena,helbide,konparaketa;
int8 contador; //€ karakterra
//void memoriara_gehitu(void);
int1 hartu_tag(void);
int8 konpara_tag(void);
float eman_prezioa();
void izendatu_ilerak(int8 izena);
void produktua_gehitu();
/***********************************************************
BALIOAK HARTZEKO FUNTZIOA
funtzio honekin txartelak irakurtzen ditu.
Itxaroten du 10ms ea txartela dagoen ala ez.
Ez baldin badago txartelik 0 itzultzen du.
1 itzultzen du txartela irakurri badu.
***************************************************************/
int1 hartu_tag(void)
{
int8 i;
int1 txartel=0;
output_low(PIN_A1);//Irakurgailuaren Enable pina aktibatu.
for(i=0;i<12;i++)//0tik 12 bitarteko datuekin ondorengo agindua egiten du
{
a[i]=fgetc(rfid);//Txartelaren balioa irakurtzn du.
}
output_high(PIN_B0);//B0 pinera 1 bidaltzen du
delay_ms(250);// bi segundu eta erdi itxaron
output_low(PIN_B0);// 0 bidali B0 pinera
txartel=1;//1 balioa asignatzen dio txartel aldagaiari
output_high(PIN_A1);//Irakurgailuaren Enable pina desaktibatu.
return(txartel);// txartel aldagaia itzultzen du
}
/******************************************************************************
TAG-EN BALIOAK KONPARATZEKO
funtzio honek aurrez irakurritako tagak arrayeko balioekin identifikatzen ditu.
Itzultzen du 0xff ez badu irakurri txartelik
*************************************************************************************/
int8 konpara_tag(void)//tag bakoitzaren balioa arrayeko ilera bati atxikitzen dio
{
int1 berdin=1;
int8 ilera,zutabe;
if(hartu_tag()==1) //txartela irakurri badut.
{
for(ilera=0;ilera<14;ilera++) //ileraz ilera konparatzen du.
{
for(zutabe=0;zutabe<11;zutabe++) //ilera bakoitza zutabez zutabe konparatzen du.
{
if(a[zutabe]==tag_cod[ilera][zutabe])//tag[zutabe];hartzen diren datuak eta tag_cod[ilera][zutabe];gordetako arraya.
{
continue;
}
else
{
berdin=0;//ez dira berdina. Kasilla batek desberdintasuna du
break;
}
}
if(berdin==1)
break;
else
berdin=1;
}//for ileraren amaiera
if(ilera<14)
return (ilera); // Pertsona lortutako balioa
else
return(0xff); //Ez du aurkitu txartela edo ez du irakurri
}
else
return(0xff); //Ez du aurkitu txartela edo ez du irakurri
}
/**************************************************************************************************
EMAN_PREZIOA FUNTZIOA:
tag_izena irakurtzen du eta prezio bat ematen dio txartelari
**************************************************************************************************/
float eman_prezioa()
{
lcd_gotoxy(1,1);//1,1 puntura bidaltzen du LCDra
switch(tag_izena)
{
case 5:
prezioa=1.30;//1.30 gordetzen du prezioan
printf(lcd_putc,"Lebadura 1,30");//LCDan ondorengo mezua agertzen da
break;
case 6:
prezioa=0.60;//0.60 gordetzen du prezioan
printf(lcd_putc,"Anbi-pur 0,60");//LCDan ondorengo mezua agertzen da
break;
case 7:
prezioa=0.80;//0.80 gordetzen du prezioan
printf(lcd_putc,"Kafea 0,80");//LCDan ondorengo mezua agertzen da
break;
case 8:
prezioa=0.60;//0.60 gordetzen du prezioan
printf(lcd_putc,"Zerealak 0,60");//LCDan ondorengo mezua agertzen da
break;
case 9:
prezioa=4.60;//4.60 gordetzen du prezioan
printf(lcd_putc,"Krema 4,60");//LCDan ondorengo mezua agertzen da
break;
case 10:
prezioa=1.35;//1.35 gordetzen du prezioan
printf(lcd_putc,"Kamamila 1,35");//LCDan ondorengo mezua agertzen da
break;
case 11:
prezioa=0.25;//0.25 gordetzen du prezioan
printf(lcd_putc,"Zapiak 0,25");//LCDan ondorengo mezua agertzen da
break;
case 12:
prezioa=0.45;//0.45 gordetzen du prezioan
printf(lcd_putc,"Poxpoloak 0,45");//LCDan ondorengo mezua agertzen da
break;
case 13:
prezioa=0.39;//0.39 gordetzen du prezioan
printf(lcd_putc,"Avecrem 0,39");//LCDan ondorengo mezua agertzen da
break;
case 14:
prezioa=0.75;//0.75 gordetzen du prezioan
printf(lcd_putc,"Antxoak 0,75");//LCDan ondorengo mezua agertzen da
break;
}
lcd_send_byte(0,0x8f);
lcd_send_byte(1,0); //modo dato
return(prezioa);
}
/**********************************************************************
EROSLEA IDENTIFIKATU
Identifikatu berri duen ilera bezero batekin lotu behar du.
ilerari eroslearen datuak emango zaizkio.
***********************************************************************/
void izendatu_ilerak(int8 izena)
{
printf(lcd_putc,"\fOngi etorri");//LCDan ondorengo mezua agertzen da-
switch(izena) //Eroslea eta identifikatzeko konparatu egiten dugu balioa.
{
case 0:
printf(lcd_putc,"\nUnai Alvarez");//LCDan ondorengo mezua agertzen da
break;
case 1:
printf(lcd_putc,"\nJulen Otegi");//LCDan ondorengo mezua agertzen da
break;
case 2:
printf(lcd_putc,"\nBelai Irazabal");//LCDan ondorengo mezua agertzen da
break;
case 3:
printf(lcd_putc,"\nJonatan Ruiz");//LCDan ondorengo mezua agertzen da
break;
case 4:
printf(lcd_putc,"\nLander Del Rio");//LCDan ondorengo mezua agertzen da
break;
}
write_eeprom(0x00,izena);
}
/**********************************************************************
PRODUKTUA GEHITU
automatikoki txartel bakoitza pasatzean
erosketari gehituko zaio eta lcdan agertuko da.
***********************************************************************/
void produktua_gehitu()
{
tag_izena=konpara_tag();
if(tag_izena!=0xff) //Aurkitu badu txartela
{
prezioa=eman_prezioa();
if((tag_izena!=0)&&(tag_izena!=1)&&(tag_izena!=2)&&(tag_izena!=3)&&(tag_izena!=4))
{
totala=totala+prezioa;
}
printf(lcd_putc,"\nGUZTIRA %4.2f",totala);//LCDan ondorengo mezua agertzen da
lcd_send_byte(0,0x0f);
lcd_send_byte(1,0); //modo dato
}
//else
//printf(lcd_putc,"\nTXARRA %4.2f",totala);//LCDan ondorengo mezua agertzen da
}
/******************************************************************************************************
MEMORIABORRATU FUNTZIOA
funtzio honek memoriako posizio guztietan 0xff gordeko du
******************************************************************************************************/
void memoria_borratu()
{
int8 i;
for(i=0;i<0xff;i++)//0tik hasi eta ffraino ondorengo agindua aplikatzen die
write_eeprom(i,0xff);//i posizioan ff datua idazten du
}
/*******************************************************************************************************
MEMORIA KONPARATU
Poduktua kendu nahi badugu,funtzio honek konparatzen du ea pasatu dugun txartela lehen pasa dugun.
Produktua pasata ez bazegoen ez digu kenketa egiten utziko.
**********************************************************************************************************/
void memoria_konparatu()
{
int8 i,marka=0;
for(i=helbide;i>0x00;i--)
{
if(read_eeprom(i)==tag_izena)
{
write_eeprom(i,0xff);//Produktua gordeta dagoen posizioa ezabatzen du.
marka=1;
break;
}
}
if(marka==1)
konparaketa=1;
else
konparaketa=0;
}
/*******************************************************************************************************
KENDU FUNTZIOA
produktu bat pasatzeko eskatuko zaio erabiltzaileari
eta totalari kenduko dio.
********************************************************************************************************/
void kendu_funtzioa(void)
{
printf(lcd_putc,"\fPasa kendu nahi");//LCDan ondorengo mezua agertzen da
printf(lcd_putc,"\nduzun produktua");//LCDan ondorengo mezua agertzen da
tag_izena=konpara_tag();
if(tag_izena!=0xff) //Aurkitu badu txartela
{
memoria_konparatu();// memoria_konparatu funtziora joan
if(konparaketa==1)
{
prezioa=eman_prezioa();
totala=totala-prezioa;// totalari prezioa kentzen dio eta totalean gordetzen du
printf(lcd_putc,"\nGUZTIRA %4.2f",totala);//LCDan ondorengo mezua agertzen da
lcd_send_byte(0,0x0f);
lcd_send_byte(1,0); //modo dato
}
else
{
printf(lcd_putc,"\fProduktua ez");//LCDan ondorengo mezua agertzen da
printf(lcd_putc,"\ndago karruan.");//LCDan ondorengo mezua agertzen da
delay_ms(2000);//2segundu itxaron
}
}
}
/*******************************************************************************************************
BIDALI DATUAK
BTtik datuak ordenadorera bidaltzen du erosketa burutu ondoren
********************************************************************************************************/
void bidali_datuak(void)
{
int8 i,izena,zerrenda;
int8 a;
izena=read_eeprom(0x00);
switch(izena) //Eroslea eta identifikatzeko konparatu egiten dugu balioa.
{
case 0:
fprintf(bt,"\n\rUnai Alvarez\n");//BT bidez ondorengo mezua agertzen da
break;
case 1:
fprintf(bt,"\n\rJulen Otegi\n");//BT bidez ondorengo mezua agertzen da
break;
case 2:
fprintf(bt,"\n\rBelai Irazabal\n");//BT bidez ondorengo mezua agertzen da
break;
case 3:
fprintf(bt,"\n\rJonatan Ruiz\n");//BT bidez ondorengo mezua agertzen da
break;
case 4:
fprintf(bt,"\n\rLander Del Rio\n");//BT bidez ondorengo mezua agertzen da
break;
}
for(i=1;i<helbide;i++)//i aldagaia inkrementatzen du helbide aldagaiaren baliora iritsi arte
{
zerrenda=read_eeprom(i);// i posizioa irakurtzen du eepromean eta zerrenda aldagaian gorde
switch(zerrenda)
{
case 5:
fprintf(bt,"\n\rLebadura 1,30 Euro");//BT bidez ondorengo mezua agertzen da
break;
case 6:
fprintf(bt,"\n\rAnbi-pur 0,60 Euro"); //BT bidez ondorengo mezua agertzen da
break;
case 7:
fprintf(bt,"\n\rKafea 0,80 Euro");//BT bidez ondorengo mezua agertzen da
break;
case 8:
fprintf(bt,"\n\rZerealak 0,60 Euro");//BT bidez ondorengo mezua agertzen da
break;
case 9:
fprintf(bt,"\n\rKrema 4,60 Euro");//BT bidez ondorengo mezua agertzen da
break;
case 10:
fprintf(bt,"\n\rKamamila 1,35 Euro");//BT bidez ondorengo mezua agertzen da
break;
case 11:
fprintf(bt,"\n\rZapiak 0,25 Euro");//BT bidez ondorengo mezua agertzen da
break;
case 12:
fprintf(bt,"\n\rPoxpoloak 0,45 Euro");//BT bidez ondorengo mezua agertzen da
break;
case 13:
fprintf(bt,"\n\rAvecrem 0,39 Euro");//BT bidez ondorengo mezua agertzen da
break;
case 14:
fprintf(bt,"\n\rAntxoak 0,75 Euro");//BT bidez ondorengo mezua agertzen da
break;
}
}
fprintf(bt,"\n\rGUZTIRA %4.2f Euro",totala);//BT bidez ondorengo mezua agertzen da
for(a=0;a<0xff;a++)//0 posiziotik ff posiziora inkrementatuaz doa
write_eeprom(a,0xff);// a posizioan ff idazten du
}
/***************************************************************************************
MAIN FUNTZIOA:
Funtzio hau programako funtzio nagusia da eta hemendik besteetara joaten
da eragiketak eta identifikazioak egiteko.
****************************************************************************************/
void main (void)
{
int const caracter0_direccion[8]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};
int const caracter0_datos[8]={0b00111,0b01000,0b11100,0b01000,0b11100,0b01000,0b00111,0b0};
enable_interrupts(INT_EXT);
EXT_INT_EDGE(H_TO_L);
enable_interrupts(GLOBAL);
set_tris_a(0x00); // Sarrera eta irteerak konfiguratu.
output_high(PIN_A1);//Irakurgailuaren Enable pina desaktibatu.
lcd_init(); //LCD martxan jarri.
lcd_send_byte(0,0b00001100);
for(contador=0;contador<8;contador++)// contador 0tik 8ra inkrementatzen du
{
lcd_send_byte(0,caracter0_direccion[contador]); //modo comando
lcd_send_byte(1,caracter0_datos[contador]); // modo dato
}
lcd_gotoxy(1,1);//LCDaren 1,1 posiziora doa
tag_izena=0xff;// tag_izenean ff idazten du
memoria_borratu();//memoria borratu funtziora salto egiten du
while(1)
{
do{
printf(lcd_putc,"\fUnai Alvarez\nJulen Otegi");//LCDan ondorengo mezua agertzen da
delay_ms(1500);// segundu eta erdi itxaron
printf(lcd_putc,"\fDonBosco\n2011-2012");//LCDan ondorengo mezua agertzen da
delay_ms(1500);// segundu eta erdi itxaron
printf(lcd_putc,"\fPasa llaberoa\nMesedez.");//LCDan ondorengo mezua agertzen da
tag_izena = konpara_tag();
totala=0; //Erreseteatzeko, pasatutako produktuen batura eliminatu behar da.
} while((tag_izena!=0)&&(tag_izena!=1)&&(tag_izena!=2)&&(tag_izena!=3)&&(tag_izena!=4)); //Produktua llaberoa baino lehenago pasatzean hemen geratzen da.
izendatu_ilerak(tag_izena);//izendatu_ilera funtzioari tag_izena pasatzen dio
delay_ms(1500);// segundu eta erdi itxaron
printf(lcd_putc,"\f Has zaitezke");//LCDan ondorengo mezua agertzen da
printf(lcd_putc,"\n erosketarekin");//LCDan ondorengo mezua agertzen da
helbide=1;// helbide berdin 1 egiten du
while(1)
{
if(bukatu==0)
{
printf(lcd_putc,"\fEskerrik asko");//LCDan ondorengo mezua agertzen da
printf(lcd_putc,"\nGUZTIRA %4.2f",totala);//LCDan ondorengo mezua agertzen da
lcd_send_byte(0,0x0f);
lcd_send_byte(1,0); //modo dato
while(bukatu==0); //Itxaron askatu arte
delay_ms(3000);// 3 seg itxaron
printf(lcd_putc,"\fPasa kaxatik");//LCDan ondorengo mezua agertzen da
printf(lcd_putc,"\nGUZTIRA %4.2f",totala);//LCDan ondorengo mezua agertzen da
lcd_send_byte(0,0x0f);
lcd_send_byte(1,0); //modo dato
delay_ms(2000);//2 seg itxaron
bidali_datuak();//bidali datuak programara salto egin
delay_ms(5000);//5 seg itxaton
do{
printf(lcd_putc,"\fPasa llaberoa");//LCDan ondorengo mezua agertzen da
tag_izena = konpara_tag();//konpara_tag-etik lortzen dena tag_izenean gordetzen da
totala=0; //Erreseteatzeko, pasatutako produktuen batura eliminatu behar da.
} while((tag_izena!=0)&&(tag_izena!=1)&&(tag_izena!=2)&&(tag_izena!=3)&&(tag_izena!=4)); //Produktua llaberoa baino lehenago pasatzean hemen geratzen da.
izendatu_ilerak(tag_izena);//izendatu_ilerak funtziora tag_izena bidaltzen du
delay_ms(1500);//segundu eta erdi itxaron
printf(lcd_putc,"\f Has zaitezke");//LCDan ondorengo mezua agertzen da
printf(lcd_putc,"\n erosketarekin");//LCDan ondorengo mezua agertzen da
}
else if(kendu==0)
{
kendu_funtzioa();//kendu funtzioari deitzen dio
while(kendu==0);//Itxaron askatu arte
delay_ms(20);//Erreboteak ekiditzeko
}
else if(gehitu==0)
{
lcd_gotoxy(1,1);// LCDko puntu horretara bidaltzen du
printf(lcd_putc,"Pasa produktuak ");//Produktuak pasatzeko eskatu du
printf(lcd_putc,"\nGUZTIRA %4.2f",totala);//Bigarren ileran
lcd_send_byte(0,0x0f);
lcd_send_byte(1,0); //modo dato
produktua_gehitu();//produktua gehitu funtziora salto egiten du
while(gehitu==0); //Itxaron askatu arte
delay_ms(20); //Erreboteak ekiditzeko
write_eeprom(helbide,tag_izena);//tag_izena idazten du helbidean
helbide++;//helbidea inkrementatzeko
}
}
}
}
No hay comentarios:
Publicar un comentario