This is an example application based on Mbed-OS LoRaWAN protocol APIs. The Mbed-OS LoRaWAN stack implementation is compliant with LoRaWAN v1.0.2 specification.

Dependencies:   Lorawan_Version_0_1

Dependents:   Lorawan_Version_0_1

Committer:
jacktractive
Date:
Tue Jan 28 14:22:48 2020 +0000
Revision:
72:67c5bce77999
Parent:
71:ca2425c0a864
Child:
73:974c1df98553
3 modi zum aussuchen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jacktractive 66:a11c79073f1f 1 #include <stdio.h>
jacktractive 66:a11c79073f1f 2 #include "Watchdog.h"
jacktractive 66:a11c79073f1f 3 #include "events/EventQueue.h"
mbed_official 0:7037ed05f54f 4 #include "trace_helper.h"
jacktractive 66:a11c79073f1f 5 #include <mbed.h>
jacktractive 65:3061ea235a0c 6 #include "mbed_stats.h"
jacktractive 69:316fee01f5d9 7 #include "Light.h"
jacktractive 69:316fee01f5d9 8 #include "GPS.h"
jacktractive 69:316fee01f5d9 9 #include "Lora.h"
jacktractive 63:2bfceda4c30c 10
jacktractive 69:316fee01f5d9 11 #define MAX_NUMBER_OF_EVENTS 20
jacktractive 69:316fee01f5d9 12 static EventQueue ev_queue(MAX_NUMBER_OF_EVENTS *EVENTS_EVENT_SIZE);
jacktractive 69:316fee01f5d9 13
jacktractive 72:67c5bce77999 14 int TickID,LoraTickID;
jacktractive 71:ca2425c0a864 15 uint32_t TickCounter;
jacktractive 71:ca2425c0a864 16 uint32_t TickTime=3000;
jacktractive 71:ca2425c0a864 17 uint32_t LoraTickCounter;
jacktractive 71:ca2425c0a864 18 uint32_t LoraTickTime=15000; //15000
jacktractive 72:67c5bce77999 19 uint32_t LoraTickTimeSleep=7200000; // in sleep mode only every 2 hours to receive commandos
jacktractive 72:67c5bce77999 20 int mode; //1 = normal , 2 = sleep every but check 2 hour , 3 = sleep Lora turned completly off -> no remote accessibility
jacktractive 69:316fee01f5d9 21
jacktractive 63:2bfceda4c30c 22 bool IsLoading;
jacktractive 63:2bfceda4c30c 23 AnalogIn LadeSpannung(PB_0); // 1/11 der gleichgerichteten Spannung am Dynamo
jacktractive 70:65b2f1cc2859 24
jacktractive 70:65b2f1cc2859 25 //Light
jacktractive 70:65b2f1cc2859 26 DigitalOut LichtAus(PC_12);
jacktractive 70:65b2f1cc2859 27 DigitalOut LichtHell(PC_9);
jacktractive 70:65b2f1cc2859 28 Light light(&ev_queue,&LichtAus,&LichtHell);
jacktractive 70:65b2f1cc2859 29
jacktractive 71:ca2425c0a864 30 //Userbutton
jacktractive 71:ca2425c0a864 31 DigitalIn USERButton(PB_15);
jacktractive 71:ca2425c0a864 32
jacktractive 70:65b2f1cc2859 33 //GPS
jacktractive 70:65b2f1cc2859 34 DigitalOut GPSdisable(PC_6);
jacktractive 70:65b2f1cc2859 35 GPS GPS_modul(PC_4, PC_5, 9600,&GPSdisable);
jacktractive 70:65b2f1cc2859 36 uint32_t TimeWithoutMoving;
jacktractive 66:a11c79073f1f 37
jacktractive 71:ca2425c0a864 38 //Lora
jacktractive 69:316fee01f5d9 39 Lora lora(&ev_queue, &light, &GPS_modul);
mbed_official 0:7037ed05f54f 40
jacktractive 72:67c5bce77999 41 // function for changing the mode
jacktractive 72:67c5bce77999 42 void change_mode(int modeid);
jacktractive 72:67c5bce77999 43
jacktractive 72:67c5bce77999 44 //LoraTicker Send information
jacktractive 72:67c5bce77999 45 static void LoraTicker()
jacktractive 72:67c5bce77999 46 {
jacktractive 72:67c5bce77999 47 //Lora Lifetick
jacktractive 72:67c5bce77999 48 LoraTickCounter=LoraTickCounter+1;
jacktractive 72:67c5bce77999 49 printf("\n\n[LoraTick] --- [%i]", LoraTickCounter);
jacktractive 72:67c5bce77999 50
jacktractive 72:67c5bce77999 51 //GPS read
jacktractive 72:67c5bce77999 52 GPS_modul.get_Position();
jacktractive 72:67c5bce77999 53
jacktractive 72:67c5bce77999 54 //LORA
jacktractive 72:67c5bce77999 55 lora.send_Position_to_Lora(0x01, GPS_modul.time,GPS_modul.longitude,GPS_modul.latitude);
jacktractive 72:67c5bce77999 56 }
jacktractive 72:67c5bce77999 57
jacktractive 72:67c5bce77999 58
jacktractive 72:67c5bce77999 59 //LifeTicker - Check if bike is moving
jacktractive 71:ca2425c0a864 60 static void LifeTicker()
jacktractive 71:ca2425c0a864 61 {
mbed_official 0:7037ed05f54f 62
jacktractive 68:41fff9c3fb4f 63 //Lifetick
jacktractive 68:41fff9c3fb4f 64 TickCounter=TickCounter+1;
jacktractive 69:316fee01f5d9 65 printf("\n[LiveTick] --- [%i] ", TickCounter);
jacktractive 69:316fee01f5d9 66
jacktractive 71:ca2425c0a864 67 //Watchdog
jacktractive 71:ca2425c0a864 68 Watchdog &watchdog = Watchdog::get_instance();
jacktractive 71:ca2425c0a864 69 Watchdog::get_instance().kick(); // kick the Watchdog before the timeout
jacktractive 66:a11c79073f1f 70
jacktractive 72:67c5bce77999 71 //Sleep statistics
jacktractive 68:41fff9c3fb4f 72 mbed_stats_cpu_t stats;
jacktractive 68:41fff9c3fb4f 73 mbed_stats_cpu_get(&stats);
jacktractive 69:316fee01f5d9 74 printf("\n[SYSTEM] Uptime: %llu Idle: %llu Sleep: %llu Deep: %llu", stats.uptime / 1000 , stats.idle_time / 1000, stats.sleep_time / 1000,stats.deep_sleep_time / 1000);
jacktractive 72:67c5bce77999 75
jacktractive 72:67c5bce77999 76 //Dynamo - bike in motion - adjust light
jacktractive 72:67c5bce77999 77 if(LadeSpannung.read()*3.3f*11 > 5) {
jacktractive 72:67c5bce77999 78 TimeWithoutMoving =0 ;
jacktractive 72:67c5bce77999 79 printf("\n[SYSTEM] Bike moving: %fV", LadeSpannung.read()*3.3f*11);
jacktractive 72:67c5bce77999 80 }else {
jacktractive 72:67c5bce77999 81 TimeWithoutMoving=TimeWithoutMoving+TickTime;
jacktractive 72:67c5bce77999 82 printf("\n[SYSTEM] Bike still for: %is", TimeWithoutMoving/1000);
jacktractive 72:67c5bce77999 83 }
jacktractive 72:67c5bce77999 84
jacktractive 72:67c5bce77999 85 // Adjust the light according to the movement of the bike
jacktractive 72:67c5bce77999 86 light.adjust(TimeWithoutMoving);
jacktractive 72:67c5bce77999 87
jacktractive 72:67c5bce77999 88 //GPS , Lora wake up communication when moving
jacktractive 72:67c5bce77999 89 if (mode>1 && TimeWithoutMoving==0){
jacktractive 72:67c5bce77999 90 GPS_modul.idle(false);
jacktractive 72:67c5bce77999 91 printf("\n[GPS] Wake up due to Moving");
jacktractive 72:67c5bce77999 92 change_mode(1); // full communication
jacktractive 63:2bfceda4c30c 93 }
jacktractive 63:2bfceda4c30c 94
jacktractive 72:67c5bce77999 95 //GPS turn off when bike is not moved for a while (15min)
jacktractive 72:67c5bce77999 96 if (mode==1 && TimeWithoutMoving>900000){
jacktractive 72:67c5bce77999 97 GPS_modul.idle(true); //GPS to sleep, Lora needs to stay active for blinkrequests
jacktractive 72:67c5bce77999 98 printf("\n[GPS] Sleep due to Standing still");
jacktractive 72:67c5bce77999 99 }
jacktractive 66:a11c79073f1f 100
jacktractive 72:67c5bce77999 101 // User Button - change Mode
jacktractive 72:67c5bce77999 102 if (!USERButton) change_mode(mode+1);
jacktractive 72:67c5bce77999 103 }
jacktractive 66:a11c79073f1f 104
jacktractive 72:67c5bce77999 105
jacktractive 66:a11c79073f1f 106 /**
jacktractive 66:a11c79073f1f 107 * Entry point for application
jacktractive 66:a11c79073f1f 108 */
mbed_official 46:a124538e2891 109 int main(void)
jacktractive 64:85fa08519e1e 110 {
jacktractive 71:ca2425c0a864 111 Watchdog &watchdog = Watchdog::get_instance();
jacktractive 71:ca2425c0a864 112 watchdog.start(30000); //30s ohne kick im Ticker wird die CPU neu gestartet
jacktractive 66:a11c79073f1f 113 uint32_t watchdog_timeout = watchdog.get_timeout();
jacktractive 67:7bb75ed97500 114 printf("Watchdog initialized to %iu ms.\r\n", watchdog_timeout);
jacktractive 68:41fff9c3fb4f 115
jacktractive 72:67c5bce77999 116 TickID = ev_queue.call_every(TickTime,LifeTicker); //Zyklus um Dynamoaktivitäten zu prüfen
jacktractive 72:67c5bce77999 117 LoraTickID = ev_queue.call_every(LoraTickTime,LoraTicker); //Zyklus zum senden über Lora
jacktractive 67:7bb75ed97500 118
jacktractive 71:ca2425c0a864 119 setup_trace(); // setup tracing für mehr Infos im log über lora
jacktractive 61:2b30d8e75fe7 120
jacktractive 71:ca2425c0a864 121 lora.Lora_init(); // Lora initialisieren
jacktractive 69:316fee01f5d9 122
jacktractive 72:67c5bce77999 123 mode=1; // always starting in normal mode
jacktractive 72:67c5bce77999 124
jacktractive 71:ca2425c0a864 125 ev_queue.dispatch_forever();// make your event queue dispatching events forever
jacktractive 68:41fff9c3fb4f 126 return 0;
jacktractive 68:41fff9c3fb4f 127 }
jacktractive 68:41fff9c3fb4f 128
jacktractive 72:67c5bce77999 129 void change_mode(int modeid){
jacktractive 72:67c5bce77999 130
jacktractive 72:67c5bce77999 131 //Stop current LoraTick
jacktractive 72:67c5bce77999 132 if (LoraTickID>0) {
jacktractive 72:67c5bce77999 133 ev_queue.cancel(LoraTickID);
jacktractive 72:67c5bce77999 134 LoraTickID=0;
jacktractive 72:67c5bce77999 135 }
jacktractive 72:67c5bce77999 136
jacktractive 72:67c5bce77999 137 //1 = normal , 2 = sleep every but check 2 hour , 3 = sleep Lora turned completly off -> no remote accessibility
jacktractive 72:67c5bce77999 138 mode=modeid;
jacktractive 72:67c5bce77999 139 if (mode>3) mode=1;
jacktractive 72:67c5bce77999 140
jacktractive 72:67c5bce77999 141 printf("\n[MODE] --- [%i] ", mode);
jacktractive 72:67c5bce77999 142
jacktractive 72:67c5bce77999 143 //Init new LoraTick
jacktractive 72:67c5bce77999 144
jacktractive 72:67c5bce77999 145 if (mode == 1){
jacktractive 72:67c5bce77999 146 GPS_modul.idle(false);
jacktractive 72:67c5bce77999 147 LoraTickID = ev_queue.call_every(LoraTickTime,LoraTicker); //Zyklus zum senden über Lora
jacktractive 72:67c5bce77999 148 light.Blinken_ein(500); //blink 1x
jacktractive 72:67c5bce77999 149 }
jacktractive 72:67c5bce77999 150 if (mode == 2) {
jacktractive 72:67c5bce77999 151 GPS_modul.idle(true);
jacktractive 72:67c5bce77999 152 LoraTickID = ev_queue.call_every(LoraTickTimeSleep,LoraTicker); //Zyklus zum senden über Lora
jacktractive 72:67c5bce77999 153 light.Blinken_ein(1000);//blink 2x
jacktractive 72:67c5bce77999 154 }
jacktractive 72:67c5bce77999 155 if (mode == 3) {
jacktractive 72:67c5bce77999 156 GPS_modul.idle(true);
jacktractive 72:67c5bce77999 157 light.Blinken_ein(1500);//blink 3x
jacktractive 72:67c5bce77999 158 }
jacktractive 72:67c5bce77999 159 }
jacktractive 72:67c5bce77999 160
jacktractive 66:a11c79073f1f 161 // EOF