![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Test code for crossing device - no network integration
Revision 0:72476b78d5d6, committed 2017-04-04
- Comitter:
- mkeyser
- Date:
- Tue Apr 04 13:31:27 2017 +0000
- Commit message:
- Initial checkin
Changed in this revision
diff -r 000000000000 -r 72476b78d5d6 Pulse.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Pulse.lib Tue Apr 04 13:31:27 2017 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/NickRyder/code/Pulse/#fb79a4637a64
diff -r 000000000000 -r 72476b78d5d6 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Apr 04 13:31:27 2017 +0000 @@ -0,0 +1,166 @@ +#include "mbed.h" +#include "Pulse.h" +#include "Serial.h" +// from https://developer.mbed.org/users/NickRyder/code/Pulse/docs/fb79a4637a64/classPulseInOut.html +// display is 2 rows of 16 chars each +// speaker is triggered by sending control chars to the LCD. +// instead of clearing LCD, redraw entire thing each time an update is needed + +//TODO +// How do you tell a train from a vehicle? Have train provide position to sensors for temporary disable? +// How does the sensor know a train is coming, to tell people? +// move code into Avnet_ATT sample, use timer instead of wait + +Serial debug(USBTX, USBRX); // tx, rx - for debug +Serial lcd(PTC17, PTC16);//tx, rx - for LCD +PulseInOut gpo(D2); // pulse pin for distance sensor + +DigitalOut red_led(LED_RED); // LED on board +DigitalOut green_led(LED_GREEN); + +int duration=0; +int distance=0; +int TIME_UNTIL_WARN_TRAIN=5; //number of loops before message is sent //TODO SET HIGHER IN PROD +int TRIGGER_DISTANCE=2; //min number of inches for sensor to detect an obstruction +int count_seconds=0; +bool trains_a_comin=false; +bool mute=false; + +void red_light() +{ + red_led=0;//red ON + green_led=1; //green OFF +} + +void yellow_light() +{ + red_led=0; // red ON + green_led=0;// green ON +} + +void no_light() +{ + red_led=1; //red OFF + green_led=1; //green OFF +} + + +void warn_beep() +{ + // short beeps for detection of obstruction, before siren + //set length, set scale, play note - short blip for detection + //plays for 1/8 second, "dit-dit" + lcd.putc(209);//1/32nd note + lcd.putc(215);//scale 3(lowest) + lcd.putc(220);//A note + lcd.putc(209);//1/32nd note + lcd.putc(215);//scale 3(lowest) + lcd.putc(232);//silence + lcd.putc(209);//1/32nd note + lcd.putc(215);//scale 3(lowest) + lcd.putc(220);//A note + lcd.putc(209);//1/32nd note + lcd.putc(215);//scale 3(lowest) + lcd.putc(232);//silence +} + + +void siren() +{ + //longer tone for "get the hell off the track right now" + //plays for 2 seconds + lcd.putc(213);//one second + lcd.putc(216);//scale 4 (middle) + lcd.putc(229);//F note + lcd.putc(213);//one second + lcd.putc(218);//scale 6 (middle) + lcd.putc(229);//F note +} + +int main() +{ + //set up the LCD display - refer to documentation https://www.parallax.com/sites/default/files/downloads/27979-Parallax-Serial-LCDs-Product-Guide-v3.1.pdf + lcd.baud(19200); + lcd.putc(22); // power on + lcd.putc(17); //backlight on + lcd.putc(12); //clear display + wait_ms(5); //required after "clear display" + + //main loop - check for obstruction+warn. If obstruction lasts more than X seconds, send message to train to stop. + while (true) { + //Set up LCD display + // lcd.putc(12); //clear display + // wait_ms(5); //required after clear + + no_light(); + //Check distance sensor + // re-implementing from the Arduino doc at https://www.arduino.cc/en/tutorial/ping + //set as output and send a HIGH pulse of >2 us to ping surroundings + gpo.write(0); + wait_us(2); + gpo.write(1); + wait_us(5); + gpo.write(0); + + //then, set to read, and read value + duration=0; + duration=gpo.read_high_us(); + distance=duration / 74 / 2; + + //TODO: implement timer - if obstruction is here for too_many_seconds, trigger + //debug.printf("Pulse duration: %d\r\n", duration); + //lcd.printf("DISTANCE: %d", distance); + //lcd.putc(13); //carriage return + + debug.printf("Distance (in): %d\r\n", distance); + if (distance < TRIGGER_DISTANCE) { + //TODO: code to start counting + count_seconds++;//TODO this is currently the number of loops, not the number of seconds. FIXME + + if (count_seconds > TIME_UNTIL_WARN_TRAIN) { + red_light(); + if (not mute){ + siren(); + } + + //TODO send message to train ONLY ONCE + debug.printf("SENDING MESSAGE TO TRAIN"); + + lcd.printf("DANGER! "); + lcd.putc(13); //carriage return + lcd.printf("ONCOMING TRAIN!"); + lcd.putc(13); //carriage return + + } + else { + //detection, but still counting + if (not mute){ + warn_beep(); + } + yellow_light(); + + debug.printf("OBSTRUCTION DETECTED"); + lcd.printf("MOVE QUICKLY"); + lcd.putc(13); //carriage return + lcd.printf("ACROSS TRACK"); + lcd.putc(13); //carriage return + + } + } + else{ + no_light(); + debug.printf("ALL CLEAR\r\n"); + //TODO turn off screen when no detection? saves power + lcd.printf("ALL CLEAR "); + lcd.putc(13); //carriage return + lcd.printf(" "); + lcd.putc(13); //carriage return + + count_seconds=0; + } + wait(1); + //no_light(); // toggle led + + } +} +
diff -r 000000000000 -r 72476b78d5d6 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Apr 04 13:31:27 2017 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/mbed_official/code/mbed/builds/093f2bd7b9eb \ No newline at end of file