Sistema de supervision y alarma para deposito de comida de animales

main.cpp

Committer:
ciror00
Date:
2021-05-14
Revision:
0:5e7248732177

File content as of revision 0:5e7248732177:

//=====[Libraries]=============================================================

#include "arm_book_lib.h"
#include "display.h"

//=====[Declaration of private defines]======================================

#define DISPLAY_REFRESH_TIME_MS 1000

//=====[Declaration and initialization of public global objects]===============

Serial uartUsb(USBTX, USBRX);
AnalogIn ligthSensor(A0);

DigitalIn blueButton(BUTTON1);
DigitalOut verminLed(LED1);
DigitalOut alarmLed(LED3);
DigitalOut otherLed(LED2);

DigitalOut sirenPin(PE_10); // Buzzer

// Interrupciones
InterruptIn pir(PG_0); // HC-SR501
InterruptIn shock(PG_1); // EM8343

Ticker preventiveCheck;

//=====[Declaration of external public global variables]=======================

//=====[Declaration and initialization of public global variables]=============

float ligth = 0.0;
int shaking = 0;

bool check = OFF;
bool pirStatus = ON;
bool paused = OFF;
bool maintenance = OFF;
bool verminDetectorState = OFF;

//=====[Declaration and initialization of private global variables]============

//=====[Declarations (prototypes) of public functions]=========================

static void maintenanceMode();

static void userInterfaceDisplayInit();
static void userInterfaceDisplayUpdate(float ligth, bool vermin);

static void displayClear();
static void alarm();

void verminDetected();
void insideStatusIn();
void insideStatusOut();

//=====[Main function, the program entry point after power on or reset]========

int main(){
    userInterfaceDisplayInit();
    
    shock.mode(PullDown);
    //pir.mode(PullDown);

    shock.fall(&verminDetected);
    pir.fall(&insideStatusIn);
    preventiveCheck.attach([](){otherLed = !otherLed;}, 10.00);
    
    otherLed = OFF;
    
    while(1) {
        maintenance = (!blueButton) ? ON : OFF;

        if(maintenance){
            if(paused == ON){
                paused = OFF;
                userInterfaceDisplayInit();
            }
            ligth = ligthSensor.read() * 100;
            userInterfaceDisplayUpdate(ligth, check);
            alarm();
        }else{
            maintenanceMode();
        }
    }
}

//=====[Implementations of public functions]===================================

static void userInterfaceDisplayInit(){
    displayInit( DISPLAY_CONNECTION_I2C_PCF8574_IO_EXPANDER );
    displayClear();
    displayCharPositionWrite ( 0,1 );
    displayStringWrite( "Luz: " );
    displayCharPositionWrite ( 0,2 );
    displayStringWrite( "DET: " );
}

static void userInterfaceDisplayUpdate(float ligth, bool vermin){
    static int accumulatedDisplayTime = 0;
    char ligthString[2];
    
    if( accumulatedDisplayTime >= DISPLAY_REFRESH_TIME_MS ) {
        accumulatedDisplayTime = 0;

        sprintf(ligthString, "%.2f", ligth);
        displayCharPositionWrite ( 7,1 );
        displayStringWrite( ligthString );
        displayCharPositionWrite ( 12,1 );
        displayStringWrite( "lux" );
        uartUsb.printf( "Luz: %f lux\r\n", ligth); 
        
        displayCharPositionWrite ( 7,2 );
        if(!vermin || pir){
            displayStringWrite("DETECCION");
        }else{
            displayStringWrite("VACIO    ");
        }
        
        if(verminDetectorState){
            displayCharPositionWrite ( 7,0 );
            displayStringWrite("ALERTA!");
            displayCharPositionWrite ( 7,3 );
            displayStringWrite("ALERTA!");
        }else{
            displayCharPositionWrite ( 7,0 );
            displayStringWrite("       ");
            displayCharPositionWrite ( 7,3 );
            displayStringWrite("       ");
        }
    } else {
        accumulatedDisplayTime = accumulatedDisplayTime + 1;        
    } 
}

static void maintenanceMode(){
    displayClear();
    displayCharPositionWrite(3,1);
    displayStringWrite("MANTENIMIENTO");
    verminDetectorState = OFF;
    paused = ON;
}

void verminDetected(){
    if(!verminDetectorState){
        verminDetectorState = ON;
    }
}

void insideStatusIn(){
    check = ON;
    verminLed = ON;
    pir.fall(NULL);
    pir.rise(&insideStatusOut);
}

void insideStatusOut(){
    check = OFF;
    verminLed = OFF;
    pir.rise(NULL);
    if(pirStatus){
        pir.fall(&insideStatusIn);
    }
}

static void displayClear(){
    displayCharPositionWrite(0,0);
    displayStringWrite("                    ");
    displayCharPositionWrite(0,1);
    displayStringWrite("                    ");
    displayCharPositionWrite(0,2);
    displayStringWrite("                    ");
    displayCharPositionWrite(0,3);
    displayStringWrite("                    ");
}

static void alarm(){
    if(verminDetectorState){
        sirenPin = !sirenPin;
        alarmLed = sirenPin;
    }else{
        sirenPin = ON;
        alarmLed = !sirenPin;
    }
}