Judith BIZIMANA / Mbed 2 deprecated Traffic_project_with_sound

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }