Workshop demo program

Dependencies:   PinDetect mbed LoRaWAN-lib SX1272Lib

Committer:
Brandond200
Date:
Mon Apr 24 20:38:51 2017 +0000
Revision:
10:2eb7b1614bb8
Parent:
8:fb8b53c490e1
Child:
11:88afd7663dc4
Formatted and commented code for workshop

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sergei11522 7:d7cdd6804277 1 #include "main.h"
sergei11522 7:d7cdd6804277 2 #include "mbed.h"
sergei11522 7:d7cdd6804277 3 #include "DebounceIn.h"
sergei11522 7:d7cdd6804277 4 #include "PinNames.h"
Brandond200 8:fb8b53c490e1 5 #include "timer.h"
Brandond200 10:2eb7b1614bb8 6 #include <math.h>
Brandond200 8:fb8b53c490e1 7 #include "app.h"
Brandond200 8:fb8b53c490e1 8 #include "SerialDisplay.h"
sergei11522 7:d7cdd6804277 9
sergei11522 7:d7cdd6804277 10 //initialize our sensors
sergei11522 7:d7cdd6804277 11 DebounceIn button(D6);
sergei11522 7:d7cdd6804277 12 DigitalOut led(A1);
sergei11522 7:d7cdd6804277 13 AnalogIn rotary(A3); //the potentiometer/rotary sensor
sergei11522 7:d7cdd6804277 14
Brandond200 10:2eb7b1614bb8 15
Brandond200 10:2eb7b1614bb8 16 #define ALARM_THRESHOLD 90 /*alarm triggered over this percentage*/
Brandond200 10:2eb7b1614bb8 17 #define BYTE_TO_PERCENT 655.35/*divisor to convert 2 byte number into number between 0 and 100*/
Brandond200 10:2eb7b1614bb8 18 #define THIRTY_SECONDS 30 * 1000 * 1000 /*30 seconds in microseconds*/
Brandond200 10:2eb7b1614bb8 19 #define TWO_HUNDRED_MILLISECONDS 200 * 1000 /*200 miliseconds in microseconds */
Brandond200 10:2eb7b1614bb8 20 #define ROTATION_DATA_CHANNEL 3 /* myDevices channel to send rotation position on*/
Brandond200 10:2eb7b1614bb8 21 #define ROTATION_DATA_TYPE 2 /*2 = Analog Input */
Brandond200 10:2eb7b1614bb8 22 #define ALARM_DATA_CHANNEL 7 /* myDevices channel to send alarm status on*/
Brandond200 10:2eb7b1614bb8 23 #define ALARM_DATA_TYPE 0 /*0 = Digital Input */
Brandond200 10:2eb7b1614bb8 24 #define MAX_DATA_LENGTH 64
Brandond200 10:2eb7b1614bb8 25 #define BLINK_COUNT_EVENT_TRANSMIT 1
Brandond200 10:2eb7b1614bb8 26 #define BLINK_COUNT_TIMER_TRANSMIT 2
Brandond200 10:2eb7b1614bb8 27 #define BLINK_COUNT_DOWNLINK_CONFIRMATION 3
Brandond200 10:2eb7b1614bb8 28 #define BLINK_COUNT_JOINED 10
Brandond200 10:2eb7b1614bb8 29
Brandond200 10:2eb7b1614bb8 30 //network variables
Brandond200 10:2eb7b1614bb8 31 bool just_joined = true; //used to determine if this is the first time through the loop
Brandond200 10:2eb7b1614bb8 32 uint8_t data[MAX_DATA_LENGTH] = {0}; //data that will be transmitted
Brandond200 10:2eb7b1614bb8 33 uint8_t dataLength = 0; //length of data that will be transmitted
Brandond200 10:2eb7b1614bb8 34
Brandond200 10:2eb7b1614bb8 35 //application variables
Brandond200 10:2eb7b1614bb8 36 bool button_pressed = false; //last state of the button
Brandond200 10:2eb7b1614bb8 37 bool alarmThresholdTirggered = false; //last state on the alarm
Brandond200 10:2eb7b1614bb8 38 uint8_t flashCount = 0; //how many more times to flash the LED
Brandond200 10:2eb7b1614bb8 39
Brandond200 10:2eb7b1614bb8 40 //timers
Brandond200 10:2eb7b1614bb8 41 TimerEvent_t txTimer; //timer so schedule heartbeat transmissions
Brandond200 10:2eb7b1614bb8 42 TimerEvent_t ledTimer; //timer to blink LED
Brandond200 8:fb8b53c490e1 43
sergei11522 7:d7cdd6804277 44
sergei11522 7:d7cdd6804277 45 void onDownlinkConfirmation(){
Brandond200 10:2eb7b1614bb8 46 flashLED(BLINK_COUNT_DOWNLINK_CONFIRMATION);
sergei11522 7:d7cdd6804277 47 }
sergei11522 7:d7cdd6804277 48
sergei11522 7:d7cdd6804277 49 void start(){
Brandond200 8:fb8b53c490e1 50 //any initialization here
Brandond200 10:2eb7b1614bb8 51
Brandond200 10:2eb7b1614bb8 52 //initilize heartbeat timer
Brandond200 8:fb8b53c490e1 53 TimerInit(&txTimer, timerCallback);
Brandond200 10:2eb7b1614bb8 54 TimerSetValue( &txTimer, THIRTY_SECONDS );
Brandond200 8:fb8b53c490e1 55 TimerStart(&txTimer);
Brandond200 8:fb8b53c490e1 56
Brandond200 10:2eb7b1614bb8 57 //initilize LED flash timer
Brandond200 8:fb8b53c490e1 58 TimerInit(&ledTimer, flashLEDCallback);
Brandond200 10:2eb7b1614bb8 59 TimerSetValue( &ledTimer, TWO_HUNDRED_MILLISECONDS );
sergei11522 7:d7cdd6804277 60 }
sergei11522 7:d7cdd6804277 61
sergei11522 7:d7cdd6804277 62 //this loop will start to be called as soon as the device successfully joins the network
sergei11522 7:d7cdd6804277 63 void loop(){
sergei11522 7:d7cdd6804277 64 //the loop is called as soon as the device joins. Flash the led 10 times when this happens
sergei11522 7:d7cdd6804277 65 if (just_joined){
sergei11522 7:d7cdd6804277 66 just_joined = false;
Brandond200 10:2eb7b1614bb8 67 flashLED(BLINK_COUNT_JOINED);
sergei11522 7:d7cdd6804277 68 }
sergei11522 7:d7cdd6804277 69
sergei11522 7:d7cdd6804277 70 //button is pressed. Trigger once so that if we hold the button this block doesnt continously execute
Brandond200 10:2eb7b1614bb8 71 if (button == 1 && button_pressed == false){
sergei11522 7:d7cdd6804277 72 button_pressed = true;
Brandond200 10:2eb7b1614bb8 73 flashLED(BLINK_COUNT_EVENT_TRANSMIT);
Brandond200 10:2eb7b1614bb8 74 transmitData(rotary.read_u16());
sergei11522 7:d7cdd6804277 75 } else if (button == 0){
sergei11522 7:d7cdd6804277 76 button_pressed = false;
sergei11522 7:d7cdd6804277 77 }
Brandond200 8:fb8b53c490e1 78
Brandond200 10:2eb7b1614bb8 79 //trigger alarm if needed
Brandond200 10:2eb7b1614bb8 80 checkForAlarm(rotary.read_u16());
Brandond200 10:2eb7b1614bb8 81 }
Brandond200 10:2eb7b1614bb8 82
Brandond200 10:2eb7b1614bb8 83 //Transmit rotory position and alarm status
Brandond200 10:2eb7b1614bb8 84 void transmitData(uint16_t position){
Brandond200 10:2eb7b1614bb8 85 addRotaryData(position);
Brandond200 10:2eb7b1614bb8 86 addAlarmData(position);
Brandond200 10:2eb7b1614bb8 87 setDataToSend(data, dataLength);
Brandond200 10:2eb7b1614bb8 88 sendLoraTransmission();
Brandond200 10:2eb7b1614bb8 89 dataLength = 0;
Brandond200 10:2eb7b1614bb8 90 }
Brandond200 10:2eb7b1614bb8 91
Brandond200 10:2eb7b1614bb8 92 //read the rotory position and add to data to transmit
Brandond200 10:2eb7b1614bb8 93 void addRotaryData(uint16_t positionArg){
Brandond200 10:2eb7b1614bb8 94 uint16_t position = positionArg / (BYTE_TO_PERCENT / 100);
Brandond200 10:2eb7b1614bb8 95
Brandond200 10:2eb7b1614bb8 96 data[dataLength++] = ROTATION_DATA_CHANNEL;
Brandond200 10:2eb7b1614bb8 97 data[dataLength++] = ROTATION_DATA_TYPE;
Brandond200 10:2eb7b1614bb8 98 data[dataLength++] = position >> 8; //add the upper byte of the rotory position
Brandond200 10:2eb7b1614bb8 99 data[dataLength++] = position & 0xFF; //add the lower byte of the rotory position
Brandond200 10:2eb7b1614bb8 100 }
Brandond200 10:2eb7b1614bb8 101
Brandond200 10:2eb7b1614bb8 102 //read the rotory position and add alarm status to data to transmit
Brandond200 10:2eb7b1614bb8 103 void addAlarmData(uint16_t positionArg){
Brandond200 10:2eb7b1614bb8 104 int16_t position = positionArg / BYTE_TO_PERCENT;
Brandond200 10:2eb7b1614bb8 105
Brandond200 10:2eb7b1614bb8 106 data[dataLength++] = ALARM_DATA_CHANNEL;
Brandond200 10:2eb7b1614bb8 107 data[dataLength++] = ALARM_DATA_TYPE;
Brandond200 10:2eb7b1614bb8 108 data[dataLength++] = (uint8_t)position >= ALARM_THRESHOLD; //add binary for it allar triggered or not
Brandond200 10:2eb7b1614bb8 109 }
Brandond200 10:2eb7b1614bb8 110
Brandond200 10:2eb7b1614bb8 111 //callback for transmission timer
Brandond200 10:2eb7b1614bb8 112 void timerCallback(){
Brandond200 10:2eb7b1614bb8 113 flashLED(BLINK_COUNT_TIMER_TRANSMIT);
Brandond200 10:2eb7b1614bb8 114 transmitData(rotary.read_u16());
Brandond200 10:2eb7b1614bb8 115 }
Brandond200 10:2eb7b1614bb8 116
Brandond200 10:2eb7b1614bb8 117 //start flash LED
Brandond200 10:2eb7b1614bb8 118 void flashLED(uint8_t times){
Brandond200 10:2eb7b1614bb8 119 flashCount = times; //ste the number of times to flash
Brandond200 10:2eb7b1614bb8 120 led.write(1);//turn on LED
Brandond200 10:2eb7b1614bb8 121 TimerStart(&ledTimer);//start timer to toggle LED state
Brandond200 10:2eb7b1614bb8 122 }
Brandond200 10:2eb7b1614bb8 123
Brandond200 10:2eb7b1614bb8 124 //callback to change state of LED for blinking
Brandond200 10:2eb7b1614bb8 125 void flashLEDCallback(){
Brandond200 10:2eb7b1614bb8 126 //if the LED is on, turn it off
Brandond200 10:2eb7b1614bb8 127 if(led.read() == 1){
Brandond200 10:2eb7b1614bb8 128 led.write(0);
Brandond200 10:2eb7b1614bb8 129 flashCount--;
Brandond200 10:2eb7b1614bb8 130 //if done flashing turn off the timer
Brandond200 10:2eb7b1614bb8 131 if(flashCount <= 0){
Brandond200 10:2eb7b1614bb8 132 TimerStop(&ledTimer);
Brandond200 10:2eb7b1614bb8 133 }
Brandond200 10:2eb7b1614bb8 134 }
Brandond200 10:2eb7b1614bb8 135 //if LED is off, turn it on
Brandond200 10:2eb7b1614bb8 136 else{
Brandond200 10:2eb7b1614bb8 137 led.write(1);
Brandond200 10:2eb7b1614bb8 138 }
Brandond200 10:2eb7b1614bb8 139 }
Brandond200 10:2eb7b1614bb8 140
Brandond200 10:2eb7b1614bb8 141 //check if value passed in should trigger the alarm, if so, transmit
Brandond200 10:2eb7b1614bb8 142 void checkForAlarm(uint16_t positionArg){
Brandond200 10:2eb7b1614bb8 143 //check if should trigger alarm
Brandond200 10:2eb7b1614bb8 144 if(positionArg / BYTE_TO_PERCENT > ALARM_THRESHOLD){
Brandond200 10:2eb7b1614bb8 145 //if the alarm has not already been triggered
Brandond200 8:fb8b53c490e1 146 if(!alarmThresholdTirggered){
Brandond200 10:2eb7b1614bb8 147 alarmThresholdTirggered = true;//set the alarm to triggered
Brandond200 10:2eb7b1614bb8 148 flashLED(BLINK_COUNT_EVENT_TRANSMIT);
Brandond200 10:2eb7b1614bb8 149 transmitData(positionArg);//transmit data
Brandond200 8:fb8b53c490e1 150 }
Brandond200 8:fb8b53c490e1 151 }
Brandond200 8:fb8b53c490e1 152 else if(alarmThresholdTirggered){
Brandond200 8:fb8b53c490e1 153 alarmThresholdTirggered = false;
Brandond200 8:fb8b53c490e1 154 }
Brandond200 8:fb8b53c490e1 155 }