
This is a simplified version of home alarm system for CE323/CE860 (Advanced Embedded Systems Design) in the University of Essex.
Revision 0:df2226ca976c, committed 2017-02-17
- Comitter:
- liruihao2008
- Date:
- Fri Feb 17 17:13:43 2017 +0000
- Commit message:
- This is a simplified version for home alarm system in the University of Essex.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD.lib Fri Feb 17 17:13:43 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/TextLCD/#308d188a2d3a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Feb 17 17:13:43 2017 +0000 @@ -0,0 +1,469 @@ +/*============================================================================= +Copyright University of Essex 2017 +Author: Ruihao Li + +FILE - main.c + mbed LPC1768 application. + +DESCRIPTION + alarm 1 laboratory solution. + hardware: mbed LPC1768, an extension board. + Use a terminal program such as 'HyperTerminal' to communicate with the application. + The serial port configuration is shown below. + 9600 Baud + 8 data bits + No parity bits + One stop bit + No hardware flow control +==============================================================================*/ + + +/****************************************************************************** +Include head files. +******************************************************************************/ +#include "mbed.h" +#include "TextLCD.h" + +// TextLCD +TextLCD lcd(p15, p16, p17, p18, p19, p20);//, TextLCD::LCD20x4); // rs, e, d4-d7 + +// Read from switches and keypad +BusOut rows(p26,p25,p24); +BusIn cols(p14,p13,p12,p11); + +// Control external LEDs +SPI sw(p5, p6, p7); +DigitalOut cs(p8); + +// Serial USB +Serial pc(USBTX, USBRX); // tx, rx + +// Temperature reading +I2C i2c(p9, p10); // I2C: SDA, SCL + +DigitalOut Sounder(LED1); +DigitalOut led4(LED4); + +/****************************************************************************** +Declaration of functions. +******************************************************************************/ +void alarmConfig(void); +void alarm_state(); + +int read_switch(void); +int switchleds(void); +void initleds(); +void setleds(int ledall); +void setled(int ledno, int ledstate); +int readled(int ledno); +int readleds(); + +char getKey(); +void setKey(void); +int testCode(void); + +void sounder_blink(); +void pattern(void); +void patternoff(void); +void Sounderoff(void); + +void system_alarm(void); +void system_set(void); + +/****************************************************************************** +Global variables. +******************************************************************************/ +enum State {unset, exits, set, entry, alarm, report} state; +char Keytable[] = { 'F', 'E', 'D', 'C', + '3', '6', '9', 'B', + '2', '5', '8', '0', + '1', '4', '7', 'A' + }; +char keyCode[] = {'1','2','3','4'}; +char code[4]; +int fail = 0; // number of failed attempts +int success; // 0~4: number of successful matched keycodes; 5 indicates switch changing; 6 indicates time expired +int zone; +int led_bits = 0; // global LED status used for readback +bool time_expired ; +Ticker timer; +Timeout t_alarm, t_entry, t_exit; + +/*============================================================================= + +FILE - main.cpp + +DESCRIPTION + Initiates the Finite State Machine +=============================================================================*/ +int main() { + alarmConfig(); + + lcd.cls(); + lcd.locate(2,0); + lcd.printf("Alarm Lab"); + pc.printf("\n\n\r ALARM LAB\n\r (c)Copyright University of Essex 2017 \n\r Author: Ruihao Li\n\r"); + + setKey(); + while (1){ + switchleds(); + alarm_state(); // FSM routine + } +} + +/********************************************************************************** +Finite State Machine for Alarm +**********************************************************************************/ +void alarm_state(){ + int s; + + switch(state){ + /*-------------------------------------------------------------------------------- + UN_SET STATE (STATE 1) + un_set led enabled + Internal sounder disabledabled + Sensors not monitored. +---------------------------------------------------------------------------------*/ + case unset: + setled(8,3); // turn unset led on + pc.printf("\n\r Unset mode\n\r"); + lcd.cls(); + lcd.printf("Unset mode"); + + success = testCode(); + if (success == 4) { + fail = 0; // failure counter reset + state = exits; + } + else if (fail == 2) { + pc.printf("\n\r attemp %d", fail+1); + state = alarm; + zone = 5; // zone identifier(5 represents an invalid code is entered three times) + fail = 0; //failure counter reset + } + else{ + fail++; + state = unset; + pc.printf("\n\r attemp %d", fail); + } + break; +/*-------------------------------------------------------------------------------- + EXIT STATE (STATE 2) + un_set led flashes + Internal sounder enabled for 250msec every 500msec. +---------------------------------------------------------------------------------*/ + case exits: + setled(7,3); // turn exits led on + pattern(); // Sounder switches on and then off at 250ms intervals + pc.printf("\n\r Exit mode\n\r"); + lcd.cls(); + lcd.printf("Exit mode"); + + // you should program here! + + + + break; + /*-------------------------------------------------------------------------------- + SET STATE (STATE 3) + set led enabled + Internal sounder disabled. +---------------------------------------------------------------------------------*/ + case set: + setled(6,3); // turn set led on + + pc.printf("\n\r Set mode\n\r"); + lcd.cls(); + lcd.printf("Set mode"); + + + // you should program here! + + break; +/*-------------------------------------------------------------------------------- + ENTRY STATE (STATE 4) + un_set led flashes + Internal sounder enabled for 250ms every 500ms. +---------------------------------------------------------------------------------*/ + case entry: + setled(5,3); // turn entry led on + pattern(); // Sounder switches on and then off at 250ms intervals + + pc.printf("\n\r Entry mode\n\r"); + lcd.cls(); + lcd.printf("Entry mode"); + + // you should program here! + + break; +/*-------------------------------------------------------------------------------- + ALARM STATE (STATE 5) + alarm led enabled + Internal and External sounders enabled. +---------------------------------------------------------------------------------*/ + case alarm: + setled(4,3); // turn entry led on + Sounder = 1; //Sounder enabled all the time during alarm state + + pc.printf("\n\r Alarm mode\n\r"); + lcd.cls(); + lcd.printf("Alarm mode"); + + // you should program here! + + break; +/*-------------------------------------------------------------------------------- + REPORT (STATE 6) + un-set and alarm leds enabled + Internal sounder remains enabled. + External sounder enabled. +---------------------------------------------------------------------------------*/ + case report: + setled(3,3); // turn entry led on + + pc.printf("\n\r Report mode\n\r"); + lcd.cls(); + lcd.printf("Zone numbers:%i",zone); + lcd.locate(0,1); + lcd.printf("C key to clear"); + + while (1){ + char b = getKey(); + if (b == 'C'){ + state = unset; + break; + } + } + break; + } // end switch(state) + +} // end alarm_state() + + +/********************************************************************************** +Configurations +**********************************************************************************/ +void alarmConfig() +{ + cs=0; + sw.format(16,0); + sw.frequency(1000000); + + state = unset; // Initial state + + led_bits = 0x0000; // turn off all the external leds + sw.write(led_bits); + cs = 1; + cs = 0; +} + +/********************************************************************************** +External switches +**********************************************************************************/ +int read_switch() +{ + rows = 4; + int switches = cols; + rows = 5; + switches = switches*16 + cols; + + return switches; +} + +int switchleds() +{ + int switches = read_switch(); + + for(int i=0;i<=7;i++){ + if ((switches & 0x0001<<i)!=0){ // 1, then turn on + led_bits = led_bits | (0x0003 << i*2); } + else { // 0, then turn off + led_bits = led_bits & ((0x0003 << i*2) ^ 0xffff); } + } + sw.write(led_bits); + cs = 1; + cs = 0; + + return switches; +} + +/********************************************************************************** +External LED functionality +**********************************************************************************/ +void initleds() { + cs = 0; // latch must start low + sw.format(16,0); // SPI 16 bit data, low state, high going clock + sw.frequency(1000000); // 1MHz clock rate +} + +void setleds(int ledall) { + led_bits = ledall; // update global LED status + sw.write((led_bits & 0x03ff) | ((led_bits & 0xa800) >> 1) | ((led_bits & 0x5400) << 1)); + cs = 1; // latch pulse start + cs = 0; // latch pulse end +} + +void setled(int ledno, int ledstate) { + ledno = 9 - ledno; + ledno = ((ledno - 1) & 0x0007) + 1; // limit led number + ledno = (8 - ledno) * 2; // offset of led state in 'led_bits' + ledstate = ledstate & 0x0003; // limit led state + ledstate = ledstate << ledno; + int statemask = ((0x0003 << ledno) ^ 0xffff); // mask used to clear led state + led_bits = ((led_bits & statemask) | ledstate); // clear and set led state + setleds(led_bits); +} + +int readled(int ledno) { + ledno = 9 - ledno; + ledno = ((ledno - 1) & 0x0007) + 1; // limit led number + ledno = (8 - ledno) * 2; // offset of led state in 'led_bits' + int ledstate = led_bits; + ledstate = ledstate >> ledno; // shift selected led state into ls 2 bits + return (ledstate & 0x0003); // mask out and return led state +} + +int readleds() { + return led_bits; // return LED status +} + +/********************************************************************************** +Keypad functionality +**********************************************************************************/ +char getKey() +{ + int i,j; + char ch=' '; + + for (i = 0; i <= 3; i++) { + rows = i; + for (j = 0; j <= 3; j++) { + if (((cols ^ 0x00FF) & (0x0001<<j)) != 0) { + ch = Keytable[(i * 4) + j]; + } + } + } + wait(0.2); //debouncing + return ch; +} + +int testCode(void) +{ + int a, y; + char b; + + lcd.locate(0, 1); + lcd.printf("Enter Code: ____"); + y = 0; + for(a = 0; a < 4; a++) { + b = getKey(); + switch(b) { + case ' ': + a--; + break; + case 'C': // use 'C' to delete input + if (a > 0){ + a = a-2; + lcd.locate(13+a, 1); + lcd.putc('_'); + if ( code[a+1] == keyCode[a+1]){ + y--; + } + } + else if (a == 0){ + a--; + } + break; + default: + code[a] = b; + lcd.locate(12+a, 1); + lcd.putc('*'); + if(code[a] == keyCode[a]) { + y++; + } + } + } + lcd.cls(); + lcd.locate(0,1); + lcd.printf("Press B to set"); + while (1){ + b = getKey(); + if (b == 'B') + break; + } + + return(y); +} + +void setKey(void) +{ + int a; + char b; + + lcd.locate(0, 1); + lcd.printf("Init Code: ____"); + for(a = 0; a < 4; a++) { + b = getKey(); + + switch(b){ + case ' ': + a--; + break; + case 'C': + if (a > 0){ + a = a-2; + lcd.locate(13+a, 1); + lcd.putc('_'); + } + else if (a == 0){ + a--; + } + break; + default: + lcd.locate(12+a, 1); + lcd.putc(b); + keyCode[a] = b; + } + } + wait(1); +} + +/********************************************************************************** +Simulation of alarm internal sounder +**********************************************************************************/ +void sounder_blink() +{ + Sounder = !Sounder; +} + +void pattern(void) +{ + timer.attach(&sounder_blink, 0.25); +} + +void patternoff(void) +{ + timer.detach(); // turn the Sounder off + Sounder = 0; +} + +void Sounderoff(void) +{ + Sounder = 0; +} + +/********************************************************************************** +Set system state +**********************************************************************************/ +void system_alarm(void) +{ + state = alarm; + time_expired = true; +} + +void system_set(void) +{ + state = set; + time_expired = true; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Feb 17 17:13:43 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/ef9c61f8c49f \ No newline at end of file