Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:1aa2a4b0063a, 2020-11-12 (annotated)
- Committer:
- judith_bizimana
- Date:
- Thu Nov 12 18:17:37 2020 +0000
- Revision:
- 0:1aa2a4b0063a
Traffic project with sound
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
judith_bizimana | 0:1aa2a4b0063a | 1 | #include "mbed.h" // Include the library of Mbed |
judith_bizimana | 0:1aa2a4b0063a | 2 | #include "C12832.h" // Include the library of the specific LCD |
judith_bizimana | 0:1aa2a4b0063a | 3 | #include "mbed_trace.h" |
judith_bizimana | 0:1aa2a4b0063a | 4 | #include "mbed_events.h" |
judith_bizimana | 0:1aa2a4b0063a | 5 | #include "LoRaWANInterface.h" |
judith_bizimana | 0:1aa2a4b0063a | 6 | #include "SX1276_LoRaRadio.h" |
judith_bizimana | 0:1aa2a4b0063a | 7 | |
judith_bizimana | 0:1aa2a4b0063a | 8 | #define YELLOWBLINKINGDURATION 10 |
judith_bizimana | 0:1aa2a4b0063a | 9 | #define REDLIGHTONDURATION 10 |
judith_bizimana | 0:1aa2a4b0063a | 10 | // The port we're sending and receiving on |
judith_bizimana | 0:1aa2a4b0063a | 11 | #define MBED_CONF_LORA_APP_PORT 15 |
judith_bizimana | 0:1aa2a4b0063a | 12 | //#define DEVICEID Jacqueline |
judith_bizimana | 0:1aa2a4b0063a | 13 | |
judith_bizimana | 0:1aa2a4b0063a | 14 | DigitalOut yellowled(p15, 1); // Initializing the yellow light ON (same as yellowled = 1) |
judith_bizimana | 0:1aa2a4b0063a | 15 | DigitalOut redled(p17, 0); // Initializing the Red light to OFF (same as redled = 0) |
judith_bizimana | 0:1aa2a4b0063a | 16 | PwmOut speaker(p21);//pin for sound speaker |
judith_bizimana | 0:1aa2a4b0063a | 17 | InterruptIn pedestrianbutton(p16); |
judith_bizimana | 0:1aa2a4b0063a | 18 | |
judith_bizimana | 0:1aa2a4b0063a | 19 | C12832 lcd(SPI_MOSI, SPI_SCK, SPI_MISO, p8, p11); // create an instance of LCD |
judith_bizimana | 0:1aa2a4b0063a | 20 | |
judith_bizimana | 0:1aa2a4b0063a | 21 | int state = 0; // State variable indicating that YELLOW LIGHT IS ON |
judith_bizimana | 0:1aa2a4b0063a | 22 | |
judith_bizimana | 0:1aa2a4b0063a | 23 | char pedestrianAdvert[] = "2 COFFEES FOR THE PRICE OF 1. ONLY AT CAMELIA"; |
judith_bizimana | 0:1aa2a4b0063a | 24 | char carDriverAdvert[] = "RECEIVE 5%% REDUCTION ON YOUR FULL TANK ...."; |
judith_bizimana | 0:1aa2a4b0063a | 25 | char deviceId[] = "Judith_220000087"; |
judith_bizimana | 0:1aa2a4b0063a | 26 | |
judith_bizimana | 0:1aa2a4b0063a | 27 | // Device credentials, register device as OTAA in The Things Network and copy credentials here |
judith_bizimana | 0:1aa2a4b0063a | 28 | static uint8_t DEV_EUI[] = { 0x26, 0x10, 0x20, 0x20, 0x11, 0x11, 0x20, 0x20 }; |
judith_bizimana | 0:1aa2a4b0063a | 29 | static uint8_t APP_EUI[] = { 0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x03, 0x74, 0x72 }; |
judith_bizimana | 0:1aa2a4b0063a | 30 | static uint8_t APP_KEY[] = { 0x75, 0x57, 0x56, 0x65, 0xB1, 0x8A, 0x17, 0x52, 0x1B, 0x2D, 0x45, 0xD9, 0xFC, 0x90, 0x9E, 0x05 }; |
judith_bizimana | 0:1aa2a4b0063a | 31 | |
judith_bizimana | 0:1aa2a4b0063a | 32 | |
judith_bizimana | 0:1aa2a4b0063a | 33 | // Peripherals (LoRa radio, temperature sensor and button) |
judith_bizimana | 0:1aa2a4b0063a | 34 | SX1276_LoRaRadio radio(D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9, NC, NC, NC, NC, A4, NC, NC); |
judith_bizimana | 0:1aa2a4b0063a | 35 | InterruptIn btn(BUTTON1); |
judith_bizimana | 0:1aa2a4b0063a | 36 | // EventQueue is required to dispatch events around |
judith_bizimana | 0:1aa2a4b0063a | 37 | static EventQueue ev_queue; |
judith_bizimana | 0:1aa2a4b0063a | 38 | // Constructing Mbed LoRaWANInterface and passing it down the radio object. |
judith_bizimana | 0:1aa2a4b0063a | 39 | static LoRaWANInterface lorawan(radio); |
judith_bizimana | 0:1aa2a4b0063a | 40 | // Application specific callbacks |
judith_bizimana | 0:1aa2a4b0063a | 41 | static lorawan_app_callbacks_t callbacks; |
judith_bizimana | 0:1aa2a4b0063a | 42 | // LoRaWAN stack event handler |
judith_bizimana | 0:1aa2a4b0063a | 43 | static void lora_event_handler(lorawan_event_t event); |
judith_bizimana | 0:1aa2a4b0063a | 44 | |
judith_bizimana | 0:1aa2a4b0063a | 45 | // Send a message over LoRaWAN |
judith_bizimana | 0:1aa2a4b0063a | 46 | static void send_message(int value) { |
judith_bizimana | 0:1aa2a4b0063a | 47 | uint8_t tx_buffer[50] = { 0 }; |
judith_bizimana | 0:1aa2a4b0063a | 48 | time_t seconds = time(NULL); |
judith_bizimana | 0:1aa2a4b0063a | 49 | // Sending strings over LoRaWAN is not recommended |
judith_bizimana | 0:1aa2a4b0063a | 50 | sprintf((char*) tx_buffer, "{\"deviceId\":\"%s\", \"timestamp\":%ld,\"value\":%d}", deviceId, (long int)seconds, value); |
judith_bizimana | 0:1aa2a4b0063a | 51 | int packet_len = strlen((char*) tx_buffer); |
judith_bizimana | 0:1aa2a4b0063a | 52 | printf("Sending %d bytes: \"%s\"\n", packet_len, tx_buffer); |
judith_bizimana | 0:1aa2a4b0063a | 53 | int16_t retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, MSG_UNCONFIRMED_FLAG); |
judith_bizimana | 0:1aa2a4b0063a | 54 | // for some reason send() returns -1... I cannot find out why, the stack returns the right number. I feel that this is some weird Emscripten quirk |
judith_bizimana | 0:1aa2a4b0063a | 55 | if (retcode < 0) { |
judith_bizimana | 0:1aa2a4b0063a | 56 | retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - duty cycle violation\n") |
judith_bizimana | 0:1aa2a4b0063a | 57 | : printf("send() - Error code %d\n", retcode); |
judith_bizimana | 0:1aa2a4b0063a | 58 | return; |
judith_bizimana | 0:1aa2a4b0063a | 59 | } |
judith_bizimana | 0:1aa2a4b0063a | 60 | printf("%d bytes scheduled for transmission\n", retcode); |
judith_bizimana | 0:1aa2a4b0063a | 61 | } |
judith_bizimana | 0:1aa2a4b0063a | 62 | |
judith_bizimana | 0:1aa2a4b0063a | 63 | int initialize_lora() { |
judith_bizimana | 0:1aa2a4b0063a | 64 | if (DEV_EUI[0] == 0x0 && DEV_EUI[1] == 0x0 && DEV_EUI[2] == 0x0 && DEV_EUI[3] == 0x0 && DEV_EUI[4] == 0x0 && DEV_EUI[5] == 0x0 && DEV_EUI[6] == 0x0 && DEV_EUI[7] == 0x0) { |
judith_bizimana | 0:1aa2a4b0063a | 65 | printf("Set your LoRaWAN credentials first!\n"); |
judith_bizimana | 0:1aa2a4b0063a | 66 | return -1; |
judith_bizimana | 0:1aa2a4b0063a | 67 | } |
judith_bizimana | 0:1aa2a4b0063a | 68 | printf("Press BUTTON1 to stop cars and have right to cross the road!!!!\n"); |
judith_bizimana | 0:1aa2a4b0063a | 69 | // Enable trace output for this demo, so we can see what the LoRaWAN stack does |
judith_bizimana | 0:1aa2a4b0063a | 70 | mbed_trace_init(); |
judith_bizimana | 0:1aa2a4b0063a | 71 | if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { |
judith_bizimana | 0:1aa2a4b0063a | 72 | printf("LoRa initialization failed!\n"); |
judith_bizimana | 0:1aa2a4b0063a | 73 | return -1; |
judith_bizimana | 0:1aa2a4b0063a | 74 | } |
judith_bizimana | 0:1aa2a4b0063a | 75 | // prepare application callbacks |
judith_bizimana | 0:1aa2a4b0063a | 76 | callbacks.events = mbed::callback(lora_event_handler); |
judith_bizimana | 0:1aa2a4b0063a | 77 | lorawan.add_app_callbacks(&callbacks); |
judith_bizimana | 0:1aa2a4b0063a | 78 | // Disable adaptive data rating |
judith_bizimana | 0:1aa2a4b0063a | 79 | if (lorawan.disable_adaptive_datarate() != LORAWAN_STATUS_OK) { |
judith_bizimana | 0:1aa2a4b0063a | 80 | printf("disable_adaptive_datarate failed!\n"); |
judith_bizimana | 0:1aa2a4b0063a | 81 | return -1; |
judith_bizimana | 0:1aa2a4b0063a | 82 | } |
judith_bizimana | 0:1aa2a4b0063a | 83 | lorawan.set_datarate(5); // SF7BW125 |
judith_bizimana | 0:1aa2a4b0063a | 84 | lorawan_connect_t connect_params; |
judith_bizimana | 0:1aa2a4b0063a | 85 | connect_params.connect_type = LORAWAN_CONNECTION_OTAA; |
judith_bizimana | 0:1aa2a4b0063a | 86 | connect_params.connection_u.otaa.dev_eui = DEV_EUI; |
judith_bizimana | 0:1aa2a4b0063a | 87 | connect_params.connection_u.otaa.app_eui = APP_EUI; |
judith_bizimana | 0:1aa2a4b0063a | 88 | connect_params.connection_u.otaa.app_key = APP_KEY; |
judith_bizimana | 0:1aa2a4b0063a | 89 | connect_params.connection_u.otaa.nb_trials = 3; |
judith_bizimana | 0:1aa2a4b0063a | 90 | |
judith_bizimana | 0:1aa2a4b0063a | 91 | lorawan_status_t retcode = lorawan.connect(connect_params); |
judith_bizimana | 0:1aa2a4b0063a | 92 | |
judith_bizimana | 0:1aa2a4b0063a | 93 | if (retcode == LORAWAN_STATUS_OK || |
judith_bizimana | 0:1aa2a4b0063a | 94 | retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { |
judith_bizimana | 0:1aa2a4b0063a | 95 | } |
judith_bizimana | 0:1aa2a4b0063a | 96 | else { |
judith_bizimana | 0:1aa2a4b0063a | 97 | printf("Connection error, code = %d\n", retcode); |
judith_bizimana | 0:1aa2a4b0063a | 98 | return -1; |
judith_bizimana | 0:1aa2a4b0063a | 99 | } |
judith_bizimana | 0:1aa2a4b0063a | 100 | |
judith_bizimana | 0:1aa2a4b0063a | 101 | printf("Connection - In Progress ...\r\n"); |
judith_bizimana | 0:1aa2a4b0063a | 102 | // make your event queue dispatching events forever |
judith_bizimana | 0:1aa2a4b0063a | 103 | ev_queue.dispatch_forever(); |
judith_bizimana | 0:1aa2a4b0063a | 104 | return 0; |
judith_bizimana | 0:1aa2a4b0063a | 105 | } |
judith_bizimana | 0:1aa2a4b0063a | 106 | void play_tone(float frequency, float volume, int interval, int rest) { |
judith_bizimana | 0:1aa2a4b0063a | 107 | speaker.period(1.0 / frequency); |
judith_bizimana | 0:1aa2a4b0063a | 108 | speaker = volume; |
judith_bizimana | 0:1aa2a4b0063a | 109 | wait(interval); |
judith_bizimana | 0:1aa2a4b0063a | 110 | speaker = 0.0; |
judith_bizimana | 0:1aa2a4b0063a | 111 | wait(rest); |
judith_bizimana | 0:1aa2a4b0063a | 112 | } |
judith_bizimana | 0:1aa2a4b0063a | 113 | |
judith_bizimana | 0:1aa2a4b0063a | 114 | /** |
judith_bizimana | 0:1aa2a4b0063a | 115 | * Blinking a yellow LED. |
judith_bizimana | 0:1aa2a4b0063a | 116 | * |
judith_bizimana | 0:1aa2a4b0063a | 117 | * @param duration length of time to blink . |
judith_bizimana | 0:1aa2a4b0063a | 118 | */ |
judith_bizimana | 0:1aa2a4b0063a | 119 | static void yellowblinking(int duration){ |
judith_bizimana | 0:1aa2a4b0063a | 120 | int counter=0; |
judith_bizimana | 0:1aa2a4b0063a | 121 | while(counter < duration) |
judith_bizimana | 0:1aa2a4b0063a | 122 | { |
judith_bizimana | 0:1aa2a4b0063a | 123 | |
judith_bizimana | 0:1aa2a4b0063a | 124 | counter+=1; |
judith_bizimana | 0:1aa2a4b0063a | 125 | yellowled = !yellowled; |
judith_bizimana | 0:1aa2a4b0063a | 126 | wait(1); |
judith_bizimana | 0:1aa2a4b0063a | 127 | |
judith_bizimana | 0:1aa2a4b0063a | 128 | } |
judith_bizimana | 0:1aa2a4b0063a | 129 | yellowled = 0; |
judith_bizimana | 0:1aa2a4b0063a | 130 | // state=2; |
judith_bizimana | 0:1aa2a4b0063a | 131 | } |
judith_bizimana | 0:1aa2a4b0063a | 132 | |
judith_bizimana | 0:1aa2a4b0063a | 133 | /** |
judith_bizimana | 0:1aa2a4b0063a | 134 | * Crossing pedestrian. |
judith_bizimana | 0:1aa2a4b0063a | 135 | * |
judith_bizimana | 0:1aa2a4b0063a | 136 | * @param duration length of time for pedestrian to cross. |
judith_bizimana | 0:1aa2a4b0063a | 137 | */ |
judith_bizimana | 0:1aa2a4b0063a | 138 | static void pedestriancrossing(int duration){ |
judith_bizimana | 0:1aa2a4b0063a | 139 | redled = 1; |
judith_bizimana | 0:1aa2a4b0063a | 140 | |
judith_bizimana | 0:1aa2a4b0063a | 141 | int counter=0; |
judith_bizimana | 0:1aa2a4b0063a | 142 | while(counter < duration) |
judith_bizimana | 0:1aa2a4b0063a | 143 | { |
judith_bizimana | 0:1aa2a4b0063a | 144 | play_tone(200.0, 0.5, 1, 0);//play sound to help people with disabilities to know time to cross the road |
judith_bizimana | 0:1aa2a4b0063a | 145 | //play_tone(150.0, 0.5, 1, 0); |
judith_bizimana | 0:1aa2a4b0063a | 146 | //play_tone(125.0, 0.5, 1, 0); |
judith_bizimana | 0:1aa2a4b0063a | 147 | counter+=1; |
judith_bizimana | 0:1aa2a4b0063a | 148 | |
judith_bizimana | 0:1aa2a4b0063a | 149 | wait(1); |
judith_bizimana | 0:1aa2a4b0063a | 150 | } |
judith_bizimana | 0:1aa2a4b0063a | 151 | redled = 0; |
judith_bizimana | 0:1aa2a4b0063a | 152 | yellowled = 1; |
judith_bizimana | 0:1aa2a4b0063a | 153 | //state=0; |
judith_bizimana | 0:1aa2a4b0063a | 154 | } |
judith_bizimana | 0:1aa2a4b0063a | 155 | |
judith_bizimana | 0:1aa2a4b0063a | 156 | |
judith_bizimana | 0:1aa2a4b0063a | 157 | /** |
judith_bizimana | 0:1aa2a4b0063a | 158 | * Display content on LCD. |
judith_bizimana | 0:1aa2a4b0063a | 159 | * |
judith_bizimana | 0:1aa2a4b0063a | 160 | * @param advert The advertising text to be displayed. |
judith_bizimana | 0:1aa2a4b0063a | 161 | */ |
judith_bizimana | 0:1aa2a4b0063a | 162 | static void display(char *advert) { |
judith_bizimana | 0:1aa2a4b0063a | 163 | lcd.cls(); // Clear LCD |
judith_bizimana | 0:1aa2a4b0063a | 164 | lcd.locate(10, 5); // get cursor to position x=3px and y=5px |
judith_bizimana | 0:1aa2a4b0063a | 165 | lcd.printf(advert); // Write text into LCD buffer |
judith_bizimana | 0:1aa2a4b0063a | 166 | lcd.copy_to_lcd(); |
judith_bizimana | 0:1aa2a4b0063a | 167 | } |
judith_bizimana | 0:1aa2a4b0063a | 168 | |
judith_bizimana | 0:1aa2a4b0063a | 169 | |
judith_bizimana | 0:1aa2a4b0063a | 170 | /** |
judith_bizimana | 0:1aa2a4b0063a | 171 | * Callback (Interrupt Service Routine) when a bouton is clicked. |
judith_bizimana | 0:1aa2a4b0063a | 172 | * |
judith_bizimana | 0:1aa2a4b0063a | 173 | */ |
judith_bizimana | 0:1aa2a4b0063a | 174 | void pedestrian_isr() { |
judith_bizimana | 0:1aa2a4b0063a | 175 | wait(1); |
judith_bizimana | 0:1aa2a4b0063a | 176 | //send_message(state); |
judith_bizimana | 0:1aa2a4b0063a | 177 | if (state == 0) // YELLOW IS ON AND RED IS OFF |
judith_bizimana | 0:1aa2a4b0063a | 178 | { |
judith_bizimana | 0:1aa2a4b0063a | 179 | state = 1; // YELLOW IS BLINKING AND RED IS OFF |
judith_bizimana | 0:1aa2a4b0063a | 180 | send_message(state); |
judith_bizimana | 0:1aa2a4b0063a | 181 | //send_message(deviceId, 123456, 2); |
judith_bizimana | 0:1aa2a4b0063a | 182 | display(pedestrianAdvert); |
judith_bizimana | 0:1aa2a4b0063a | 183 | yellowblinking(YELLOWBLINKINGDURATION); |
judith_bizimana | 0:1aa2a4b0063a | 184 | wait(1); |
judith_bizimana | 0:1aa2a4b0063a | 185 | state = 2;// YELLOW IS OFF AND RED IS ON |
judith_bizimana | 0:1aa2a4b0063a | 186 | } |
judith_bizimana | 0:1aa2a4b0063a | 187 | if(state==2){ |
judith_bizimana | 0:1aa2a4b0063a | 188 | send_message(2); |
judith_bizimana | 0:1aa2a4b0063a | 189 | display(carDriverAdvert); |
judith_bizimana | 0:1aa2a4b0063a | 190 | pedestriancrossing(REDLIGHTONDURATION); |
judith_bizimana | 0:1aa2a4b0063a | 191 | wait(1); |
judith_bizimana | 0:1aa2a4b0063a | 192 | state = 0; |
judith_bizimana | 0:1aa2a4b0063a | 193 | } |
judith_bizimana | 0:1aa2a4b0063a | 194 | if(state==0){ |
judith_bizimana | 0:1aa2a4b0063a | 195 | send_message(0); |
judith_bizimana | 0:1aa2a4b0063a | 196 | lcd.cls(); |
judith_bizimana | 0:1aa2a4b0063a | 197 | } |
judith_bizimana | 0:1aa2a4b0063a | 198 | } |
judith_bizimana | 0:1aa2a4b0063a | 199 | //if(state == 2) // RED |
judith_bizimana | 0:1aa2a4b0063a | 200 | //{ |
judith_bizimana | 0:1aa2a4b0063a | 201 | // extend the duration of RED by 5 seconds |
judith_bizimana | 0:1aa2a4b0063a | 202 | // } |
judith_bizimana | 0:1aa2a4b0063a | 203 | //} |
judith_bizimana | 0:1aa2a4b0063a | 204 | |
judith_bizimana | 0:1aa2a4b0063a | 205 | int main() { |
judith_bizimana | 0:1aa2a4b0063a | 206 | pedestrianbutton.rise(ev_queue.event(&pedestrian_isr)); // Registering an ISR for button click |
judith_bizimana | 0:1aa2a4b0063a | 207 | initialize_lora(); |
judith_bizimana | 0:1aa2a4b0063a | 208 | } |
judith_bizimana | 0:1aa2a4b0063a | 209 | |
judith_bizimana | 0:1aa2a4b0063a | 210 | // Event handler |
judith_bizimana | 0:1aa2a4b0063a | 211 | static void lora_event_handler(lorawan_event_t event) { |
judith_bizimana | 0:1aa2a4b0063a | 212 | switch (event) { |
judith_bizimana | 0:1aa2a4b0063a | 213 | case CONNECTED: |
judith_bizimana | 0:1aa2a4b0063a | 214 | printf("Connection - Successful\n"); |
judith_bizimana | 0:1aa2a4b0063a | 215 | break; |
judith_bizimana | 0:1aa2a4b0063a | 216 | case DISCONNECTED: |
judith_bizimana | 0:1aa2a4b0063a | 217 | ev_queue.break_dispatch(); |
judith_bizimana | 0:1aa2a4b0063a | 218 | printf("Disconnected Successfully\n"); |
judith_bizimana | 0:1aa2a4b0063a | 219 | break; |
judith_bizimana | 0:1aa2a4b0063a | 220 | case TX_DONE: |
judith_bizimana | 0:1aa2a4b0063a | 221 | printf("Message Sent to Network Server\n"); |
judith_bizimana | 0:1aa2a4b0063a | 222 | break; |
judith_bizimana | 0:1aa2a4b0063a | 223 | case TX_TIMEOUT: |
judith_bizimana | 0:1aa2a4b0063a | 224 | case TX_ERROR: |
judith_bizimana | 0:1aa2a4b0063a | 225 | case TX_CRYPTO_ERROR: |
judith_bizimana | 0:1aa2a4b0063a | 226 | case TX_SCHEDULING_ERROR: |
judith_bizimana | 0:1aa2a4b0063a | 227 | printf("Transmission Error - EventCode = %d\n", event); |
judith_bizimana | 0:1aa2a4b0063a | 228 | break; |
judith_bizimana | 0:1aa2a4b0063a | 229 | case JOIN_FAILURE: |
judith_bizimana | 0:1aa2a4b0063a | 230 | printf("OTAA Failed - Check Keys\n"); |
judith_bizimana | 0:1aa2a4b0063a | 231 | break; |
judith_bizimana | 0:1aa2a4b0063a | 232 | default: |
judith_bizimana | 0:1aa2a4b0063a | 233 | MBED_ASSERT("Unknown Event"); |
judith_bizimana | 0:1aa2a4b0063a | 234 | } |
judith_bizimana | 0:1aa2a4b0063a | 235 | } |