A simple digital lock with attempted audio guidance
Dependencies: FATFileSystem TextLCD mbed
Fork of Digital_Lock_with_audio by
main.cpp@4:74d697416c75, 2013-05-12 (annotated)
- Committer:
- kit2
- Date:
- Sun May 12 09:04:10 2013 +0000
- Revision:
- 4:74d697416c75
- Parent:
- 2:9bdba6204bb4
- Child:
- 5:d45608f231d3
with_LCD_display
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kit2 | 2:9bdba6204bb4 | 1 | /* Digital Lock System |
kit2 | 2:9bdba6204bb4 | 2 | Components Used: |
kit2 | 2:9bdba6204bb4 | 3 | NGX Baseboord |
kit2 | 2:9bdba6204bb4 | 4 | MPR121 Capacitive touch panel as keypad( p26, p9, p10)// IRQ, SDA, SCL |
kit2 | 2:9bdba6204bb4 | 5 | LCD for display(p24, p25, p27, p28, p29, p30) // rs, e, d4-d7 |
kit2 | 2:9bdba6204bb4 | 6 | Motor for opening/closing the lock(p11, p12) // for input in H Bridge |
kit2 | 2:9bdba6204bb4 | 7 | Baseboard SD Card for storing Forest.wav |
kit2 | 2:9bdba6204bb4 | 8 | Baseboard audio jack 3.5 mm |
4180_1 | 0:e09703934ff4 | 9 | |
kit2 | 2:9bdba6204bb4 | 10 | By using touch panel as input we enter the desired password to open the lock. |
kit2 | 2:9bdba6204bb4 | 11 | Initially we store a password in array ORG[] which can be compared with the password(length= 7)entered by the user. |
kit2 | 2:9bdba6204bb4 | 12 | |
kit2 | 2:9bdba6204bb4 | 13 | If the entered password is correct then motor opens the door. |
kit2 | 2:9bdba6204bb4 | 14 | In case of wrong password the user is asked to re-enter the password. 3 trials are given after which door is permanently |
kit2 | 2:9bdba6204bb4 | 15 | locked. |
kit2 | 2:9bdba6204bb4 | 16 | Option to change the password is also provided. |
kit2 | 2:9bdba6204bb4 | 17 | The process is guided by display of instruction on the LCD. |
kit2 | 2:9bdba6204bb4 | 18 | |
kit2 | 2:9bdba6204bb4 | 19 | |
kit2 | 2:9bdba6204bb4 | 20 | Under Progress: |
kit2 | 2:9bdba6204bb4 | 21 | An attempt is being made to guide the user by playing relavent audio files along with the instructions on LCD. |
kit2 | 2:9bdba6204bb4 | 22 | The "forest.wav" file is the one that we are attempting to play along with LCD instructions. |
kit2 | 2:9bdba6204bb4 | 23 | the bit rate of the wave file is 176kbps. |
kit2 | 2:9bdba6204bb4 | 24 | */ |
kit2 | 1:85eb1c94154a | 25 | |
4180_1 | 0:e09703934ff4 | 26 | |
4180_1 | 0:e09703934ff4 | 27 | |
kit2 | 1:85eb1c94154a | 28 | #include "mbed.h" |
kit2 | 1:85eb1c94154a | 29 | #include "SDFileSystem.h" |
4180_1 | 0:e09703934ff4 | 30 | #include <string> |
4180_1 | 0:e09703934ff4 | 31 | #include <list> |
kit2 | 1:85eb1c94154a | 32 | #include <mpr121.h> |
kit2 | 1:85eb1c94154a | 33 | #include "TextLCD.h" |
kit2 | 1:85eb1c94154a | 34 | #include <stdio.h> |
kit2 | 1:85eb1c94154a | 35 | #include <stdlib.h> |
kit2 | 1:85eb1c94154a | 36 | #include <sstream> |
kit2 | 1:85eb1c94154a | 37 | #include <iostream> |
4180_1 | 0:e09703934ff4 | 38 | |
kit2 | 1:85eb1c94154a | 39 | |
kit2 | 1:85eb1c94154a | 40 | //------------------------------------------------------------------initialize lcd |
4180_1 | 0:e09703934ff4 | 41 | |
kit2 | 1:85eb1c94154a | 42 | TextLCD lcd(p24, p25, p27, p28, p29, p30); // rs, e, d4-d7 |
kit2 | 1:85eb1c94154a | 43 | //-------------------------------------------------------------------- |
kit2 | 1:85eb1c94154a | 44 | |
kit2 | 1:85eb1c94154a | 45 | //------------------------------------------------------------------initial touch pannel |
4180_1 | 0:e09703934ff4 | 46 | DigitalOut led1(LED1); |
4180_1 | 0:e09703934ff4 | 47 | DigitalOut led2(LED2); |
4180_1 | 0:e09703934ff4 | 48 | DigitalOut led3(LED3); |
4180_1 | 0:e09703934ff4 | 49 | DigitalOut led4(LED4); |
kit2 | 1:85eb1c94154a | 50 | DigitalOut servo(p12); |
kit2 | 1:85eb1c94154a | 51 | int org[7] = {0,0,0,0,0,0,0}; |
kit2 | 1:85eb1c94154a | 52 | int Nums[7] = {0,0,0,0,0,0,0}; |
kit2 | 1:85eb1c94154a | 53 | int counter = 0; |
kit2 | 1:85eb1c94154a | 54 | int count2 = 0; |
kit2 | 2:9bdba6204bb4 | 55 | int k=0; |
kit2 | 2:9bdba6204bb4 | 56 | DigitalOut myled(p11); |
kit2 | 2:9bdba6204bb4 | 57 | DigitalOut myled1(p12); |
kit2 | 1:85eb1c94154a | 58 | //------------------------------------------- Create the interrupt receiver object on pin 26 |
4180_1 | 0:e09703934ff4 | 59 | InterruptIn interrupt(p26); |
kit2 | 1:85eb1c94154a | 60 | |
4180_1 | 0:e09703934ff4 | 61 | |
kit2 | 1:85eb1c94154a | 62 | //-------------------------------------------------------- Setup the i2c bus on pins 28 and 27 |
kit2 | 1:85eb1c94154a | 63 | I2C i2c(p9, p10); |
kit2 | 1:85eb1c94154a | 64 | |
4180_1 | 0:e09703934ff4 | 65 | |
kit2 | 1:85eb1c94154a | 66 | //------------------------------------------ constructor(i2c object, i2c address of the mpr121) |
4180_1 | 0:e09703934ff4 | 67 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); |
4180_1 | 0:e09703934ff4 | 68 | |
kit2 | 1:85eb1c94154a | 69 | //-------------------------------------------------------------------touch panel initialised |
kit2 | 1:85eb1c94154a | 70 | |
kit2 | 1:85eb1c94154a | 71 | |
kit2 | 1:85eb1c94154a | 72 | |
kit2 | 1:85eb1c94154a | 73 | //---------------------------------------------------------------------------------------------playing audio |
kit2 | 1:85eb1c94154a | 74 | AnalogOut DACout(p18); |
kit2 | 1:85eb1c94154a | 75 | DigitalOut digout(LED4); |
kit2 | 1:85eb1c94154a | 76 | Ticker tick; |
kit2 | 1:85eb1c94154a | 77 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // NGX mbed base board |
kit2 | 1:85eb1c94154a | 78 | |
kit2 | 1:85eb1c94154a | 79 | #define SAMPLE_FREQ 40000 |
kit2 | 1:85eb1c94154a | 80 | #define BUF_SIZE (SAMPLE_FREQ/10) |
kit2 | 1:85eb1c94154a | 81 | #define SLICE_BUF_SIZE 1 |
kit2 | 1:85eb1c94154a | 82 | |
kit2 | 1:85eb1c94154a | 83 | void dac_out(void); |
kit2 | 1:85eb1c94154a | 84 | void play_wave(char *); |
kit2 | 1:85eb1c94154a | 85 | void cleanup(char *); |
kit2 | 1:85eb1c94154a | 86 | void fill_adc_buf(short *, unsigned); |
kit2 | 1:85eb1c94154a | 87 | void swapword(unsigned *); |
kit2 | 1:85eb1c94154a | 88 | |
kit2 | 1:85eb1c94154a | 89 | // a FIFO for the DAC |
kit2 | 1:85eb1c94154a | 90 | short DAC_fifo[256]; |
kit2 | 1:85eb1c94154a | 91 | short DAC_wptr; |
kit2 | 1:85eb1c94154a | 92 | short DAC_rptr; |
kit2 | 1:85eb1c94154a | 93 | short DAC_on; |
kit2 | 1:85eb1c94154a | 94 | |
kit2 | 1:85eb1c94154a | 95 | typedef struct uFMT_STRUCT { |
kit2 | 1:85eb1c94154a | 96 | short comp_code; |
kit2 | 1:85eb1c94154a | 97 | short num_channels; |
kit2 | 1:85eb1c94154a | 98 | unsigned sample_rate; |
kit2 | 1:85eb1c94154a | 99 | unsigned avg_Bps; |
kit2 | 1:85eb1c94154a | 100 | short block_align; |
kit2 | 1:85eb1c94154a | 101 | short sig_bps; |
kit2 | 1:85eb1c94154a | 102 | } FMT_STRUCT; |
kit2 | 4:74d697416c75 | 103 | |
kit2 | 4:74d697416c75 | 104 | |
kit2 | 4:74d697416c75 | 105 | |
kit2 | 1:85eb1c94154a | 106 | void play_wave(char *wavname) |
kit2 | 1:85eb1c94154a | 107 | { |
kit2 | 1:85eb1c94154a | 108 | unsigned chunk_id,chunk_size,channel; |
kit2 | 1:85eb1c94154a | 109 | // unsigned *data_wptr,data,samp_int,i; |
kit2 | 1:85eb1c94154a | 110 | unsigned data,samp_int,i; |
kit2 | 1:85eb1c94154a | 111 | short dac_data; |
kit2 | 1:85eb1c94154a | 112 | char *slice_buf; |
kit2 | 1:85eb1c94154a | 113 | short *data_sptr; |
kit2 | 1:85eb1c94154a | 114 | // char *data_bptr; |
kit2 | 1:85eb1c94154a | 115 | FMT_STRUCT wav_format; |
kit2 | 1:85eb1c94154a | 116 | FILE *wavfile; |
kit2 | 1:85eb1c94154a | 117 | long slice,num_slices; |
kit2 | 1:85eb1c94154a | 118 | DAC_wptr=0; |
kit2 | 1:85eb1c94154a | 119 | DAC_rptr=0; |
kit2 | 1:85eb1c94154a | 120 | for (i=0;i<256;i+=2) |
kit2 | 1:85eb1c94154a | 121 | { |
kit2 | 1:85eb1c94154a | 122 | DAC_fifo[i]=0; |
kit2 | 1:85eb1c94154a | 123 | DAC_fifo[i+1]=3000; |
kit2 | 1:85eb1c94154a | 124 | } |
kit2 | 1:85eb1c94154a | 125 | DAC_wptr=4; |
kit2 | 1:85eb1c94154a | 126 | DAC_on=0; |
kit2 | 1:85eb1c94154a | 127 | |
kit2 | 1:85eb1c94154a | 128 | led1=led2=led3=led4=0; |
kit2 | 4:74d697416c75 | 129 | lcd.cls(); |
kit2 | 4:74d697416c75 | 130 | lcd.printf("Playing wave file '%s'\n",wavname); |
kit2 | 1:85eb1c94154a | 131 | |
kit2 | 1:85eb1c94154a | 132 | wavfile=fopen(wavname,"rb"); |
kit2 | 1:85eb1c94154a | 133 | if (!wavfile) { |
kit2 | 4:74d697416c75 | 134 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 135 | printf("Unable to open wav file '%s'\n",wavname); |
kit2 | 1:85eb1c94154a | 136 | exit(1); |
kit2 | 1:85eb1c94154a | 137 | } |
kit2 | 1:85eb1c94154a | 138 | |
kit2 | 1:85eb1c94154a | 139 | fread(&chunk_id,4,1,wavfile); |
kit2 | 1:85eb1c94154a | 140 | fread(&chunk_size,4,1,wavfile); |
kit2 | 1:85eb1c94154a | 141 | while (!feof(wavfile)) { |
kit2 | 4:74d697416c75 | 142 | |
kit2 | 4:74d697416c75 | 143 | |
kit2 | 4:74d697416c75 | 144 | lcd.cls(); |
kit2 | 4:74d697416c75 | 145 | lcd.printf("Read chunk ID 0x%x, size 0x%x\n",chunk_id,chunk_size); |
kit2 | 1:85eb1c94154a | 146 | switch (chunk_id) { |
kit2 | 1:85eb1c94154a | 147 | case 0x46464952: |
kit2 | 1:85eb1c94154a | 148 | fread(&data,4,1,wavfile); |
kit2 | 4:74d697416c75 | 149 | lcd.cls(); |
kit2 | 4:74d697416c75 | 150 | lcd.printf("RIFF chunk\n"); |
kit2 | 4:74d697416c75 | 151 | wait(1); |
kit2 | 4:74d697416c75 | 152 | lcd.cls(); |
kit2 | 4:74d697416c75 | 153 | lcd.printf(" chunk size %d (0x%x)\n",chunk_size,chunk_size); |
kit2 | 4:74d697416c75 | 154 | lcd.cls(); |
kit2 | 4:74d697416c75 | 155 | lcd.printf(" RIFF type 0x%x\n",data); |
kit2 | 1:85eb1c94154a | 156 | break; |
kit2 | 1:85eb1c94154a | 157 | case 0x20746d66: |
kit2 | 1:85eb1c94154a | 158 | fread(&wav_format,sizeof(wav_format),1,wavfile); |
kit2 | 4:74d697416c75 | 159 | lcd.cls(); |
kit2 | 4:74d697416c75 | 160 | lcd.printf("FORMAT chunk\n"); |
kit2 | 4:74d697416c75 | 161 | wait(1); |
kit2 | 4:74d697416c75 | 162 | lcd.cls(); |
kit2 | 4:74d697416c75 | 163 | lcd.printf(" chunk size %d (0x%x)\n",chunk_size,chunk_size); |
kit2 | 4:74d697416c75 | 164 | wait(1); |
kit2 | 4:74d697416c75 | 165 | lcd.cls(); |
kit2 | 4:74d697416c75 | 166 | lcd.printf(" compression code %d\n",wav_format.comp_code); |
kit2 | 4:74d697416c75 | 167 | wait(1); |
kit2 | 4:74d697416c75 | 168 | lcd.cls(); |
kit2 | 4:74d697416c75 | 169 | lcd.printf(" %d channels\n",wav_format.num_channels); |
kit2 | 4:74d697416c75 | 170 | wait(1); |
kit2 | 4:74d697416c75 | 171 | lcd.cls(); |
kit2 | 4:74d697416c75 | 172 | lcd.printf(" %d samples/sec\n",wav_format.sample_rate); |
kit2 | 4:74d697416c75 | 173 | wait(1); |
kit2 | 4:74d697416c75 | 174 | lcd.cls(); |
kit2 | 4:74d697416c75 | 175 | lcd.printf(" %d bytes/sec\n",wav_format.avg_Bps); |
kit2 | 4:74d697416c75 | 176 | wait(1); |
kit2 | 4:74d697416c75 | 177 | lcd.cls(); |
kit2 | 4:74d697416c75 | 178 | lcd.printf(" block align %d\n",wav_format.block_align); |
kit2 | 4:74d697416c75 | 179 | wait(1); |
kit2 | 4:74d697416c75 | 180 | lcd.cls(); |
kit2 | 4:74d697416c75 | 181 | lcd.printf(" %d bits per sample\n",wav_format.sig_bps); |
kit2 | 1:85eb1c94154a | 182 | if (chunk_size > sizeof(wav_format)) |
kit2 | 1:85eb1c94154a | 183 | fseek(wavfile,chunk_size-sizeof(wav_format),SEEK_CUR); |
kit2 | 1:85eb1c94154a | 184 | // create a slice buffer large enough to hold multiple slices |
kit2 | 1:85eb1c94154a | 185 | slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE); |
kit2 | 1:85eb1c94154a | 186 | if (!slice_buf) { |
kit2 | 4:74d697416c75 | 187 | lcd.cls(); |
kit2 | 4:74d697416c75 | 188 | lcd.printf("Unable to malloc slice buffer"); |
kit2 | 1:85eb1c94154a | 189 | exit(1); |
kit2 | 1:85eb1c94154a | 190 | } |
kit2 | 1:85eb1c94154a | 191 | break; |
kit2 | 1:85eb1c94154a | 192 | case 0x61746164: |
kit2 | 1:85eb1c94154a | 193 | slice_buf=(char *)malloc(wav_format.block_align*SLICE_BUF_SIZE); |
kit2 | 1:85eb1c94154a | 194 | if (!slice_buf) { |
kit2 | 4:74d697416c75 | 195 | lcd.cls(); |
kit2 | 4:74d697416c75 | 196 | lcd.printf("Unable to malloc slice buffer"); |
kit2 | 1:85eb1c94154a | 197 | exit(1); |
kit2 | 1:85eb1c94154a | 198 | } num_slices=chunk_size/wav_format.block_align; |
kit2 | 4:74d697416c75 | 199 | lcd.cls(); |
kit2 | 4:74d697416c75 | 200 | lcd.printf("DATA chunk\n"); |
kit2 | 4:74d697416c75 | 201 | lcd.cls(); |
kit2 | 4:74d697416c75 | 202 | lcd.printf(" chunk size %d (0x%x)\n",chunk_size,chunk_size); |
kit2 | 4:74d697416c75 | 203 | lcd.cls(); |
kit2 | 4:74d697416c75 | 204 | lcd.printf(" %d slices\n",num_slices); |
kit2 | 4:74d697416c75 | 205 | lcd.cls(); |
kit2 | 4:74d697416c75 | 206 | lcd.printf(" Ideal sample interval=%d\n",(unsigned)(1000000.0/wav_format.sample_rate)); |
kit2 | 1:85eb1c94154a | 207 | samp_int=1000000/(wav_format.sample_rate); |
kit2 | 4:74d697416c75 | 208 | lcd.cls(); |
kit2 | 4:74d697416c75 | 209 | lcd.printf(" programmed interrupt tick interval=%d\n",samp_int); |
kit2 | 1:85eb1c94154a | 210 | // starting up ticker to write samples out -- no printfs until tick.detach is called |
kit2 | 1:85eb1c94154a | 211 | tick.attach_us(&dac_out, samp_int); |
kit2 | 1:85eb1c94154a | 212 | DAC_on=1; |
kit2 | 1:85eb1c94154a | 213 | led2=1; |
kit2 | 1:85eb1c94154a | 214 | for (slice=0;slice<num_slices;slice+=SLICE_BUF_SIZE) { |
kit2 | 1:85eb1c94154a | 215 | fread(slice_buf,wav_format.block_align*SLICE_BUF_SIZE,1,wavfile); |
kit2 | 1:85eb1c94154a | 216 | if (feof(wavfile)) { |
kit2 | 4:74d697416c75 | 217 | lcd.cls(); |
kit2 | 4:74d697416c75 | 218 | lcd.printf("Oops -- not enough slices in the wave file\n"); |
kit2 | 1:85eb1c94154a | 219 | exit(1); |
kit2 | 1:85eb1c94154a | 220 | } |
kit2 | 1:85eb1c94154a | 221 | data_sptr=(short *)slice_buf; |
kit2 | 1:85eb1c94154a | 222 | for (i=0;i<SLICE_BUF_SIZE;i++) { |
kit2 | 1:85eb1c94154a | 223 | dac_data=0; |
kit2 | 1:85eb1c94154a | 224 | |
kit2 | 1:85eb1c94154a | 225 | // for a stereo wave file average the two channels. |
kit2 | 1:85eb1c94154a | 226 | for (channel=0;channel<wav_format.num_channels;channel++) { |
kit2 | 1:85eb1c94154a | 227 | switch (wav_format.sig_bps) { |
kit2 | 1:85eb1c94154a | 228 | case 16: |
kit2 | 1:85eb1c94154a | 229 | dac_data+=( ((int)(*data_sptr++)) +32768)>>5; |
kit2 | 1:85eb1c94154a | 230 | break; |
kit2 | 1:85eb1c94154a | 231 | } |
kit2 | 1:85eb1c94154a | 232 | } |
kit2 | 1:85eb1c94154a | 233 | dac_data>>=1; |
kit2 | 1:85eb1c94154a | 234 | DAC_fifo[DAC_wptr]=dac_data; |
kit2 | 1:85eb1c94154a | 235 | DAC_wptr=(DAC_wptr+1) & 0xff; |
kit2 | 1:85eb1c94154a | 236 | while (DAC_wptr==DAC_rptr) { |
kit2 | 1:85eb1c94154a | 237 | led1=1; |
kit2 | 1:85eb1c94154a | 238 | } |
kit2 | 1:85eb1c94154a | 239 | led1=0; |
kit2 | 1:85eb1c94154a | 240 | } |
kit2 | 1:85eb1c94154a | 241 | } |
kit2 | 1:85eb1c94154a | 242 | DAC_on=0; |
kit2 | 1:85eb1c94154a | 243 | led2=0; |
kit2 | 1:85eb1c94154a | 244 | tick.detach(); |
kit2 | 4:74d697416c75 | 245 | lcd.cls(); |
kit2 | 4:74d697416c75 | 246 | lcd.printf("Ticker detached\n"); |
kit2 | 1:85eb1c94154a | 247 | led3=1; |
kit2 | 1:85eb1c94154a | 248 | free(slice_buf); |
kit2 | 1:85eb1c94154a | 249 | break; |
kit2 | 1:85eb1c94154a | 250 | case 0x5453494c: |
kit2 | 4:74d697416c75 | 251 | lcd.cls(); |
kit2 | 4:74d697416c75 | 252 | lcd.printf("INFO chunk, size %d\n",chunk_size); |
kit2 | 1:85eb1c94154a | 253 | fseek(wavfile,chunk_size,SEEK_CUR); |
kit2 | 1:85eb1c94154a | 254 | break; |
kit2 | 1:85eb1c94154a | 255 | default: |
kit2 | 4:74d697416c75 | 256 | lcd.cls(); |
kit2 | 4:74d697416c75 | 257 | lcd.printf("unknown chunk type 0x%x, size %d\n",chunk_id,chunk_size); |
kit2 | 1:85eb1c94154a | 258 | data=fseek(wavfile,chunk_size,SEEK_CUR); |
kit2 | 1:85eb1c94154a | 259 | break; |
kit2 | 1:85eb1c94154a | 260 | } |
kit2 | 1:85eb1c94154a | 261 | fread(&chunk_id,4,1,wavfile); |
kit2 | 1:85eb1c94154a | 262 | fread(&chunk_size,4,1,wavfile); |
kit2 | 1:85eb1c94154a | 263 | } |
kit2 | 4:74d697416c75 | 264 | lcd.cls(); |
kit2 | 4:74d697416c75 | 265 | lcd.printf("Done with wave file\n"); |
kit2 | 1:85eb1c94154a | 266 | fclose(wavfile); |
kit2 | 1:85eb1c94154a | 267 | led1=0; |
kit2 | 1:85eb1c94154a | 268 | } |
kit2 | 1:85eb1c94154a | 269 | |
kit2 | 1:85eb1c94154a | 270 | |
kit2 | 1:85eb1c94154a | 271 | void dac_out() |
kit2 | 1:85eb1c94154a | 272 | { |
kit2 | 1:85eb1c94154a | 273 | if (DAC_on) { |
kit2 | 1:85eb1c94154a | 274 | digout=1; |
kit2 | 1:85eb1c94154a | 275 | DACout.write_u16(DAC_fifo[DAC_rptr]); |
kit2 | 1:85eb1c94154a | 276 | DAC_rptr=(DAC_rptr+1) & 0xff; |
kit2 | 1:85eb1c94154a | 277 | digout=0; |
kit2 | 1:85eb1c94154a | 278 | } |
kit2 | 1:85eb1c94154a | 279 | } |
kit2 | 1:85eb1c94154a | 280 | |
kit2 | 1:85eb1c94154a | 281 | |
kit2 | 1:85eb1c94154a | 282 | |
kit2 | 1:85eb1c94154a | 283 | |
kit2 | 1:85eb1c94154a | 284 | //--------------------------------------------------------------------------------------------- |
kit2 | 1:85eb1c94154a | 285 | |
kit2 | 1:85eb1c94154a | 286 | //-------------------------------------------------------------------------------obtaining input |
kit2 | 1:85eb1c94154a | 287 | |
kit2 | 2:9bdba6204bb4 | 288 | |
4180_1 | 0:e09703934ff4 | 289 | void fallInterrupt() { |
kit2 | 1:85eb1c94154a | 290 | int key_code=0; |
4180_1 | 0:e09703934ff4 | 291 | int i=0; |
4180_1 | 0:e09703934ff4 | 292 | int value=mpr121.read(0x00); |
4180_1 | 0:e09703934ff4 | 293 | value +=mpr121.read(0x01)<<8; |
kit2 | 1:85eb1c94154a | 294 | |
4180_1 | 0:e09703934ff4 | 295 | i=0; |
4180_1 | 0:e09703934ff4 | 296 | // puts key number out to LEDs for demo |
kit2 | 1:85eb1c94154a | 297 | for (i=0; i<12; i++) |
kit2 | 1:85eb1c94154a | 298 | { |
kit2 | 1:85eb1c94154a | 299 | if (((value>>i)&0x01)==1) |
kit2 | 2:9bdba6204bb4 | 300 | { |
kit2 | 2:9bdba6204bb4 | 301 | if(counter==0) |
kit2 | 2:9bdba6204bb4 | 302 | { |
kit2 | 2:9bdba6204bb4 | 303 | lcd.cls(); |
kit2 | 2:9bdba6204bb4 | 304 | lcd.printf(""); |
kit2 | 2:9bdba6204bb4 | 305 | } |
kit2 | 1:85eb1c94154a | 306 | key_code=i; |
kit2 | 1:85eb1c94154a | 307 | lcd.printf("%d", i); |
kit2 | 1:85eb1c94154a | 308 | if(counter < 7) |
kit2 | 1:85eb1c94154a | 309 | { |
kit2 | 2:9bdba6204bb4 | 310 | |
kit2 | 1:85eb1c94154a | 311 | Nums[counter] = i; |
kit2 | 1:85eb1c94154a | 312 | counter++; |
kit2 | 1:85eb1c94154a | 313 | } |
4180_1 | 0:e09703934ff4 | 314 | } |
kit2 | 1:85eb1c94154a | 315 | } |
4180_1 | 0:e09703934ff4 | 316 | led4=key_code & 0x01; |
4180_1 | 0:e09703934ff4 | 317 | led3=(key_code>>1) & 0x01; |
4180_1 | 0:e09703934ff4 | 318 | led2=(key_code>>2) & 0x01; |
4180_1 | 0:e09703934ff4 | 319 | led1=(key_code>>3) & 0x01; |
4180_1 | 0:e09703934ff4 | 320 | } |
kit2 | 1:85eb1c94154a | 321 | |
4180_1 | 0:e09703934ff4 | 322 | |
kit2 | 1:85eb1c94154a | 323 | //------------------------------------------------------------------------------MAIN |
4180_1 | 0:e09703934ff4 | 324 | |
4180_1 | 0:e09703934ff4 | 325 | |
kit2 | 1:85eb1c94154a | 326 | int main() |
kit2 | 1:85eb1c94154a | 327 | { |
4180_1 | 0:e09703934ff4 | 328 | |
kit2 | 1:85eb1c94154a | 329 | //------------------------------------------------to start enter new password which user wants to set |
kit2 | 1:85eb1c94154a | 330 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 331 | lcd.printf("enter your new password\n"); |
kit2 | 4:74d697416c75 | 332 | |
kit2 | 4:74d697416c75 | 333 | //play_wave("/sd/forest.wav"); |
kit2 | 1:85eb1c94154a | 334 | wait(0.5); |
4180_1 | 0:e09703934ff4 | 335 | |
kit2 | 1:85eb1c94154a | 336 | int k; |
kit2 | 1:85eb1c94154a | 337 | //----------------------------------------------enter password |
kit2 | 1:85eb1c94154a | 338 | while(1) |
kit2 | 1:85eb1c94154a | 339 | { |
kit2 | 1:85eb1c94154a | 340 | interrupt.fall(&fallInterrupt); |
kit2 | 1:85eb1c94154a | 341 | interrupt.mode(PullUp); |
kit2 | 1:85eb1c94154a | 342 | if(counter==7){ |
kit2 | 1:85eb1c94154a | 343 | break;} |
4180_1 | 0:e09703934ff4 | 344 | } |
kit2 | 1:85eb1c94154a | 345 | |
kit2 | 1:85eb1c94154a | 346 | |
kit2 | 1:85eb1c94154a | 347 | for (k=0; k<7; k++) |
kit2 | 1:85eb1c94154a | 348 | { |
kit2 | 1:85eb1c94154a | 349 | org[k]=Nums[k]; |
kit2 | 1:85eb1c94154a | 350 | } |
kit2 | 1:85eb1c94154a | 351 | |
kit2 | 1:85eb1c94154a | 352 | wait(1); |
kit2 | 1:85eb1c94154a | 353 | |
kit2 | 1:85eb1c94154a | 354 | AGAIN: |
kit2 | 1:85eb1c94154a | 355 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 356 | lcd.printf("1-open door\n2-reset password"); |
kit2 | 4:74d697416c75 | 357 | play_wave("/sd/forest.wav"); |
4180_1 | 0:e09703934ff4 | 358 | interrupt.fall(&fallInterrupt); |
4180_1 | 0:e09703934ff4 | 359 | interrupt.mode(PullUp); |
kit2 | 1:85eb1c94154a | 360 | |
kit2 | 1:85eb1c94154a | 361 | while (1) |
kit2 | 1:85eb1c94154a | 362 | { |
kit2 | 1:85eb1c94154a | 363 | counter=0; |
kit2 | 1:85eb1c94154a | 364 | if(Nums[0]==1) |
kit2 | 1:85eb1c94154a | 365 | { |
kit2 | 1:85eb1c94154a | 366 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 367 | //---------------------------------------------------enter the password |
kit2 | 1:85eb1c94154a | 368 | lcd.printf("enter your password\n"); |
kit2 | 4:74d697416c75 | 369 | play_wave("/sd/forest.wav"); |
kit2 | 1:85eb1c94154a | 370 | wait(1); |
kit2 | 1:85eb1c94154a | 371 | |
kit2 | 1:85eb1c94154a | 372 | while(1) |
kit2 | 1:85eb1c94154a | 373 | { |
kit2 | 1:85eb1c94154a | 374 | interrupt.fall(&fallInterrupt); |
kit2 | 1:85eb1c94154a | 375 | interrupt.mode(PullUp); |
kit2 | 1:85eb1c94154a | 376 | if(counter==7){break;} |
kit2 | 1:85eb1c94154a | 377 | } |
kit2 | 1:85eb1c94154a | 378 | if(counter == 7) |
kit2 | 1:85eb1c94154a | 379 | { |
kit2 | 1:85eb1c94154a | 380 | wait(1); |
kit2 | 1:85eb1c94154a | 381 | //lcd.printf("%d",Nums[4]); |
kit2 | 1:85eb1c94154a | 382 | for(k=0;k<7;k++) |
kit2 | 1:85eb1c94154a | 383 | { |
kit2 | 1:85eb1c94154a | 384 | lcd.printf("%d",Nums[k]); |
kit2 | 1:85eb1c94154a | 385 | wait(1); |
kit2 | 1:85eb1c94154a | 386 | } |
kit2 | 1:85eb1c94154a | 387 | 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])) |
kit2 | 1:85eb1c94154a | 388 | { |
kit2 | 1:85eb1c94154a | 389 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 390 | lcd.printf("password is correct, door open\n"); |
kit2 | 1:85eb1c94154a | 391 | servo=1; |
kit2 | 1:85eb1c94154a | 392 | wait(1); |
kit2 | 1:85eb1c94154a | 393 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 394 | lcd.printf("opening door...\n"); |
kit2 | 4:74d697416c75 | 395 | play_wave("/sd/forest.wav"); |
kit2 | 2:9bdba6204bb4 | 396 | myled = 1; |
kit2 | 2:9bdba6204bb4 | 397 | myled1 = 0; |
kit2 | 2:9bdba6204bb4 | 398 | wait(5); |
kit2 | 2:9bdba6204bb4 | 399 | myled = 0; |
kit2 | 2:9bdba6204bb4 | 400 | myled1 = 1; |
kit2 | 2:9bdba6204bb4 | 401 | wait(5); |
kit2 | 1:85eb1c94154a | 402 | goto AGAIN; |
kit2 | 1:85eb1c94154a | 403 | } |
kit2 | 1:85eb1c94154a | 404 | else |
kit2 | 1:85eb1c94154a | 405 | { |
kit2 | 2:9bdba6204bb4 | 406 | |
kit2 | 1:85eb1c94154a | 407 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 408 | lcd.printf("password incorrect.retry\n"); |
kit2 | 2:9bdba6204bb4 | 409 | play_wave("/sd/forest.wav"); |
kit2 | 2:9bdba6204bb4 | 410 | wait(10); |
kit2 | 1:85eb1c94154a | 411 | goto AGAIN; |
kit2 | 1:85eb1c94154a | 412 | } |
kit2 | 1:85eb1c94154a | 413 | } |
kit2 | 1:85eb1c94154a | 414 | } |
kit2 | 1:85eb1c94154a | 415 | |
kit2 | 1:85eb1c94154a | 416 | |
kit2 | 1:85eb1c94154a | 417 | wait(1); |
kit2 | 1:85eb1c94154a | 418 | if(Nums[0]==2) |
kit2 | 1:85eb1c94154a | 419 | { |
kit2 | 1:85eb1c94154a | 420 | wait(1); |
kit2 | 1:85eb1c94154a | 421 | counter=0; |
kit2 | 1:85eb1c94154a | 422 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 423 | lcd.printf("enter your old password\n"); |
kit2 | 1:85eb1c94154a | 424 | play_wave("/sd/forest.wav"); |
kit2 | 1:85eb1c94154a | 425 | while(1) |
kit2 | 1:85eb1c94154a | 426 | { |
kit2 | 1:85eb1c94154a | 427 | interrupt.fall(&fallInterrupt); |
kit2 | 1:85eb1c94154a | 428 | interrupt.mode(PullUp); |
kit2 | 1:85eb1c94154a | 429 | if(counter==7){break;} |
kit2 | 1:85eb1c94154a | 430 | } |
kit2 | 1:85eb1c94154a | 431 | |
kit2 | 1:85eb1c94154a | 432 | if(counter == 7) |
kit2 | 1:85eb1c94154a | 433 | { |
kit2 | 1:85eb1c94154a | 434 | |
kit2 | 1:85eb1c94154a | 435 | 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])) |
kit2 | 1:85eb1c94154a | 436 | { |
kit2 | 1:85eb1c94154a | 437 | counter=0; |
kit2 | 1:85eb1c94154a | 438 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 439 | lcd.printf("enter your new password"); |
kit2 | 1:85eb1c94154a | 440 | play_wave("/sd/forest.wav"); |
kit2 | 1:85eb1c94154a | 441 | while(1) |
kit2 | 1:85eb1c94154a | 442 | { |
kit2 | 1:85eb1c94154a | 443 | interrupt.fall(&fallInterrupt); |
kit2 | 1:85eb1c94154a | 444 | interrupt.mode(PullUp); |
kit2 | 1:85eb1c94154a | 445 | if(counter==7){break;} |
kit2 | 1:85eb1c94154a | 446 | } |
kit2 | 1:85eb1c94154a | 447 | |
kit2 | 1:85eb1c94154a | 448 | for (k=0; k<7; k++) |
kit2 | 1:85eb1c94154a | 449 | { |
kit2 | 1:85eb1c94154a | 450 | org[k]=Nums[k]; |
kit2 | 1:85eb1c94154a | 451 | } |
kit2 | 1:85eb1c94154a | 452 | |
kit2 | 1:85eb1c94154a | 453 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 454 | lcd.printf("password changed"); |
kit2 | 1:85eb1c94154a | 455 | play_wave("/sd/forest.wav"); |
kit2 | 1:85eb1c94154a | 456 | goto AGAIN; |
kit2 | 1:85eb1c94154a | 457 | } |
kit2 | 1:85eb1c94154a | 458 | else |
kit2 | 1:85eb1c94154a | 459 | { |
kit2 | 1:85eb1c94154a | 460 | lcd.cls(); |
kit2 | 1:85eb1c94154a | 461 | lcd.printf("password incorrect.retry\n"); |
kit2 | 2:9bdba6204bb4 | 462 | k++; |
kit2 | 2:9bdba6204bb4 | 463 | if(k==3) |
kit2 | 2:9bdba6204bb4 | 464 | { |
kit2 | 2:9bdba6204bb4 | 465 | lcd.cls(); |
kit2 | 2:9bdba6204bb4 | 466 | lcd.printf("Locked"); |
kit2 | 2:9bdba6204bb4 | 467 | wait(30); |
kit2 | 2:9bdba6204bb4 | 468 | } |
kit2 | 1:85eb1c94154a | 469 | play_wave("/sd/forest.wav"); |
kit2 | 1:85eb1c94154a | 470 | goto AGAIN; |
kit2 | 1:85eb1c94154a | 471 | } |
kit2 | 1:85eb1c94154a | 472 | } |
4180_1 | 0:e09703934ff4 | 473 | } |
kit2 | 2:9bdba6204bb4 | 474 | else |
kit2 | 2:9bdba6204bb4 | 475 | { |
kit2 | 2:9bdba6204bb4 | 476 | goto AGAIN; |
kit2 | 1:85eb1c94154a | 477 | } |
kit2 | 1:85eb1c94154a | 478 | } |
kit2 | 2:9bdba6204bb4 | 479 | } |