A simple digital lock with attempted audio guidance
Dependencies: FATFileSystem TextLCD mbed
Fork of Digital_Lock_with_audio by
Diff: main.cpp
- Revision:
- 1:85eb1c94154a
- Parent:
- 0:e09703934ff4
- Child:
- 2:9bdba6204bb4
--- a/main.cpp Wed Mar 16 01:49:13 2011 +0000 +++ b/main.cpp Tue Apr 23 12:49:09 2013 +0000 @@ -1,125 +1,365 @@ -/* -Copyright (c) 2011 Anthony Buckton (abuckton [at] blackink [dot} net {dot} au) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#include <mbed.h> +#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> -#include <mpr121.h> + +//------------------------------------------------------------------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); - -// Create the interrupt receiver object on pin 26 +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 Serial to the PC for debugging -Serial pc(USBTX, USBRX); +//-------------------------------------------------------- Setup the i2c bus on pins 28 and 27 +I2C i2c(p9, p10); + -// Setup the i2c bus on pins 28 and 27 -I2C i2c(p9, p10); - -// Setup the Mpr121: -// constructor(i2c object, i2c address of the mpr121) +//------------------------------------------ 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 key_code=0; int i=0; int value=mpr121.read(0x00); value +=mpr121.read(0x01)<<8; - // LED demo mod by J. Hamblen - //pc.printf("MPR value: %x \r\n", value); + i=0; // puts key number out to LEDs for demo - for (i=0; i<12; i++) { - if (((value>>i)&0x01)==1) key_code=i+1; + 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; } -int main() { - - pc.printf("\nHello from the mbed & mpr121\n\r"); + - unsigned char dataArray[2]; - int key; - int count = 0; +//------------------------------------------------------------------------------MAIN - pc.printf("Test 1: read a value: \r\n"); - dataArray[0] = mpr121.read(AFE_CFG); - pc.printf("Read value=%x\r\n\n",dataArray[0]); - pc.printf("Test 2: read a value: \r\n"); - dataArray[0] = mpr121.read(0x5d); - pc.printf("Read value=%x\r\n\n",dataArray[0]); +int main() +{ - pc.printf("Test 3: write & read a value: \r\n"); - mpr121.read(ELE0_T); - mpr121.write(ELE0_T,0x22); - dataArray[0] = mpr121.read(ELE0_T); - pc.printf("Read value=%x\r\n\n",dataArray[0]); - - pc.printf("Test 4: Write many values: \r\n"); - unsigned char data[] = {0x1,0x3,0x5,0x9,0x15,0x25,0x41}; - mpr121.writeMany(0x42,data,7); +//------------------------------------------------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); - // Now read them back .. - key = 0x42; - count = 0; - while (count < 7) { - char result = mpr121.read(key); - key++; - count++; - pc.printf("Read value: '%x'=%x\n\r",key,result); + int k; + //----------------------------------------------enter password + while(1) + { + interrupt.fall(&fallInterrupt); + interrupt.mode(PullUp); + if(counter==7){ + break;} } - - pc.printf("Test 5: Read Electrodes:\r\n"); - key = ELE0_T; - count = 0; - while (count < 24) { - char result = mpr121.read(key); - pc.printf("Read key:%x value:%x\n\r",key,result); - key++; - count++; - } - pc.printf("--------- \r\n\n"); - - // mpr121.setProximityMode(true); - - pc.printf("ELE_CFG=%x", mpr121.read(ELE_CFG)); - + + + 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) { - wait(5); - pc.printf("."); - } + + 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; + } + } } - - - +} +}