Sistema de supervision y alarma para deposito de comida de animales

Committer:
ciror00
Date:
Fri May 14 17:27:28 2021 +0000
Revision:
0:5e7248732177
Trabajo final de la materia Introduccion a los Sistemas Embebidos

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ciror00 0:5e7248732177 1 //=====[Libraries]=============================================================
ciror00 0:5e7248732177 2
ciror00 0:5e7248732177 3 #include "arm_book_lib.h"
ciror00 0:5e7248732177 4 #include "display.h"
ciror00 0:5e7248732177 5
ciror00 0:5e7248732177 6 //=====[Declaration of private defines]======================================
ciror00 0:5e7248732177 7
ciror00 0:5e7248732177 8 #define DISPLAY_REFRESH_TIME_MS 1000
ciror00 0:5e7248732177 9
ciror00 0:5e7248732177 10 //=====[Declaration and initialization of public global objects]===============
ciror00 0:5e7248732177 11
ciror00 0:5e7248732177 12 Serial uartUsb(USBTX, USBRX);
ciror00 0:5e7248732177 13 AnalogIn ligthSensor(A0);
ciror00 0:5e7248732177 14
ciror00 0:5e7248732177 15 DigitalIn blueButton(BUTTON1);
ciror00 0:5e7248732177 16 DigitalOut verminLed(LED1);
ciror00 0:5e7248732177 17 DigitalOut alarmLed(LED3);
ciror00 0:5e7248732177 18 DigitalOut otherLed(LED2);
ciror00 0:5e7248732177 19
ciror00 0:5e7248732177 20 DigitalOut sirenPin(PE_10); // Buzzer
ciror00 0:5e7248732177 21
ciror00 0:5e7248732177 22 // Interrupciones
ciror00 0:5e7248732177 23 InterruptIn pir(PG_0); // HC-SR501
ciror00 0:5e7248732177 24 InterruptIn shock(PG_1); // EM8343
ciror00 0:5e7248732177 25
ciror00 0:5e7248732177 26 Ticker preventiveCheck;
ciror00 0:5e7248732177 27
ciror00 0:5e7248732177 28 //=====[Declaration of external public global variables]=======================
ciror00 0:5e7248732177 29
ciror00 0:5e7248732177 30 //=====[Declaration and initialization of public global variables]=============
ciror00 0:5e7248732177 31
ciror00 0:5e7248732177 32 float ligth = 0.0;
ciror00 0:5e7248732177 33 int shaking = 0;
ciror00 0:5e7248732177 34
ciror00 0:5e7248732177 35 bool check = OFF;
ciror00 0:5e7248732177 36 bool pirStatus = ON;
ciror00 0:5e7248732177 37 bool paused = OFF;
ciror00 0:5e7248732177 38 bool maintenance = OFF;
ciror00 0:5e7248732177 39 bool verminDetectorState = OFF;
ciror00 0:5e7248732177 40
ciror00 0:5e7248732177 41 //=====[Declaration and initialization of private global variables]============
ciror00 0:5e7248732177 42
ciror00 0:5e7248732177 43 //=====[Declarations (prototypes) of public functions]=========================
ciror00 0:5e7248732177 44
ciror00 0:5e7248732177 45 static void maintenanceMode();
ciror00 0:5e7248732177 46
ciror00 0:5e7248732177 47 static void userInterfaceDisplayInit();
ciror00 0:5e7248732177 48 static void userInterfaceDisplayUpdate(float ligth, bool vermin);
ciror00 0:5e7248732177 49
ciror00 0:5e7248732177 50 static void displayClear();
ciror00 0:5e7248732177 51 static void alarm();
ciror00 0:5e7248732177 52
ciror00 0:5e7248732177 53 void verminDetected();
ciror00 0:5e7248732177 54 void insideStatusIn();
ciror00 0:5e7248732177 55 void insideStatusOut();
ciror00 0:5e7248732177 56
ciror00 0:5e7248732177 57 //=====[Main function, the program entry point after power on or reset]========
ciror00 0:5e7248732177 58
ciror00 0:5e7248732177 59 int main(){
ciror00 0:5e7248732177 60 userInterfaceDisplayInit();
ciror00 0:5e7248732177 61
ciror00 0:5e7248732177 62 shock.mode(PullDown);
ciror00 0:5e7248732177 63 //pir.mode(PullDown);
ciror00 0:5e7248732177 64
ciror00 0:5e7248732177 65 shock.fall(&verminDetected);
ciror00 0:5e7248732177 66 pir.fall(&insideStatusIn);
ciror00 0:5e7248732177 67 preventiveCheck.attach([](){otherLed = !otherLed;}, 10.00);
ciror00 0:5e7248732177 68
ciror00 0:5e7248732177 69 otherLed = OFF;
ciror00 0:5e7248732177 70
ciror00 0:5e7248732177 71 while(1) {
ciror00 0:5e7248732177 72 maintenance = (!blueButton) ? ON : OFF;
ciror00 0:5e7248732177 73
ciror00 0:5e7248732177 74 if(maintenance){
ciror00 0:5e7248732177 75 if(paused == ON){
ciror00 0:5e7248732177 76 paused = OFF;
ciror00 0:5e7248732177 77 userInterfaceDisplayInit();
ciror00 0:5e7248732177 78 }
ciror00 0:5e7248732177 79 ligth = ligthSensor.read() * 100;
ciror00 0:5e7248732177 80 userInterfaceDisplayUpdate(ligth, check);
ciror00 0:5e7248732177 81 alarm();
ciror00 0:5e7248732177 82 }else{
ciror00 0:5e7248732177 83 maintenanceMode();
ciror00 0:5e7248732177 84 }
ciror00 0:5e7248732177 85 }
ciror00 0:5e7248732177 86 }
ciror00 0:5e7248732177 87
ciror00 0:5e7248732177 88 //=====[Implementations of public functions]===================================
ciror00 0:5e7248732177 89
ciror00 0:5e7248732177 90 static void userInterfaceDisplayInit(){
ciror00 0:5e7248732177 91 displayInit( DISPLAY_CONNECTION_I2C_PCF8574_IO_EXPANDER );
ciror00 0:5e7248732177 92 displayClear();
ciror00 0:5e7248732177 93 displayCharPositionWrite ( 0,1 );
ciror00 0:5e7248732177 94 displayStringWrite( "Luz: " );
ciror00 0:5e7248732177 95 displayCharPositionWrite ( 0,2 );
ciror00 0:5e7248732177 96 displayStringWrite( "DET: " );
ciror00 0:5e7248732177 97 }
ciror00 0:5e7248732177 98
ciror00 0:5e7248732177 99 static void userInterfaceDisplayUpdate(float ligth, bool vermin){
ciror00 0:5e7248732177 100 static int accumulatedDisplayTime = 0;
ciror00 0:5e7248732177 101 char ligthString[2];
ciror00 0:5e7248732177 102
ciror00 0:5e7248732177 103 if( accumulatedDisplayTime >= DISPLAY_REFRESH_TIME_MS ) {
ciror00 0:5e7248732177 104 accumulatedDisplayTime = 0;
ciror00 0:5e7248732177 105
ciror00 0:5e7248732177 106 sprintf(ligthString, "%.2f", ligth);
ciror00 0:5e7248732177 107 displayCharPositionWrite ( 7,1 );
ciror00 0:5e7248732177 108 displayStringWrite( ligthString );
ciror00 0:5e7248732177 109 displayCharPositionWrite ( 12,1 );
ciror00 0:5e7248732177 110 displayStringWrite( "lux" );
ciror00 0:5e7248732177 111 uartUsb.printf( "Luz: %f lux\r\n", ligth);
ciror00 0:5e7248732177 112
ciror00 0:5e7248732177 113 displayCharPositionWrite ( 7,2 );
ciror00 0:5e7248732177 114 if(!vermin || pir){
ciror00 0:5e7248732177 115 displayStringWrite("DETECCION");
ciror00 0:5e7248732177 116 }else{
ciror00 0:5e7248732177 117 displayStringWrite("VACIO ");
ciror00 0:5e7248732177 118 }
ciror00 0:5e7248732177 119
ciror00 0:5e7248732177 120 if(verminDetectorState){
ciror00 0:5e7248732177 121 displayCharPositionWrite ( 7,0 );
ciror00 0:5e7248732177 122 displayStringWrite("ALERTA!");
ciror00 0:5e7248732177 123 displayCharPositionWrite ( 7,3 );
ciror00 0:5e7248732177 124 displayStringWrite("ALERTA!");
ciror00 0:5e7248732177 125 }else{
ciror00 0:5e7248732177 126 displayCharPositionWrite ( 7,0 );
ciror00 0:5e7248732177 127 displayStringWrite(" ");
ciror00 0:5e7248732177 128 displayCharPositionWrite ( 7,3 );
ciror00 0:5e7248732177 129 displayStringWrite(" ");
ciror00 0:5e7248732177 130 }
ciror00 0:5e7248732177 131 } else {
ciror00 0:5e7248732177 132 accumulatedDisplayTime = accumulatedDisplayTime + 1;
ciror00 0:5e7248732177 133 }
ciror00 0:5e7248732177 134 }
ciror00 0:5e7248732177 135
ciror00 0:5e7248732177 136 static void maintenanceMode(){
ciror00 0:5e7248732177 137 displayClear();
ciror00 0:5e7248732177 138 displayCharPositionWrite(3,1);
ciror00 0:5e7248732177 139 displayStringWrite("MANTENIMIENTO");
ciror00 0:5e7248732177 140 verminDetectorState = OFF;
ciror00 0:5e7248732177 141 paused = ON;
ciror00 0:5e7248732177 142 }
ciror00 0:5e7248732177 143
ciror00 0:5e7248732177 144 void verminDetected(){
ciror00 0:5e7248732177 145 if(!verminDetectorState){
ciror00 0:5e7248732177 146 verminDetectorState = ON;
ciror00 0:5e7248732177 147 }
ciror00 0:5e7248732177 148 }
ciror00 0:5e7248732177 149
ciror00 0:5e7248732177 150 void insideStatusIn(){
ciror00 0:5e7248732177 151 check = ON;
ciror00 0:5e7248732177 152 verminLed = ON;
ciror00 0:5e7248732177 153 pir.fall(NULL);
ciror00 0:5e7248732177 154 pir.rise(&insideStatusOut);
ciror00 0:5e7248732177 155 }
ciror00 0:5e7248732177 156
ciror00 0:5e7248732177 157 void insideStatusOut(){
ciror00 0:5e7248732177 158 check = OFF;
ciror00 0:5e7248732177 159 verminLed = OFF;
ciror00 0:5e7248732177 160 pir.rise(NULL);
ciror00 0:5e7248732177 161 if(pirStatus){
ciror00 0:5e7248732177 162 pir.fall(&insideStatusIn);
ciror00 0:5e7248732177 163 }
ciror00 0:5e7248732177 164 }
ciror00 0:5e7248732177 165
ciror00 0:5e7248732177 166 static void displayClear(){
ciror00 0:5e7248732177 167 displayCharPositionWrite(0,0);
ciror00 0:5e7248732177 168 displayStringWrite(" ");
ciror00 0:5e7248732177 169 displayCharPositionWrite(0,1);
ciror00 0:5e7248732177 170 displayStringWrite(" ");
ciror00 0:5e7248732177 171 displayCharPositionWrite(0,2);
ciror00 0:5e7248732177 172 displayStringWrite(" ");
ciror00 0:5e7248732177 173 displayCharPositionWrite(0,3);
ciror00 0:5e7248732177 174 displayStringWrite(" ");
ciror00 0:5e7248732177 175 }
ciror00 0:5e7248732177 176
ciror00 0:5e7248732177 177 static void alarm(){
ciror00 0:5e7248732177 178 if(verminDetectorState){
ciror00 0:5e7248732177 179 sirenPin = !sirenPin;
ciror00 0:5e7248732177 180 alarmLed = sirenPin;
ciror00 0:5e7248732177 181 }else{
ciror00 0:5e7248732177 182 sirenPin = ON;
ciror00 0:5e7248732177 183 alarmLed = !sirenPin;
ciror00 0:5e7248732177 184 }
ciror00 0:5e7248732177 185 }