This project is intended to release you the basic Automatic Sliding Gate. This project is based on the NUCLEO-L152RE.
Diff: main.cpp
- Revision:
- 0:b05cd2add81b
- Child:
- 1:ab2cd6391528
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon May 05 18:58:15 2014 +0000 @@ -0,0 +1,651 @@ +#include "mbed.h" + +// By www.emcu.it +// see also: +// http://www.emcu.it/NUCLEOevaBoards/Nucleo-L152RE-AutomaticSlidingGate/AutomSlidGate.html +// http://www.emcu.it/NUCLEOevaBoards/NUCLEOevaBoards.html +// +// Up to now the automatic closure start after 10sec. This because is not implemented the TbC. +// Up to now the the following functions are not implemented: +// AT (AntiTamper) +// TbC +// TempCurLight and consequently the ReleLight +// LightSensor +// SensCrep +// + +//------------------------------------ +// Hyperterminal configuration +// 9600 bauds, 8-bit data, no parity +//------------------------------------ + +Serial pc(SERIAL_TX, SERIAL_RX); + +Timeout to1; // Interrupt use for flashing +Timeout to2; // Interrupt use for flashing the GREEN led that is on NUCLEO-L152RE board +Timeout to3; // Interrupt used for automatic reclosure + + +// ADC Signals +AnalogIn TempCurLight(PA_1); // Value from a potentiometer that sets the turn-on time of the courtesy light +AnalogIn SensCrep(PA_0); // Value from a potentiometer that sets the threshold for day and night +AnalogIn LightSensor(PA_4); // Crepuscular sensor + +// Input Signals +DigitalIn PP(PB_3); +DigitalIn FOTO(PB_5); +DigitalIn EMERGENCY(PB_4); +DigitalIn FCA(PA_7); +DigitalIn FCC(PA_6); +DigitalIn RA(PA_10); +DigitalIn BlueButton(USER_BUTTON); // This is Blue-Button and is on NUCLEO-L153RE + +// OutPut Signals +DigitalOut ReleLight(PB_10); +DigitalOut M1Com(PA_8); +DigitalOut M1Open(PA_9); +DigitalOut M1Close(PC_7); +DigitalOut Flashing(PB_6); +DigitalOut myled(LED1); // This LED is on NUCLEO-L153RE + +void SelfTest(void); +void TestPP(void); +void TestFCA(void); +void TestFCC(void); +void TestFOTO(void); +void TestEMERGENCY(void); +void TestRA(void); +void cb1(void); +void IntFlash(void); +void IntMyled(void); +void IntDLYforRA(void); + +#define DLY 0.2 // Delay 200mS for Debounce +#define DLYFlash 0.6 // DLY for Flashing +#define DLYMyled 0.5 +#define DLYallarmFoto 0.2 // 0.2 == 200mS +#define DLYbeforeToStart 1.5 // 1.5 == 1,5sec +#define DLYforAutoReclosure 10 // 10 == 10sec +#define Pressed 0 +#define NotPressed 1 +#define OK 0 +#define NotOK 1 +#define FAIL 0 +#define NotFAIL 1 +#define YES 1 +#define NoYES 0 + +#define OFF 0 +#define ON 1 +#define Opening 0 +#define Closing 1 +#define Undefine 3 + +int PP_mem = Pressed; // Last value of PP +int EMERGENCY_mem = Pressed; +int FOTO_mem = OK; +int FCA_mem = Pressed; +int FCC_mem = Pressed; +int RA_mem = ON; +uint16_t meas = 0; +uint16_t meas1 = 0; +uint16_t meas2 = 0; +int ONOFF_Flashing = OFF; +int LastMovement = Undefine; +int RA_OnOff = OFF; +int ChiudiBy_IntDLYforRA = OFF; + + + +int main() + { + + // Turn on the InPut PullUp resistors + // For more immunity connect a 4K7 PullUp resistor to the InPut pins. + PP.mode(PullUp); + FOTO.mode(PullUp); + EMERGENCY.mode(PullUp); + FCA.mode(PullUp); + FCC.mode(PullUp); + RA.mode(PullUp); + + to2.attach(&IntMyled, DLYMyled); // Enabling flassing GREEN led that is on NUCLEO-L152RE board + // Interrupt Delay + ONOFF_Flashing = OFF; + + to1.attach(&IntFlash, DLYFlash); // Enabling flassing of FLASH lamp that indicate: GATE movement + Flashing = 1; // Means Flashing Lamp OFF + + // to2.attach(&IntDLYforRA, DLYforAutoReclosure); // Enabling time for auto reclosure + + + + // If at PowerOn BlueButton is pressed is call the SelfTest routine + if (BlueButton == Pressed) + SelfTest(); + + // MAIN Loop + pc.printf("\n\r\n\rMAIN loop\n\r"); + + while(1) + { + TestFOTO(); + if (FOTO_mem == OK) + ONOFF_Flashing = OFF; + + meas = TempCurLight.read_u16(); // Value from a potentiometer that sets the turn-on time of the courtesy light + meas1 = SensCrep.read_u16(); // Value from a potentiometer that sets the threshold for day and night + meas2 = LightSensor.read_u16(); // Crepuscular sensor + // pc.printf("TempCurLight is:%d - SensCrep is:%d - LightSensor is:%d\n", meas, meas1, meas2); + + + TestRA(); // Test the status of RA -> Automatic Reclosure + // RA == 1 == Automatic Reclosure + // RA == 0 == NO automatic reclosure + // The delay before to close depend of the value of TbC + + + // Test if there is the request for Auto Reclosure + if (ChiudiBy_IntDLYforRA == ON) + { + TestPP(); + TestFCC(); + TestFCA(); + TestFOTO(); + TestEMERGENCY(); + ChiudiBy_IntDLYforRA = OFF; // Disable the Auto Reclosure + if (FCA_mem == Pressed & FOTO_mem == OK & EMERGENCY_mem == NotPressed) + { + pc.printf("Start to CLOSE\n\r"); + LastMovement = Closing; // Memorizing the current CLOSING movement + M1Com = ON; + wait(0.1); + M1Close = ON; + wait(0.1); + // Waiting FCC or PP Again) + TestPP(); // Called for clean the buffer + TestFOTO(); + while (FCC_mem == NotPressed & PP_mem == NotPressed & FOTO_mem == OK & EMERGENCY_mem == NotPressed) + { + TestEMERGENCY(); + TestFOTO(); + TestFCC(); + TestPP(); + } + M1Com = OFF; + wait(0.1); + M1Close = OFF; + wait(0.1); + ONOFF_Flashing = OFF; + if (FOTO_mem == NotOK) + pc.printf("END CLOSE - STOP by FOTO ***\n\r"); + else if (EMERGENCY_mem == Pressed) + pc.printf("END CLOSE - STOP by EMERGENCY ***\n\r"); + else + pc.printf("END CLOSE\n\r"); + wait(1); + } + } + + + // Test the status of PP + TestPP(); + if (PP_mem == Pressed) + { + ONOFF_Flashing = ON; + to1.attach(&IntFlash, DLYFlash); // Enabling flassing of FLASH lamp that indicate: GATE movement + // Waiting the release of PP + while(PP_mem == Pressed) + TestPP(); + // Delay before start the gate + wait(DLYbeforeToStart); + + // Test the status of FCC, FCA & FOTO + TestFCA(); + TestFCC(); + TestFOTO(); + TestEMERGENCY(); + TestRA(); + + pc.printf("FCA==%d - FCC==%d - FOTO==%d - EMERGENCY==%d - RA==%d\n\r", FCA_mem, FCC_mem, FOTO_mem, EMERGENCY_mem, RA_mem ); + + // Check if must be OPEN + if (FCC_mem == Pressed & FOTO_mem == OK & EMERGENCY_mem == NotPressed) + { + pc.printf("Start to OPEN\n\r"); + LastMovement = Opening; // Memorizing the current OPENING movement + M1Com = ON; + wait(0.1); + M1Open = ON; + wait(0.1); + // Waiting FCA or PP Again) + TestPP(); // Called for clean the buffer + while (FCA_mem == NotPressed & PP_mem == NotPressed & EMERGENCY_mem == NotPressed) + { + TestEMERGENCY(); + TestFCA(); + TestPP(); + } + M1Com = OFF; + wait(0.1); + M1Open = OFF; + wait(0.1); + ONOFF_Flashing = OFF; + if (EMERGENCY_mem == Pressed) + pc.printf("END OPEN - STOP by EMERGENCY ***\n\r"); + else if (PP_mem == Pressed) + pc.printf("END OPEN - STOP by PP ***\n\r"); + else + { + pc.printf("END OPEN\n\r"); + TestRA(); + if (RA_mem == ON) + { + RA_OnOff = ON; + to3.attach(&IntDLYforRA, DLYforAutoReclosure); // Enabling time for auto reclosure + } + } + wait(1); + } + + // Check if must be CLOSE + else if (FCA_mem == Pressed & FOTO_mem == OK & EMERGENCY_mem == NotPressed) + { + pc.printf("Start to CLOSE\n\r"); + LastMovement = Closing; // Memorizing the current CLOSING movement + M1Com = ON; + wait(0.1); + M1Close = ON; + wait(0.1); + // Waiting FCC or PP Again) + TestPP(); // Called for clean the buffer + TestFOTO(); + while (FCC_mem == NotPressed & PP_mem == NotPressed & FOTO_mem == OK & EMERGENCY_mem == NotPressed) + { + TestEMERGENCY(); + TestFOTO(); + TestFCC(); + TestPP(); + } + M1Com = OFF; + wait(0.1); + M1Close = OFF; + wait(0.1); + ONOFF_Flashing = OFF; + if (FOTO_mem == NotOK) + pc.printf("END CLOSE - STOP by FOTO ***\n\r"); + else if (EMERGENCY_mem == Pressed) + pc.printf("END CLOSE - STOP by EMERGENCY ***\n\r"); + else + pc.printf("END CLOSE\n\r"); + wait(1); + } + + else if ( (LastMovement == Closing | LastMovement == Undefine) & (FOTO_mem == OK & EMERGENCY_mem == NotPressed)) + { + pc.printf("Start to OPEN\n\r"); + LastMovement = Opening; // Memorizing the current OPENING movement + M1Com = ON; + wait(0.1); + M1Open = ON; + wait(0.1); + // Waiting FCA or PP Again) + TestPP(); // Called for clean the buffer + while (FCA_mem == NotPressed & PP_mem == NotPressed & EMERGENCY_mem == NotPressed) + { + TestEMERGENCY(); + TestFCA(); + TestPP(); + } + M1Com = OFF; + wait(0.1); + M1Open = OFF; + wait(0.1); + ONOFF_Flashing = OFF; + if (EMERGENCY_mem == Pressed) + pc.printf("END OPEN - STOP by EMERGENCY ***\n\r"); + else if (PP_mem == Pressed) + pc.printf("END OPEN - STOP by PP ***\n\r"); + else + { + pc.printf("END OPEN\n\r"); + TestRA(); + if (RA_mem == ON) + { + RA_OnOff = ON; + to3.attach(&IntDLYforRA, DLYforAutoReclosure); // Enabling time for auto reclosure + } + } + wait(1); + } + + else if ( LastMovement == Opening & FOTO_mem == OK & EMERGENCY_mem == NotPressed) + { + pc.printf("Start to CLOSE\n\r"); + LastMovement = Closing; // Memorizing the current CLOSING movement + M1Com = ON; + wait(0.1); + M1Close = ON; + wait(0.1); + // Waiting FCC or PP Again) + TestPP(); // Called for clean the buffer + TestFOTO(); + while (FCC_mem == NotPressed & PP_mem == NotPressed & FOTO_mem == OK & EMERGENCY_mem == NotPressed) + { + TestEMERGENCY(); + TestFOTO(); + TestFCC(); + TestPP(); + } + M1Com = OFF; + wait(0.1); + M1Close = OFF; + wait(0.1); + ONOFF_Flashing = OFF; + if (EMERGENCY_mem == Pressed) + pc.printf("END CLOSE - STOP by EMERGENCY ***\n\r"); + else + pc.printf("END CLOSE\n\r"); + wait(1); + } + + } + } +} + + + +// **************************** FUNCTIONS ************************************** + +// Flshing period for gate lamp indicator - It is define in DLYFlash +void IntFlash(void) { + if (ONOFF_Flashing == ON) + Flashing = !Flashing; + else + Flashing = 1; // Means Flashing Lamp OFF + to1.detach(); + if (FOTO_mem == NotOK) + to1.attach(&IntFlash, DLYallarmFoto); // Highlight a problem on the FOTO (photocell) - this line reload Interrupt + else + to1.attach(&IntFlash, DLYFlash); // this line reload Interrupt +} + + +// Flashing Green LED that is on NUCLEO board +void IntMyled(void) { + myled = !myled; + to2.detach(); + to2.attach(&IntMyled, DLYMyled); // this line reload Interrupt +} + + +// Time must be wait before do the automatic reclosure +void IntDLYforRA(void) { + if (RA_OnOff == ON) + { + pc.printf("Adesso deve partire la richiusura automatica\n\r"); + ChiudiBy_IntDLYforRA = ON; + } + to3.detach(); + // to2.attach(&IntDLYforRA, DLYforAutoReclosure); // this line reload Interrupt +} + +// Test the status of FOTO and save it in FOTO_mem +void TestFOTO(void) +{ + if (FOTO == 0 & FOTO_mem == NotOK) + { // FOTO is pressed, we do the delay for Debounce + wait(DLY); + if (FOTO == 0) + { + FOTO_mem = OK; + pc.printf("FOTO is OK (0)\n\r"); + } + else + FOTO_mem = NotOK; + } + if (FOTO == 1) + FOTO_mem = NotOK; +} + + +// Test the status of EMERGENCY and save it in EMERGENCY_mem +void TestEMERGENCY(void) +{ + if (EMERGENCY == 0 & EMERGENCY_mem == NotPressed) + { // EMERGENCY is pressed, we do the delay for Debounce + wait(DLY); + if (EMERGENCY == 0) + { + EMERGENCY_mem = Pressed; + pc.printf("EMERGENCY is PRESSED (0)\n\r"); + } + else + EMERGENCY_mem = NotPressed; + } + if (EMERGENCY == 1) + EMERGENCY_mem = NotPressed; +} + + +// Test the status of RA and save it in RA_mem +void TestRA(void) +{ + if (RA == 0 & RA_mem == ON) + { // RA is OFF (0), we do the delay for Debounce + wait(DLY); + if (RA == 0) + { + RA_mem = OFF; + pc.printf("RA is OFF (0)\n\r"); + } + else + RA_mem = ON; + } + if (RA == 1) + RA_mem = ON; +} + + +// Test the status of FCC and save it in FCC_mem +void TestFCC(void) +{ + if (FCC == 0 & FCC_mem == NotPressed) + { // FCC is pressed, we do the delay for Debounce + wait(DLY); + if (FCC == 0) + { + FCC_mem = Pressed; + pc.printf("FCC is PRESSED (0)\n\r"); + } + else + FCC_mem = NotPressed; + } + if (FCC == 1) + FCC_mem = NotPressed; +} + + +// Test the status of FCA and save it in FCA_mem +void TestFCA(void) +{ + if (FCA == 0 & FCA_mem == NotPressed) + { // FCA is pressed, we do the delay for Debounce + wait(DLY); + if (FCA == 0) + { + FCA_mem = Pressed; + pc.printf("FCA is PRESSED (0)\n\r"); + } + else + FCA_mem = NotPressed; + } + if (FCA == 1) + FCA_mem = NotPressed; +} + + +// Test the status of PP and save it in PP_mem +void TestPP(void) +{ + // Test PP + if (PP == 0 & PP_mem == NotPressed) + { // PP is pressed, we do the delay for Debounce + wait(DLY); + if (PP == 0) + { + PP_mem = Pressed; + pc.printf("PP is PRESSED (0)\n\r"); + } + else + PP_mem = NotPressed; + } + if (PP == 1) + PP_mem = NotPressed; +} + + + +// Function for testing I/O and ADC used in the program *********************** +void SelfTest(void) + { + pc.printf("\n\rProgram for Test CancSCO I/O and ADC\n\r"); + pc.printf("ADC test, press PP for exit from ADC test\n\r"); + + while(PP == NotPressed) + { + meas = TempCurLight.read_u16(); // Converts and read the analog input value + meas1 = SensCrep.read_u16(); // Converts and read the analog input value + meas2 = LightSensor.read_u16(); // Converts and read the analog input value + pc.printf("TempCurLight is:%d - SensCrep is:%d - LightSensor is:%d\n\r", meas, meas1, meas2); + wait(2); + } + + pc.printf("I/O test, press EMERGENCY for exit from I/O test\n\r"); + while(EMERGENCY == NotPressed) + { + // Test OutPut pin ******************************** + if (BlueButton == Pressed) + { + pc.printf("Sequence for testing OutPut\n\r"); + ReleLight = 1; + wait(0.5); + ReleLight = 0; + M1Com = 1; + wait(0.5); + M1Com = 0; + M1Open = 1; + wait(0.5); + M1Open = 0; + M1Close = 1; + wait(0.5); + M1Close = 0; + Flashing = 1; + wait(0.5); + Flashing = 0; + } + // END - Test OutPut pin ************************** + + + // Test Input Signals ***************************** + + // Test FCA + if (FCA == 0 & FCA_mem == NotPressed) + { // FCA is pressed, we do the delay for Debounce + wait(DLY); + if (FCA == 0) + { + M1Close = 1; + FCA_mem = Pressed; + pc.printf("FCA is PRESSED (0)\n\r"); + } + else + FCA_mem = NotPressed; + } + if (FCA == 1) + { + FCA_mem = NotPressed; + M1Close = 0; + } + + // Test FCC + if (FCC == 0 & FCC_mem == NotPressed) + { // FCC is pressed, we do the delay for Debounce + wait(DLY); + if (FCC == 0) + { + Flashing = 1; + FCC_mem = Pressed; + pc.printf("FCC is PRESSED (0)\n\r"); + } + else + FCC_mem = NotPressed; + } + if (FCC == 1) + { + FCC_mem = NotPressed; + Flashing = 0; + } + + // Test PP + if (PP == 0 & PP_mem == NotPressed) + { // PP is pressed, we do the delay for Debounce + wait(DLY); + if (PP == 0) + { + ReleLight = 1; + PP_mem = Pressed; + pc.printf("PP is PRESSED (0)\n\r"); + } + else + PP_mem = NotPressed; + } + if (PP == 1) + { + PP_mem = NotPressed; + ReleLight = 0; + } + + // Test FOTO + if (FOTO == 0 & FOTO_mem == NotOK) + { // FOTO is pressed, we do the delay for Debounce + wait(DLY); + if (FOTO == 0) + { + M1Com = 1; + FOTO_mem = OK; + pc.printf("FOTO is ACTIVE (0)\n\r"); + } + else + FOTO_mem = NotOK; + } + if (FOTO == 1) + { + FOTO_mem = NotOK; + M1Com = 0; + } + + // Test EMERGENCY + if (EMERGENCY == 0 & EMERGENCY_mem == NotPressed) + { // EMERGENCY is pressed, we do the delay for Debounce + wait(DLY); + if (EMERGENCY == 0) + { + M1Open = 1; + EMERGENCY_mem = Pressed; + pc.printf("EMERGENCY is PRESSED (0)\n\r"); + } + else + EMERGENCY_mem = NotPressed; + } + if (EMERGENCY == 1) + { + EMERGENCY_mem = NotPressed; + M1Open = 0; + } + // END - Test Input Signals ************************** + } +} +// END - Function for testing I/O and ADC used in the program *********************** + +// **************************** END FUNCTIONS ***************************************