This is a simplified version of home alarm system for CE323/CE860 (Advanced Embedded Systems Design) in the University of Essex.

Dependencies:   TextLCD mbed

Files at this revision

API Documentation at this revision

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

TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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