Test code for crossing device - no network integration

Dependencies:   Pulse mbed

Committer:
mkeyser
Date:
Tue Apr 04 13:31:27 2017 +0000
Revision:
0:72476b78d5d6
Initial checkin

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mkeyser 0:72476b78d5d6 1 #include "mbed.h"
mkeyser 0:72476b78d5d6 2 #include "Pulse.h"
mkeyser 0:72476b78d5d6 3 #include "Serial.h"
mkeyser 0:72476b78d5d6 4 // from https://developer.mbed.org/users/NickRyder/code/Pulse/docs/fb79a4637a64/classPulseInOut.html
mkeyser 0:72476b78d5d6 5 // display is 2 rows of 16 chars each
mkeyser 0:72476b78d5d6 6 // speaker is triggered by sending control chars to the LCD.
mkeyser 0:72476b78d5d6 7 // instead of clearing LCD, redraw entire thing each time an update is needed
mkeyser 0:72476b78d5d6 8
mkeyser 0:72476b78d5d6 9 //TODO
mkeyser 0:72476b78d5d6 10 // How do you tell a train from a vehicle? Have train provide position to sensors for temporary disable?
mkeyser 0:72476b78d5d6 11 // How does the sensor know a train is coming, to tell people?
mkeyser 0:72476b78d5d6 12 // move code into Avnet_ATT sample, use timer instead of wait
mkeyser 0:72476b78d5d6 13
mkeyser 0:72476b78d5d6 14 Serial debug(USBTX, USBRX); // tx, rx - for debug
mkeyser 0:72476b78d5d6 15 Serial lcd(PTC17, PTC16);//tx, rx - for LCD
mkeyser 0:72476b78d5d6 16 PulseInOut gpo(D2); // pulse pin for distance sensor
mkeyser 0:72476b78d5d6 17
mkeyser 0:72476b78d5d6 18 DigitalOut red_led(LED_RED); // LED on board
mkeyser 0:72476b78d5d6 19 DigitalOut green_led(LED_GREEN);
mkeyser 0:72476b78d5d6 20
mkeyser 0:72476b78d5d6 21 int duration=0;
mkeyser 0:72476b78d5d6 22 int distance=0;
mkeyser 0:72476b78d5d6 23 int TIME_UNTIL_WARN_TRAIN=5; //number of loops before message is sent //TODO SET HIGHER IN PROD
mkeyser 0:72476b78d5d6 24 int TRIGGER_DISTANCE=2; //min number of inches for sensor to detect an obstruction
mkeyser 0:72476b78d5d6 25 int count_seconds=0;
mkeyser 0:72476b78d5d6 26 bool trains_a_comin=false;
mkeyser 0:72476b78d5d6 27 bool mute=false;
mkeyser 0:72476b78d5d6 28
mkeyser 0:72476b78d5d6 29 void red_light()
mkeyser 0:72476b78d5d6 30 {
mkeyser 0:72476b78d5d6 31 red_led=0;//red ON
mkeyser 0:72476b78d5d6 32 green_led=1; //green OFF
mkeyser 0:72476b78d5d6 33 }
mkeyser 0:72476b78d5d6 34
mkeyser 0:72476b78d5d6 35 void yellow_light()
mkeyser 0:72476b78d5d6 36 {
mkeyser 0:72476b78d5d6 37 red_led=0; // red ON
mkeyser 0:72476b78d5d6 38 green_led=0;// green ON
mkeyser 0:72476b78d5d6 39 }
mkeyser 0:72476b78d5d6 40
mkeyser 0:72476b78d5d6 41 void no_light()
mkeyser 0:72476b78d5d6 42 {
mkeyser 0:72476b78d5d6 43 red_led=1; //red OFF
mkeyser 0:72476b78d5d6 44 green_led=1; //green OFF
mkeyser 0:72476b78d5d6 45 }
mkeyser 0:72476b78d5d6 46
mkeyser 0:72476b78d5d6 47
mkeyser 0:72476b78d5d6 48 void warn_beep()
mkeyser 0:72476b78d5d6 49 {
mkeyser 0:72476b78d5d6 50 // short beeps for detection of obstruction, before siren
mkeyser 0:72476b78d5d6 51 //set length, set scale, play note - short blip for detection
mkeyser 0:72476b78d5d6 52 //plays for 1/8 second, "dit-dit"
mkeyser 0:72476b78d5d6 53 lcd.putc(209);//1/32nd note
mkeyser 0:72476b78d5d6 54 lcd.putc(215);//scale 3(lowest)
mkeyser 0:72476b78d5d6 55 lcd.putc(220);//A note
mkeyser 0:72476b78d5d6 56 lcd.putc(209);//1/32nd note
mkeyser 0:72476b78d5d6 57 lcd.putc(215);//scale 3(lowest)
mkeyser 0:72476b78d5d6 58 lcd.putc(232);//silence
mkeyser 0:72476b78d5d6 59 lcd.putc(209);//1/32nd note
mkeyser 0:72476b78d5d6 60 lcd.putc(215);//scale 3(lowest)
mkeyser 0:72476b78d5d6 61 lcd.putc(220);//A note
mkeyser 0:72476b78d5d6 62 lcd.putc(209);//1/32nd note
mkeyser 0:72476b78d5d6 63 lcd.putc(215);//scale 3(lowest)
mkeyser 0:72476b78d5d6 64 lcd.putc(232);//silence
mkeyser 0:72476b78d5d6 65 }
mkeyser 0:72476b78d5d6 66
mkeyser 0:72476b78d5d6 67
mkeyser 0:72476b78d5d6 68 void siren()
mkeyser 0:72476b78d5d6 69 {
mkeyser 0:72476b78d5d6 70 //longer tone for "get the hell off the track right now"
mkeyser 0:72476b78d5d6 71 //plays for 2 seconds
mkeyser 0:72476b78d5d6 72 lcd.putc(213);//one second
mkeyser 0:72476b78d5d6 73 lcd.putc(216);//scale 4 (middle)
mkeyser 0:72476b78d5d6 74 lcd.putc(229);//F note
mkeyser 0:72476b78d5d6 75 lcd.putc(213);//one second
mkeyser 0:72476b78d5d6 76 lcd.putc(218);//scale 6 (middle)
mkeyser 0:72476b78d5d6 77 lcd.putc(229);//F note
mkeyser 0:72476b78d5d6 78 }
mkeyser 0:72476b78d5d6 79
mkeyser 0:72476b78d5d6 80 int main()
mkeyser 0:72476b78d5d6 81 {
mkeyser 0:72476b78d5d6 82 //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
mkeyser 0:72476b78d5d6 83 lcd.baud(19200);
mkeyser 0:72476b78d5d6 84 lcd.putc(22); // power on
mkeyser 0:72476b78d5d6 85 lcd.putc(17); //backlight on
mkeyser 0:72476b78d5d6 86 lcd.putc(12); //clear display
mkeyser 0:72476b78d5d6 87 wait_ms(5); //required after "clear display"
mkeyser 0:72476b78d5d6 88
mkeyser 0:72476b78d5d6 89 //main loop - check for obstruction+warn. If obstruction lasts more than X seconds, send message to train to stop.
mkeyser 0:72476b78d5d6 90 while (true) {
mkeyser 0:72476b78d5d6 91 //Set up LCD display
mkeyser 0:72476b78d5d6 92 // lcd.putc(12); //clear display
mkeyser 0:72476b78d5d6 93 // wait_ms(5); //required after clear
mkeyser 0:72476b78d5d6 94
mkeyser 0:72476b78d5d6 95 no_light();
mkeyser 0:72476b78d5d6 96 //Check distance sensor
mkeyser 0:72476b78d5d6 97 // re-implementing from the Arduino doc at https://www.arduino.cc/en/tutorial/ping
mkeyser 0:72476b78d5d6 98 //set as output and send a HIGH pulse of >2 us to ping surroundings
mkeyser 0:72476b78d5d6 99 gpo.write(0);
mkeyser 0:72476b78d5d6 100 wait_us(2);
mkeyser 0:72476b78d5d6 101 gpo.write(1);
mkeyser 0:72476b78d5d6 102 wait_us(5);
mkeyser 0:72476b78d5d6 103 gpo.write(0);
mkeyser 0:72476b78d5d6 104
mkeyser 0:72476b78d5d6 105 //then, set to read, and read value
mkeyser 0:72476b78d5d6 106 duration=0;
mkeyser 0:72476b78d5d6 107 duration=gpo.read_high_us();
mkeyser 0:72476b78d5d6 108 distance=duration / 74 / 2;
mkeyser 0:72476b78d5d6 109
mkeyser 0:72476b78d5d6 110 //TODO: implement timer - if obstruction is here for too_many_seconds, trigger
mkeyser 0:72476b78d5d6 111 //debug.printf("Pulse duration: %d\r\n", duration);
mkeyser 0:72476b78d5d6 112 //lcd.printf("DISTANCE: %d", distance);
mkeyser 0:72476b78d5d6 113 //lcd.putc(13); //carriage return
mkeyser 0:72476b78d5d6 114
mkeyser 0:72476b78d5d6 115 debug.printf("Distance (in): %d\r\n", distance);
mkeyser 0:72476b78d5d6 116 if (distance < TRIGGER_DISTANCE) {
mkeyser 0:72476b78d5d6 117 //TODO: code to start counting
mkeyser 0:72476b78d5d6 118 count_seconds++;//TODO this is currently the number of loops, not the number of seconds. FIXME
mkeyser 0:72476b78d5d6 119
mkeyser 0:72476b78d5d6 120 if (count_seconds > TIME_UNTIL_WARN_TRAIN) {
mkeyser 0:72476b78d5d6 121 red_light();
mkeyser 0:72476b78d5d6 122 if (not mute){
mkeyser 0:72476b78d5d6 123 siren();
mkeyser 0:72476b78d5d6 124 }
mkeyser 0:72476b78d5d6 125
mkeyser 0:72476b78d5d6 126 //TODO send message to train ONLY ONCE
mkeyser 0:72476b78d5d6 127 debug.printf("SENDING MESSAGE TO TRAIN");
mkeyser 0:72476b78d5d6 128
mkeyser 0:72476b78d5d6 129 lcd.printf("DANGER! ");
mkeyser 0:72476b78d5d6 130 lcd.putc(13); //carriage return
mkeyser 0:72476b78d5d6 131 lcd.printf("ONCOMING TRAIN!");
mkeyser 0:72476b78d5d6 132 lcd.putc(13); //carriage return
mkeyser 0:72476b78d5d6 133
mkeyser 0:72476b78d5d6 134 }
mkeyser 0:72476b78d5d6 135 else {
mkeyser 0:72476b78d5d6 136 //detection, but still counting
mkeyser 0:72476b78d5d6 137 if (not mute){
mkeyser 0:72476b78d5d6 138 warn_beep();
mkeyser 0:72476b78d5d6 139 }
mkeyser 0:72476b78d5d6 140 yellow_light();
mkeyser 0:72476b78d5d6 141
mkeyser 0:72476b78d5d6 142 debug.printf("OBSTRUCTION DETECTED");
mkeyser 0:72476b78d5d6 143 lcd.printf("MOVE QUICKLY");
mkeyser 0:72476b78d5d6 144 lcd.putc(13); //carriage return
mkeyser 0:72476b78d5d6 145 lcd.printf("ACROSS TRACK");
mkeyser 0:72476b78d5d6 146 lcd.putc(13); //carriage return
mkeyser 0:72476b78d5d6 147
mkeyser 0:72476b78d5d6 148 }
mkeyser 0:72476b78d5d6 149 }
mkeyser 0:72476b78d5d6 150 else{
mkeyser 0:72476b78d5d6 151 no_light();
mkeyser 0:72476b78d5d6 152 debug.printf("ALL CLEAR\r\n");
mkeyser 0:72476b78d5d6 153 //TODO turn off screen when no detection? saves power
mkeyser 0:72476b78d5d6 154 lcd.printf("ALL CLEAR ");
mkeyser 0:72476b78d5d6 155 lcd.putc(13); //carriage return
mkeyser 0:72476b78d5d6 156 lcd.printf(" ");
mkeyser 0:72476b78d5d6 157 lcd.putc(13); //carriage return
mkeyser 0:72476b78d5d6 158
mkeyser 0:72476b78d5d6 159 count_seconds=0;
mkeyser 0:72476b78d5d6 160 }
mkeyser 0:72476b78d5d6 161 wait(1);
mkeyser 0:72476b78d5d6 162 //no_light(); // toggle led
mkeyser 0:72476b78d5d6 163
mkeyser 0:72476b78d5d6 164 }
mkeyser 0:72476b78d5d6 165 }
mkeyser 0:72476b78d5d6 166