A simple digital lock with attempted audio guidance
Dependencies: FATFileSystem TextLCD mbed
Fork of Digital_Lock_with_audio by
main.cpp
- Committer:
- kit2
- Date:
- 2013-04-23
- Revision:
- 1:85eb1c94154a
- Parent:
- 0:e09703934ff4
- Child:
- 2:9bdba6204bb4
File content as of revision 1:85eb1c94154a:
#include "mbed.h" #include "SDFileSystem.h" #include <string> #include <list> #include <mpr121.h> #include "TextLCD.h" #include <stdio.h> #include <stdlib.h> #include <sstream> #include <iostream> //------------------------------------------------------------------initialize lcd TextLCD lcd(p24, p25, p27, p28, p29, p30); // rs, e, d4-d7 //-------------------------------------------------------------------- //------------------------------------------------------------------initial touch pannel DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); DigitalOut servo(p12); int org[7] = {0,0,0,0,0,0,0}; int Nums[7] = {0,0,0,0,0,0,0}; int counter = 0; int count2 = 0; //------------------------------------------- Create the interrupt receiver object on pin 26 InterruptIn interrupt(p26); //-------------------------------------------------------- Setup the i2c bus on pins 28 and 27 I2C i2c(p9, p10); //------------------------------------------ constructor(i2c object, i2c address of the mpr121) Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); //-------------------------------------------------------------------touch panel initialised //---------------------------------------------------------------------------------------------playing audio AnalogOut DACout(p18); DigitalOut digout(LED4); Ticker tick; SDFileSystem sd(p5, p6, p7, p8, "sd"); // NGX mbed base board #define SAMPLE_FREQ 40000 #define BUF_SIZE (SAMPLE_FREQ/10) #define SLICE_BUF_SIZE 1 void dac_out(void); void play_wave(char *); void cleanup(char *); void fill_adc_buf(short *, unsigned); void swapword(unsigned *); // a FIFO for the DAC short DAC_fifo[256]; short DAC_wptr; short DAC_rptr; short DAC_on; typedef struct uFMT_STRUCT { short comp_code; short num_channels; unsigned sample_rate; unsigned avg_Bps; short block_align; short sig_bps; } FMT_STRUCT; void play_wave(char *wavname) { unsigned chunk_id,chunk_size,channel; // unsigned *data_wptr,data,samp_int,i; unsigned data,samp_int,i; short dac_data; char *slice_buf; short *data_sptr; // char *data_bptr; FMT_STRUCT wav_format; FILE *wavfile; long slice,num_slices; DAC_wptr=0; DAC_rptr=0; for (i=0;i<256;i+=2) { DAC_fifo[i]=0; DAC_fifo[i+1]=3000; } DAC_wptr=4; DAC_on=0; led1=led2=led3=led4=0; wavfile=fopen(wavname,"rb"); if (!wavfile) { printf("Unable to open wav file '%s'\n",wavname); exit(1); } fread(&chunk_id,4,1,wavfile); fread(&chunk_size,4,1,wavfile); while (!feof(wavfile)) { switch (chunk_id) { case 0x46464952: fread(&data,4,1,wavfile); break; case 0x20746d66: fread(&wav_format,sizeof(wav_format),1,wavfile); if (chunk_size > sizeof(wav_format)) fseek(wavfile,chunk_size-sizeof(wav_format),SEEK_CUR); // create a slice buffer large enough to hold multiple slices slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE); if (!slice_buf) { exit(1); } break; case 0x61746164: slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE); if (!slice_buf) { exit(1); } num_slices=chunk_size/wav_format.block_align; samp_int=1000000/(wav_format.sample_rate); // starting up ticker to write samples out -- no printfs until tick.detach is called tick.attach_us(&dac_out, samp_int); DAC_on=1; led2=1; for (slice=0;slice<num_slices;slice+=SLICE_BUF_SIZE) { fread(slice_buf,wav_format.block_align*SLICE_BUF_SIZE,1,wavfile); if (feof(wavfile)) { exit(1); } data_sptr=(short *)slice_buf; for (i=0;i<SLICE_BUF_SIZE;i++) { dac_data=0; // for a stereo wave file average the two channels. for (channel=0;channel<wav_format.num_channels;channel++) { switch (wav_format.sig_bps) { case 16: dac_data+=( ((int)(*data_sptr++)) +32768)>>5; break; } } dac_data>>=1; DAC_fifo[DAC_wptr]=dac_data; DAC_wptr=(DAC_wptr+1) & 0xff; while (DAC_wptr==DAC_rptr) { led1=1; } led1=0; } } DAC_on=0; led2=0; tick.detach(); led3=1; free(slice_buf); break; case 0x5453494c: fseek(wavfile,chunk_size,SEEK_CUR); break; default: data=fseek(wavfile,chunk_size,SEEK_CUR); break; } fread(&chunk_id,4,1,wavfile); fread(&chunk_size,4,1,wavfile); } fclose(wavfile); led1=0; } void dac_out() { if (DAC_on) { digout=1; DACout.write_u16(DAC_fifo[DAC_rptr]); DAC_rptr=(DAC_rptr+1) & 0xff; digout=0; } } //--------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------obtaining input void fallInterrupt() { int key_code=0; int i=0; int value=mpr121.read(0x00); value +=mpr121.read(0x01)<<8; i=0; // puts key number out to LEDs for demo for (i=0; i<12; i++) { if (((value>>i)&0x01)==1) { key_code=i; lcd.printf("%d", i); if(counter < 7) { Nums[counter] = i; counter++; } } } led4=key_code & 0x01; led3=(key_code>>1) & 0x01; led2=(key_code>>2) & 0x01; led1=(key_code>>3) & 0x01; } //------------------------------------------------------------------------------MAIN int main() { //------------------------------------------------to start enter new password which user wants to set lcd.cls(); lcd.printf("enter your new password\n"); play_wave("/sd/forest.wav"); wait(0.5); int k; //----------------------------------------------enter password while(1) { interrupt.fall(&fallInterrupt); interrupt.mode(PullUp); if(counter==7){ break;} } for (k=0; k<7; k++) { org[k]=Nums[k]; } wait(1); AGAIN: lcd.cls(); lcd.printf("1-open door\n2-reset password"); play_wave("/sd/forest.wav"); interrupt.fall(&fallInterrupt); interrupt.mode(PullUp); while (1) { counter=0; if(Nums[0]==1) { lcd.cls(); //---------------------------------------------------enter the password lcd.printf("enter your password\n"); play_wave("/sd/forest.wav"); wait(1); while(1) { interrupt.fall(&fallInterrupt); interrupt.mode(PullUp); if(counter==7){break;} } if(counter == 7) { wait(1); //lcd.printf("%d",Nums[4]); for(k=0;k<7;k++) { lcd.printf("%d",Nums[k]); wait(1); } if((Nums[0] == org[0]) && (Nums[1] == org[1]) && (Nums[2] == org[2])&&(Nums[3] == org[3]) && (Nums[4] == org[4]) &&(Nums[5] == org[5])&& (Nums[6] == org[6])) { lcd.cls(); lcd.printf("password is correct, door open\n"); servo=1; wait(1); lcd.cls(); lcd.printf("opening door...\n"); // play_wave("/sd/forest.wav"); wait(10); goto AGAIN; } else { lcd.cls(); lcd.printf("password incorrect.retry\n"); play_wave("/sd/forest.wav"); goto AGAIN; } } } wait(1); if(Nums[0]==2) { wait(1); counter=0; lcd.cls(); lcd.printf("enter your old password\n"); play_wave("/sd/forest.wav"); while(1) { interrupt.fall(&fallInterrupt); interrupt.mode(PullUp); if(counter==7){break;} } if(counter == 7) { if((Nums[0] == org[0]) && (Nums[1] == org[1]) && (Nums[2] == org[2])&&(Nums[3] == org[3]) && (Nums[4] == org[4]) &&(Nums[5] == org[5])&& (Nums[6] == org[6])) { counter=0; lcd.cls(); lcd.printf("enter your new password"); play_wave("/sd/forest.wav"); while(1) { interrupt.fall(&fallInterrupt); interrupt.mode(PullUp); if(counter==7){break;} } for (k=0; k<7; k++) { org[k]=Nums[k]; } lcd.cls(); lcd.printf("password changed"); play_wave("/sd/forest.wav"); goto AGAIN; } else { lcd.cls(); lcd.printf("password incorrect.retry\n"); play_wave("/sd/forest.wav"); goto AGAIN; } } } } }