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.
Revision 0:1aa2a4b0063a, committed 2020-11-12
- Comitter:
- judith_bizimana
- Date:
- Thu Nov 12 18:17:37 2020 +0000
- Commit message:
- Traffic project with sound
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Nov 12 18:17:37 2020 +0000 @@ -0,0 +1,235 @@ +#include "mbed.h" // Include the library of Mbed +#include "C12832.h" // Include the library of the specific LCD +#include "mbed_trace.h" +#include "mbed_events.h" +#include "LoRaWANInterface.h" +#include "SX1276_LoRaRadio.h" + +#define YELLOWBLINKINGDURATION 10 +#define REDLIGHTONDURATION 10 +// The port we're sending and receiving on +#define MBED_CONF_LORA_APP_PORT 15 +//#define DEVICEID Jacqueline + +DigitalOut yellowled(p15, 1); // Initializing the yellow light ON (same as yellowled = 1) +DigitalOut redled(p17, 0); // Initializing the Red light to OFF (same as redled = 0) +PwmOut speaker(p21);//pin for sound speaker +InterruptIn pedestrianbutton(p16); + +C12832 lcd(SPI_MOSI, SPI_SCK, SPI_MISO, p8, p11); // create an instance of LCD + +int state = 0; // State variable indicating that YELLOW LIGHT IS ON + +char pedestrianAdvert[] = "2 COFFEES FOR THE PRICE OF 1. ONLY AT CAMELIA"; +char carDriverAdvert[] = "RECEIVE 5%% REDUCTION ON YOUR FULL TANK ...."; +char deviceId[] = "Judith_220000087"; + +// Device credentials, register device as OTAA in The Things Network and copy credentials here +static uint8_t DEV_EUI[] = { 0x26, 0x10, 0x20, 0x20, 0x11, 0x11, 0x20, 0x20 }; +static uint8_t APP_EUI[] = { 0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x03, 0x74, 0x72 }; +static uint8_t APP_KEY[] = { 0x75, 0x57, 0x56, 0x65, 0xB1, 0x8A, 0x17, 0x52, 0x1B, 0x2D, 0x45, 0xD9, 0xFC, 0x90, 0x9E, 0x05 }; + + +// Peripherals (LoRa radio, temperature sensor and button) +SX1276_LoRaRadio radio(D11, D12, D13, D10, A0, D2, D3, D4, D5, D8, D9, NC, NC, NC, NC, A4, NC, NC); +InterruptIn btn(BUTTON1); +// EventQueue is required to dispatch events around +static EventQueue ev_queue; +// Constructing Mbed LoRaWANInterface and passing it down the radio object. +static LoRaWANInterface lorawan(radio); +// Application specific callbacks +static lorawan_app_callbacks_t callbacks; +// LoRaWAN stack event handler +static void lora_event_handler(lorawan_event_t event); + +// Send a message over LoRaWAN +static void send_message(int value) { + uint8_t tx_buffer[50] = { 0 }; + time_t seconds = time(NULL); + // Sending strings over LoRaWAN is not recommended + sprintf((char*) tx_buffer, "{\"deviceId\":\"%s\", \"timestamp\":%ld,\"value\":%d}", deviceId, (long int)seconds, value); + int packet_len = strlen((char*) tx_buffer); + printf("Sending %d bytes: \"%s\"\n", packet_len, tx_buffer); + int16_t retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, MSG_UNCONFIRMED_FLAG); + // 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 + if (retcode < 0) { + retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - duty cycle violation\n") + : printf("send() - Error code %d\n", retcode); + return; + } + printf("%d bytes scheduled for transmission\n", retcode); +} + +int initialize_lora() { + 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) { + printf("Set your LoRaWAN credentials first!\n"); + return -1; + } + printf("Press BUTTON1 to stop cars and have right to cross the road!!!!\n"); + // Enable trace output for this demo, so we can see what the LoRaWAN stack does + mbed_trace_init(); + if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { + printf("LoRa initialization failed!\n"); + return -1; + } + // prepare application callbacks + callbacks.events = mbed::callback(lora_event_handler); + lorawan.add_app_callbacks(&callbacks); + // Disable adaptive data rating + if (lorawan.disable_adaptive_datarate() != LORAWAN_STATUS_OK) { + printf("disable_adaptive_datarate failed!\n"); + return -1; + } + lorawan.set_datarate(5); // SF7BW125 + lorawan_connect_t connect_params; + connect_params.connect_type = LORAWAN_CONNECTION_OTAA; + connect_params.connection_u.otaa.dev_eui = DEV_EUI; + connect_params.connection_u.otaa.app_eui = APP_EUI; + connect_params.connection_u.otaa.app_key = APP_KEY; + connect_params.connection_u.otaa.nb_trials = 3; + + lorawan_status_t retcode = lorawan.connect(connect_params); + + if (retcode == LORAWAN_STATUS_OK || + retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { + } + else { + printf("Connection error, code = %d\n", retcode); + return -1; + } + + printf("Connection - In Progress ...\r\n"); + // make your event queue dispatching events forever + ev_queue.dispatch_forever(); + return 0; +} +void play_tone(float frequency, float volume, int interval, int rest) { + speaker.period(1.0 / frequency); + speaker = volume; + wait(interval); + speaker = 0.0; + wait(rest); +} + +/** + * Blinking a yellow LED. + * + * @param duration length of time to blink . + */ +static void yellowblinking(int duration){ + int counter=0; + while(counter < duration) + { + + counter+=1; + yellowled = !yellowled; + wait(1); + + } + yellowled = 0; + // state=2; +} + +/** + * Crossing pedestrian. + * + * @param duration length of time for pedestrian to cross. + */ +static void pedestriancrossing(int duration){ + redled = 1; + + int counter=0; + while(counter < duration) + { + play_tone(200.0, 0.5, 1, 0);//play sound to help people with disabilities to know time to cross the road + //play_tone(150.0, 0.5, 1, 0); + //play_tone(125.0, 0.5, 1, 0); + counter+=1; + + wait(1); + } + redled = 0; + yellowled = 1; + //state=0; + } + + +/** + * Display content on LCD. + * + * @param advert The advertising text to be displayed. + */ +static void display(char *advert) { + lcd.cls(); // Clear LCD + lcd.locate(10, 5); // get cursor to position x=3px and y=5px + lcd.printf(advert); // Write text into LCD buffer + lcd.copy_to_lcd(); +} + + +/** + * Callback (Interrupt Service Routine) when a bouton is clicked. + * + */ +void pedestrian_isr() { + wait(1); + //send_message(state); + if (state == 0) // YELLOW IS ON AND RED IS OFF + { + state = 1; // YELLOW IS BLINKING AND RED IS OFF + send_message(state); + //send_message(deviceId, 123456, 2); + display(pedestrianAdvert); + yellowblinking(YELLOWBLINKINGDURATION); + wait(1); + state = 2;// YELLOW IS OFF AND RED IS ON + } + if(state==2){ + send_message(2); + display(carDriverAdvert); + pedestriancrossing(REDLIGHTONDURATION); + wait(1); + state = 0; + } + if(state==0){ + send_message(0); + lcd.cls(); + } + } + //if(state == 2) // RED + //{ + // extend the duration of RED by 5 seconds + // } +//} + +int main() { + pedestrianbutton.rise(ev_queue.event(&pedestrian_isr)); // Registering an ISR for button click + initialize_lora(); +} + +// Event handler +static void lora_event_handler(lorawan_event_t event) { + switch (event) { + case CONNECTED: + printf("Connection - Successful\n"); + break; + case DISCONNECTED: + ev_queue.break_dispatch(); + printf("Disconnected Successfully\n"); + break; + case TX_DONE: + printf("Message Sent to Network Server\n"); + break; + case TX_TIMEOUT: + case TX_ERROR: + case TX_CRYPTO_ERROR: + case TX_SCHEDULING_ERROR: + printf("Transmission Error - EventCode = %d\n", event); + break; + case JOIN_FAILURE: + printf("OTAA Failed - Check Keys\n"); + break; + default: + MBED_ASSERT("Unknown Event"); + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Nov 12 18:17:37 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file