![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
main.cpp@72:67c5bce77999, 2020-01-28 (annotated)
- 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?
User | Revision | Line number | New 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 |