Smart Garage monitor and control system

Dependencies:   mbed HBridge MQ7 Ton SimpleScheduler Pir_sensor

Committer:
pkunnals
Date:
Fri Mar 19 19:23:20 2021 +0000
Revision:
5:00c71adb66e9
Parent:
4:ae0a21e468bb
Smart Garage Monitor and control system

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pkunnals 4:ae0a21e468bb 1 #include "mbed.h"
agaikwad 3:164296bb4985 2 #include "math.h"
pkunnals 4:ae0a21e468bb 3 #include "Pir_sensor.h"
pkunnals 4:ae0a21e468bb 4 #include "MQ7.h"
agaikwad 3:164296bb4985 5 #include <string>
pkunnals 4:ae0a21e468bb 6 #include "SimpleScheduler.h"
pkunnals 4:ae0a21e468bb 7 #include "ESP8266.h"
pkunnals 4:ae0a21e468bb 8 #include "Thingspeak.h"
pkunnals 4:ae0a21e468bb 9 #include "HBridge.h"
pkunnals 4:ae0a21e468bb 10 #include "Ton.h"
pkunnals 4:ae0a21e468bb 11
pkunnals 4:ae0a21e468bb 12 #define TIMER_PERIODICITY (1) /* 1 second */
pkunnals 4:ae0a21e468bb 13 #define SCHEDULER_TASK_PERIODICITY (500) /* 500ms */
pkunnals 4:ae0a21e468bb 14 #define GARAGE_LIGHT_TURN_OFF_DELAY (10)
pkunnals 4:ae0a21e468bb 15
pkunnals 4:ae0a21e468bb 16 Ton t1(15000); // Timer ON delay of 15 seconds.
pkunnals 4:ae0a21e468bb 17 Ton t2(15000); // Timer ON delay of 15 seconds.
agaikwad 3:164296bb4985 18
pkunnals 4:ae0a21e468bb 19 Serial PC(USBTX, USBRX);
pkunnals 4:ae0a21e468bb 20 /* pir senor input */
pkunnals 4:ae0a21e468bb 21 Pir_sensor PIR(D2);
pkunnals 4:ae0a21e468bb 22 /* Garage lamp output */
pkunnals 4:ae0a21e468bb 23 DigitalOut Garage_Lamp_Status(D7);
pkunnals 4:ae0a21e468bb 24 /* Garage CO sensor output */
pkunnals 4:ae0a21e468bb 25 MQ7 CO_Sensor(A0,D3);
pkunnals 4:ae0a21e468bb 26 DigitalOut PIR_DetectionLight(LED2);
pkunnals 4:ae0a21e468bb 27 HBridge Motor(D5,D6,D4);
agaikwad 3:164296bb4985 28
pkunnals 4:ae0a21e468bb 29 Ticker ticker;
pkunnals 4:ae0a21e468bb 30 SimpleScheduler *scheduler;
pkunnals 4:ae0a21e468bb 31
pkunnals 4:ae0a21e468bb 32 typedef enum {
SIT2016 1:2012c31aee1b 33
pkunnals 4:ae0a21e468bb 34 DOOR_IS_OPEN = 1,
pkunnals 4:ae0a21e468bb 35 DOOR_IS_CLOSED = 2,
pkunnals 4:ae0a21e468bb 36 DOOR_IS_SAFE_OPEN = 3,
pkunnals 4:ae0a21e468bb 37 } eDoor_Status_t;
pkunnals 4:ae0a21e468bb 38
pkunnals 4:ae0a21e468bb 39
pkunnals 4:ae0a21e468bb 40 typedef enum {
SIT2016 1:2012c31aee1b 41
pkunnals 4:ae0a21e468bb 42 MOVEMENT_DETECTED = 1,
pkunnals 4:ae0a21e468bb 43 NO_MOVEMENT_DETECTED = 2,
pkunnals 4:ae0a21e468bb 44 } ePIR_Status_t;
SIT2016 1:2012c31aee1b 45
pkunnals 4:ae0a21e468bb 46 typedef enum {
pkunnals 4:ae0a21e468bb 47
pkunnals 4:ae0a21e468bb 48 OPEN_DOOR = 1,
pkunnals 4:ae0a21e468bb 49 CLOSE_DOOR = 2,
pkunnals 4:ae0a21e468bb 50 SAFE_OPEN_DOOR = 3,
pkunnals 4:ae0a21e468bb 51 } eDoor_Command_t;
SIT2016 1:2012c31aee1b 52
pkunnals 4:ae0a21e468bb 53 eDoor_Status_t doorStatus = DOOR_IS_CLOSED;
pkunnals 4:ae0a21e468bb 54 eDoor_Command_t doorControl = CLOSE_DOOR;
pkunnals 4:ae0a21e468bb 55 eDoor_Command_t prevDoorControl = CLOSE_DOOR;
pkunnals 4:ae0a21e468bb 56 char garage_light_delay_counter = 0;
pkunnals 4:ae0a21e468bb 57 ePIR_Status_t PIR_Status = NO_MOVEMENT_DETECTED;
pkunnals 4:ae0a21e468bb 58 int CO_Level = 1;
pkunnals 4:ae0a21e468bb 59 /*!
pkunnals 4:ae0a21e468bb 60 * Periodic Timer Interrupt controlling garage lights
pkunnals 4:ae0a21e468bb 61 *
pkunnals 4:ae0a21e468bb 62 * =============================================================================
pkunnals 4:ae0a21e468bb 63 */
pkunnals 4:ae0a21e468bb 64 void Periodic_Interrupt ( void )
pkunnals 4:ae0a21e468bb 65 {
pkunnals 4:ae0a21e468bb 66 if ( garage_light_delay_counter > 0 )
pkunnals 4:ae0a21e468bb 67 {
pkunnals 4:ae0a21e468bb 68 garage_light_delay_counter--;
pkunnals 4:ae0a21e468bb 69 }
pkunnals 4:ae0a21e468bb 70 else
pkunnals 4:ae0a21e468bb 71 {
pkunnals 4:ae0a21e468bb 72 if ( DOOR_IS_CLOSED == doorStatus )
pkunnals 4:ae0a21e468bb 73 {
pkunnals 4:ae0a21e468bb 74 Garage_Lamp_Status = 0;
pkunnals 4:ae0a21e468bb 75 }
pkunnals 4:ae0a21e468bb 76
pkunnals 4:ae0a21e468bb 77 PIR_Status = NO_MOVEMENT_DETECTED;
pkunnals 4:ae0a21e468bb 78 }
pkunnals 4:ae0a21e468bb 79 }
SIT2016 1:2012c31aee1b 80
pkunnals 4:ae0a21e468bb 81 /*!
pkunnals 4:ae0a21e468bb 82 * Function used monitor and control door status, CO level and garage lights
pkunnals 4:ae0a21e468bb 83 *
pkunnals 4:ae0a21e468bb 84 * =============================================================================
pkunnals 4:ae0a21e468bb 85 */
pkunnals 4:ae0a21e468bb 86 void Garage_Monitor_Runnable ( void )
agaikwad 3:164296bb4985 87 {
pkunnals 4:ae0a21e468bb 88 /* Development In Progress */
pkunnals 4:ae0a21e468bb 89 if( PIR.read() )
pkunnals 4:ae0a21e468bb 90 {
pkunnals 4:ae0a21e468bb 91 PIR_DetectionLight = 0;
pkunnals 4:ae0a21e468bb 92 Garage_Lamp_Status = 1;
pkunnals 4:ae0a21e468bb 93 PC.printf("\n\r*** MOTION DETECTED *** \n\r");
pkunnals 4:ae0a21e468bb 94 PIR_Status = MOVEMENT_DETECTED;
pkunnals 4:ae0a21e468bb 95 PC.printf("\r\n*** GARAGE LIGHT IS ON *** \r\n");
pkunnals 4:ae0a21e468bb 96 garage_light_delay_counter = GARAGE_LIGHT_TURN_OFF_DELAY;
pkunnals 4:ae0a21e468bb 97 }
pkunnals 4:ae0a21e468bb 98 else
pkunnals 4:ae0a21e468bb 99 {
pkunnals 4:ae0a21e468bb 100 if ( PIR_DetectionLight == 0 )
pkunnals 4:ae0a21e468bb 101 {
pkunnals 4:ae0a21e468bb 102 PC.printf("\n\r*** NO MOTION DETECTED *** \n\r");
pkunnals 4:ae0a21e468bb 103 }
pkunnals 4:ae0a21e468bb 104 PIR_DetectionLight = 1;
pkunnals 4:ae0a21e468bb 105 }
agaikwad 3:164296bb4985 106
pkunnals 4:ae0a21e468bb 107 CO_Level = CO_Sensor.get_CO_value ();
pkunnals 4:ae0a21e468bb 108 if ( CO_Level == 1 )
pkunnals 4:ae0a21e468bb 109 {
pkunnals 4:ae0a21e468bb 110 PC.printf("\r\n*** GARAGE CO LEVEL IS SAFE/LOW *** \r\n");
pkunnals 4:ae0a21e468bb 111 }
pkunnals 4:ae0a21e468bb 112 else if ( CO_Level == 2 )
pkunnals 4:ae0a21e468bb 113 {
pkunnals 4:ae0a21e468bb 114 PC.printf("\r\n*** WARNING!! GARAGE CO LEVEL IS MODERATE *** \r\n");
pkunnals 4:ae0a21e468bb 115 }
pkunnals 4:ae0a21e468bb 116 else
pkunnals 4:ae0a21e468bb 117 {
pkunnals 4:ae0a21e468bb 118 PC.printf("\r\n*** DANGER!!! GARAGE CO LEVEL IS HIGH *** \r\n");
pkunnals 4:ae0a21e468bb 119 }
pkunnals 4:ae0a21e468bb 120 PC.printf("\n\r=========================================================================\n\r");
pkunnals 4:ae0a21e468bb 121 PC.printf("\n\rGarage Door Status = %d \n\rGarage CO Level = %d\n\rPIR Status = %d \n\r", (int)doorStatus, CO_Level, (int)PIR_Status);
pkunnals 4:ae0a21e468bb 122 PC.printf("\n\r=========================================================================\n\r");
agaikwad 3:164296bb4985 123
pkunnals 4:ae0a21e468bb 124 if ( t2 )
pkunnals 4:ae0a21e468bb 125 {
pkunnals 4:ae0a21e468bb 126 /* Send garage status to Thingspeak channel */
pkunnals 4:ae0a21e468bb 127 Send_to_Thingspeak ( (int)doorStatus, CO_Level, (int)PIR_Status ) ;
pkunnals 4:ae0a21e468bb 128 t2 = Ton::Off;
pkunnals 4:ae0a21e468bb 129 t2.reset();
pkunnals 4:ae0a21e468bb 130 t1 = Ton::On;
agaikwad 3:164296bb4985 131 }
SIT2016 2:817794b2f733 132 }
SIT2016 2:817794b2f733 133
pkunnals 4:ae0a21e468bb 134 void Garage_Door_Control_Runnable( void )
pkunnals 4:ae0a21e468bb 135 {
pkunnals 4:ae0a21e468bb 136
pkunnals 4:ae0a21e468bb 137 if ( t1 )
pkunnals 4:ae0a21e468bb 138 {
pkunnals 4:ae0a21e468bb 139 // This code will be executed once the timer times out.
pkunnals 4:ae0a21e468bb 140 doorControl = ( eDoor_Command_t ) Read_from_Thingspeak();
pkunnals 4:ae0a21e468bb 141 PC.printf("\r\n Door Command received from Thingspeak = %d \r\n", doorControl);
pkunnals 4:ae0a21e468bb 142 t1 = Ton::Off;
pkunnals 4:ae0a21e468bb 143 t1.reset();
pkunnals 4:ae0a21e468bb 144 t2 = Ton::On;
pkunnals 4:ae0a21e468bb 145 }
pkunnals 4:ae0a21e468bb 146 if ( ( CO_Level > 1 ) && ( prevDoorControl != OPEN_DOOR ) )
pkunnals 4:ae0a21e468bb 147 {
pkunnals 4:ae0a21e468bb 148 doorControl = SAFE_OPEN_DOOR;
pkunnals 4:ae0a21e468bb 149 }
pkunnals 4:ae0a21e468bb 150 if ( ( doorControl == OPEN_DOOR ) && ( prevDoorControl != OPEN_DOOR ) )
pkunnals 4:ae0a21e468bb 151 {
pkunnals 4:ae0a21e468bb 152 Garage_Lamp_Status = 1;
pkunnals 4:ae0a21e468bb 153 garage_light_delay_counter = GARAGE_LIGHT_TURN_OFF_DELAY;
pkunnals 4:ae0a21e468bb 154 PC.printf("\r\n*** GARAGE LIGHT IS TURNED ON *** \r\n");
pkunnals 4:ae0a21e468bb 155 Motor.forward ();
pkunnals 4:ae0a21e468bb 156 if ( doorStatus == DOOR_IS_CLOSED )
pkunnals 4:ae0a21e468bb 157 {
pkunnals 4:ae0a21e468bb 158 wait(8);
pkunnals 4:ae0a21e468bb 159 }
pkunnals 4:ae0a21e468bb 160 else if ( doorStatus == DOOR_IS_SAFE_OPEN )
pkunnals 4:ae0a21e468bb 161 {
pkunnals 4:ae0a21e468bb 162 wait(6);
pkunnals 4:ae0a21e468bb 163 }
pkunnals 4:ae0a21e468bb 164 Motor.stop ();
pkunnals 4:ae0a21e468bb 165 doorStatus = DOOR_IS_OPEN;
pkunnals 4:ae0a21e468bb 166 PC.printf("\r\n*** DOOR IS OPEN ***\r\n");
pkunnals 4:ae0a21e468bb 167 }
pkunnals 4:ae0a21e468bb 168 else if ( ( doorControl == SAFE_OPEN_DOOR ) && ( prevDoorControl == CLOSE_DOOR ) )
pkunnals 4:ae0a21e468bb 169 {
pkunnals 4:ae0a21e468bb 170 Garage_Lamp_Status = 1;
pkunnals 4:ae0a21e468bb 171 garage_light_delay_counter = GARAGE_LIGHT_TURN_OFF_DELAY;
pkunnals 4:ae0a21e468bb 172 PC.printf("\r\n*** GARAGE LIGHT IS TURNED ON *** \r\n");
pkunnals 4:ae0a21e468bb 173 Motor.forward ();
pkunnals 4:ae0a21e468bb 174 wait(2);
pkunnals 4:ae0a21e468bb 175 Motor.stop ();
pkunnals 4:ae0a21e468bb 176 doorStatus = DOOR_IS_SAFE_OPEN;
pkunnals 4:ae0a21e468bb 177 PC.printf("\r\n*** DOOR IS SAFETY OPEN ***\r\n");
pkunnals 4:ae0a21e468bb 178 }
pkunnals 4:ae0a21e468bb 179 else if ( ( doorControl == CLOSE_DOOR ) && ( prevDoorControl != CLOSE_DOOR ) )
pkunnals 4:ae0a21e468bb 180 {
pkunnals 4:ae0a21e468bb 181 Garage_Lamp_Status = 1;
pkunnals 4:ae0a21e468bb 182 garage_light_delay_counter = GARAGE_LIGHT_TURN_OFF_DELAY;
pkunnals 4:ae0a21e468bb 183 PC.printf("\r\n*** GARAGE LIGHT IS TURNED ON *** \r\n");
pkunnals 4:ae0a21e468bb 184 Motor.backward ();
pkunnals 4:ae0a21e468bb 185 if ( doorStatus == DOOR_IS_OPEN )
pkunnals 4:ae0a21e468bb 186 {
pkunnals 4:ae0a21e468bb 187 wait(9);
pkunnals 4:ae0a21e468bb 188 }
pkunnals 4:ae0a21e468bb 189 else if ( doorStatus == DOOR_IS_SAFE_OPEN )
pkunnals 4:ae0a21e468bb 190 {
pkunnals 4:ae0a21e468bb 191 wait(2);
pkunnals 4:ae0a21e468bb 192 }
pkunnals 4:ae0a21e468bb 193 Motor.stop ();
pkunnals 4:ae0a21e468bb 194 PC.printf("\r\n*** DOOR IS CLOSED *** \r\n");
pkunnals 4:ae0a21e468bb 195 doorStatus = DOOR_IS_CLOSED;
pkunnals 4:ae0a21e468bb 196 }
pkunnals 4:ae0a21e468bb 197 else
pkunnals 4:ae0a21e468bb 198 {
pkunnals 4:ae0a21e468bb 199
pkunnals 4:ae0a21e468bb 200 }
pkunnals 4:ae0a21e468bb 201 prevDoorControl = doorControl;
agaikwad 3:164296bb4985 202 }
agaikwad 3:164296bb4985 203
pkunnals 4:ae0a21e468bb 204 void Task_500ms_Runnable(SimpleTask *task) {
pkunnals 4:ae0a21e468bb 205
pkunnals 4:ae0a21e468bb 206 Garage_Door_Control_Runnable ();
agaikwad 3:164296bb4985 207
pkunnals 4:ae0a21e468bb 208 Garage_Monitor_Runnable ();
pkunnals 4:ae0a21e468bb 209 }
pkunnals 4:ae0a21e468bb 210
pkunnals 4:ae0a21e468bb 211 /*!
pkunnals 4:ae0a21e468bb 212 * Main function, user application starts from here.
pkunnals 4:ae0a21e468bb 213 *
pkunnals 4:ae0a21e468bb 214 * =============================================================================
pkunnals 4:ae0a21e468bb 215 */
pkunnals 4:ae0a21e468bb 216 int main ( void )
pkunnals 4:ae0a21e468bb 217 {
pkunnals 4:ae0a21e468bb 218 /* Baud rate used for communicating with Tera-term on PC */
pkunnals 4:ae0a21e468bb 219 PC.baud(115200);
pkunnals 4:ae0a21e468bb 220 PC.printf("\n\r\n\r");
pkunnals 4:ae0a21e468bb 221 PC.printf(" ###### ## ## ###### ##### ######## #### ###### ##### ###### #### ######## ###### ## ## ###### ######## ######## ## ##\n\r");
pkunnals 4:ae0a21e468bb 222 PC.printf("## ## ### ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ###\n\r");
pkunnals 4:ae0a21e468bb 223 PC.printf("## #### #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ## ## #### ####\n\r");
pkunnals 4:ae0a21e468bb 224 PC.printf(" ###### ## ### ## ######## ## ### ## ## ### ######## ## ### ######## ## ### ###### ###### ## ###### ## ###### ## ### ##\n\r");
pkunnals 4:ae0a21e468bb 225 PC.printf(" ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##\n\r");
pkunnals 4:ae0a21e468bb 226 PC.printf("## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##\n\r");
pkunnals 4:ae0a21e468bb 227 PC.printf(" ###### ## ## ## ## ## ## ## #### ## ## ## ## ## ## #### ######## ###### ## ###### ## ######## ## ##\n\r");
pkunnals 4:ae0a21e468bb 228 PC.printf("-----------------------------------------------------------------------------------------\n\r");
pkunnals 4:ae0a21e468bb 229 PC.printf("Developed By: Priyanka Kunnal Siddalingappa\n\r");
pkunnals 4:ae0a21e468bb 230 PC.printf("-----------------------------------------------------------------------------------------\n\r\n\r");
agaikwad 3:164296bb4985 231
pkunnals 4:ae0a21e468bb 232 PC.printf("\n\n\rInitial ESP...\n\n\r");
pkunnals 4:ae0a21e468bb 233 /* Initialize ESP wifi module */
pkunnals 4:ae0a21e468bb 234 Esp8266_Init();
agaikwad 3:164296bb4985 235
pkunnals 4:ae0a21e468bb 236 doorStatus = DOOR_IS_CLOSED;
pkunnals 4:ae0a21e468bb 237 doorControl = CLOSE_DOOR;
pkunnals 4:ae0a21e468bb 238 prevDoorControl = CLOSE_DOOR;
pkunnals 4:ae0a21e468bb 239 PIR_Status = NO_MOVEMENT_DETECTED;
pkunnals 4:ae0a21e468bb 240 garage_light_delay_counter = 0;
pkunnals 4:ae0a21e468bb 241 if (!t1.isRunning())
agaikwad 3:164296bb4985 242 {
pkunnals 4:ae0a21e468bb 243 t1 = Ton::On;
pkunnals 4:ae0a21e468bb 244 doorControl = ( eDoor_Command_t ) Read_from_Thingspeak();
agaikwad 3:164296bb4985 245 }
SIT2016 1:2012c31aee1b 246
pkunnals 4:ae0a21e468bb 247 PC.printf("\n\n\rStarting Periodic Interrupt...\n\n\r");
pkunnals 4:ae0a21e468bb 248 /* Trigger the interrupt periodically */
pkunnals 4:ae0a21e468bb 249 ticker.attach(Periodic_Interrupt, TIMER_PERIODICITY);
agaikwad 3:164296bb4985 250
pkunnals 4:ae0a21e468bb 251 PC.printf("\n\n\rStarting Scheduler...\n\n\r");
pkunnals 4:ae0a21e468bb 252 scheduler = new SimpleScheduler;
pkunnals 4:ae0a21e468bb 253 scheduler
pkunnals 4:ae0a21e468bb 254 ->addTask( new SimpleTask(SCHEDULER_TASK_PERIODICITY, Task_500ms_Runnable) )
pkunnals 4:ae0a21e468bb 255 ;
pkunnals 4:ae0a21e468bb 256 scheduler->run();
pkunnals 4:ae0a21e468bb 257
pkunnals 4:ae0a21e468bb 258 /*!
pkunnals 4:ae0a21e468bb 259 * Wait forever
pkunnals 4:ae0a21e468bb 260 * ========================
pkunnals 4:ae0a21e468bb 261 */
pkunnals 4:ae0a21e468bb 262 while (1)
pkunnals 4:ae0a21e468bb 263 {
pkunnals 4:ae0a21e468bb 264 ;
agaikwad 3:164296bb4985 265 }
SIT2016 1:2012c31aee1b 266 }