i0ts3c
/
test_crossing
Test code for crossing device - no network integration
main.cpp@0:72476b78d5d6, 2017-04-04 (annotated)
- Committer:
- mkeyser
- Date:
- Tue Apr 04 13:31:27 2017 +0000
- Revision:
- 0:72476b78d5d6
Initial checkin
Who changed what in which revision?
User | Revision | Line number | New 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 |