MAX20361 Demo with LoRa Module on LP1 mode

Dependencies:   SX1276GenericLib USBDevice

Fork of NonPingPong_PICO_LoRa_LP1 by Walter Luu

Committer:
walterluu
Date:
Fri Oct 16 06:50:04 2020 +0000
Revision:
7:6264bc5b6421
Parent:
6:51f492ca61a2
Child:
8:5ff74d7381dc
MAX20361 Demo with LoRa Module on LP1 mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
walterluu 3:85fc843a9d7d 1
walterluu 0:664d9df11a00 2 #include "mbed.h"
walterluu 3:85fc843a9d7d 3
walterluu 3:85fc843a9d7d 4 // Board pins related
walterluu 0:664d9df11a00 5 #include "PinMap.h"
walterluu 0:664d9df11a00 6
walterluu 3:85fc843a9d7d 7 // LORA related
walterluu 3:85fc843a9d7d 8 #include "global_buffers.h"
walterluu 3:85fc843a9d7d 9 #include "GenericPingPong2.h"
walterluu 3:85fc843a9d7d 10 #define FEATURE_LORA
walterluu 3:85fc843a9d7d 11 #include "sx1276-mbed-hal.h"
walterluu 3:85fc843a9d7d 12
walterluu 3:85fc843a9d7d 13 #include "main.h"
walterluu 0:664d9df11a00 14
walterluu 3:85fc843a9d7d 15 // OT07 related
walterluu 3:85fc843a9d7d 16 #include "OT07_lib.h"
walterluu 3:85fc843a9d7d 17 #define CONVERT_T_DELAY 30
walterluu 3:85fc843a9d7d 18
walterluu 3:85fc843a9d7d 19 // MAX44009 related
walterluu 3:85fc843a9d7d 20 #include "MAX44009_lib.h"
walterluu 3:85fc843a9d7d 21
walterluu 3:85fc843a9d7d 22 // AO32 related
walterluu 3:85fc843a9d7d 23 #include "AO32_lib.h"
walterluu 3:85fc843a9d7d 24
walterluu 6:51f492ca61a2 25 // AO19 related
walterluu 6:51f492ca61a2 26 #include "AO19_lib.h"
walterluu 6:51f492ca61a2 27
walterluu 7:6264bc5b6421 28 // Low Power Mode
walterluu 7:6264bc5b6421 29 #include "lp.h"
walterluu 7:6264bc5b6421 30 #include "mxc_config.h"
walterluu 7:6264bc5b6421 31 #include "lp.h"
walterluu 7:6264bc5b6421 32 #include "rtc.h"
walterluu 7:6264bc5b6421 33 //#include "board.h" // Cannot find source?
walterluu 7:6264bc5b6421 34 #define LP1_WakeTime 3 //seconds
walterluu 0:664d9df11a00 35
walterluu 3:85fc843a9d7d 36 // Virtual COM related
walterluu 3:85fc843a9d7d 37 #include "USBSerial.h" // for virtual COM
walterluu 0:664d9df11a00 38 #define BS 8 // ASCII Back Space
walterluu 0:664d9df11a00 39 #define CR 13 // ASCII Carriage Return
walterluu 0:664d9df11a00 40
walterluu 0:664d9df11a00 41 // Virtual serial port over USB TODO NEW VID PID NEEDED!!
walterluu 0:664d9df11a00 42 USBSerial pc(0x0B6A, 0x0042, 0x0001, false);
walterluu 0:664d9df11a00 43
walterluu 3:85fc843a9d7d 44 /***************************************************************************
walterluu 3:85fc843a9d7d 45 * LEDs Instantiation
walterluu 3:85fc843a9d7d 46 **************************************************************************/
walterluu 0:664d9df11a00 47 DigitalOut myled(LED2); // LED = LED2 green
walterluu 0:664d9df11a00 48 DigitalOut rLED(LED1); // red LED
walterluu 0:664d9df11a00 49 DigitalOut bLED(LED3); // blue LED
walterluu 3:85fc843a9d7d 50 //DigitalOut *led3;
walterluu 0:664d9df11a00 51
walterluu 3:85fc843a9d7d 52 /***************************************************************************
walterluu 3:85fc843a9d7d 53 * I2C Bus Instantiation
walterluu 3:85fc843a9d7d 54 **************************************************************************/
walterluu 3:85fc843a9d7d 55 I2C i2cBus0(P1_6, P1_7); // I2C of MAX32625PICO
walterluu 0:664d9df11a00 56
walterluu 0:664d9df11a00 57
walterluu 6:51f492ca61a2 58 bool get_data_flag = false; // used for data tramission frequency on the SENSOR side
walterluu 6:51f492ca61a2 59 bool print_data_flag = false; // used for data display on the GATEWAY side
walterluu 0:664d9df11a00 60
walterluu 3:85fc843a9d7d 61 //Timer setup
walterluu 6:51f492ca61a2 62 Ticker timer_1; // timer for data tramission frequency on the SENSOR side
walterluu 6:51f492ca61a2 63 Ticker timer_M; // timer for data print out on the GATEWAY side
walterluu 0:664d9df11a00 64
walterluu 3:85fc843a9d7d 65 void onTimerInterrupt(){
walterluu 3:85fc843a9d7d 66 get_data_flag = true;
walterluu 3:85fc843a9d7d 67 }
walterluu 0:664d9df11a00 68
walterluu 6:51f492ca61a2 69 void onGatewayInterrupt(){
walterluu 6:51f492ca61a2 70 print_data_flag = true;
walterluu 6:51f492ca61a2 71 }
walterluu 6:51f492ca61a2 72
walterluu 7:6264bc5b6421 73 // *****************************************************************************
walterluu 7:6264bc5b6421 74 void RTC_Setup()
walterluu 7:6264bc5b6421 75 {
walterluu 7:6264bc5b6421 76 rtc_cfg_t RTCconfig;
walterluu 7:6264bc5b6421 77
walterluu 7:6264bc5b6421 78 // RTCconfig.compareCount[0] = 3;//3 second timer
walterluu 7:6264bc5b6421 79 RTCconfig.compareCount[1] = LP1_WakeTime; //3 second timer
walterluu 7:6264bc5b6421 80 RTCconfig.prescaler = RTC_PRESCALE_DIV_2_12; //1Hz clock
walterluu 7:6264bc5b6421 81 RTCconfig.prescalerMask = RTC_PRESCALE_DIV_2_12;//used for prescaler compare
walterluu 7:6264bc5b6421 82 RTCconfig.snoozeCount = 0;
walterluu 7:6264bc5b6421 83 RTCconfig.snoozeMode = RTC_SNOOZE_DISABLE;
walterluu 7:6264bc5b6421 84
walterluu 7:6264bc5b6421 85 RTC_Init(&RTCconfig);
walterluu 7:6264bc5b6421 86
walterluu 7:6264bc5b6421 87 RTC_Start();
walterluu 7:6264bc5b6421 88 }
walterluu 7:6264bc5b6421 89
walterluu 7:6264bc5b6421 90 //void Wakeup_LP1() {
walterluu 7:6264bc5b6421 91 //
walterluu 7:6264bc5b6421 92 // /***************************************************************************
walterluu 7:6264bc5b6421 93 // * Temperature Sensor Data Measurement
walterluu 7:6264bc5b6421 94 // **************************************************************************/
walterluu 7:6264bc5b6421 95 // // obtain register hex values
walterluu 7:6264bc5b6421 96 // convert_temperature(&i2cBus0, OT07_i2c_add); //send OW convert selected device
walterluu 7:6264bc5b6421 97 // wait_ms(CONVERT_T_DELAY); //wait 20 ms for convert temperature to complete
walterluu 7:6264bc5b6421 98 // int temp_error = OT07_read_register(&i2cBus0, OT07_i2c_add, OT07_FIFO_DATA, rawtempdata, 2);
walterluu 7:6264bc5b6421 99 // double tempFinal = calc_temperature(rawtempdata);
walterluu 7:6264bc5b6421 100 //
walterluu 7:6264bc5b6421 101 // //fill raw temp data into the array
walterluu 7:6264bc5b6421 102 // curr_raw_temp_to_master[0] = rawtempdata[0];
walterluu 7:6264bc5b6421 103 // curr_raw_temp_to_master[1] = rawtempdata[1];
walterluu 7:6264bc5b6421 104 //
walterluu 7:6264bc5b6421 105 // /***************************************************************************
walterluu 7:6264bc5b6421 106 // * Light Intensity Sensor Data Measurement
walterluu 7:6264bc5b6421 107 // **************************************************************************/
walterluu 7:6264bc5b6421 108 // // obtain register hex values
walterluu 7:6264bc5b6421 109 // int lux_error = MAX44009_read_lux_register(&i2cBus0, MAX44009_i2c_add, MAX44009_LUX_HI, rawluxdata);
walterluu 7:6264bc5b6421 110 // int luxFinal = (int) (calc_lux(rawluxdata));
walterluu 7:6264bc5b6421 111 //
walterluu 7:6264bc5b6421 112 // //fill raw lux data into the array
walterluu 7:6264bc5b6421 113 // curr_raw_light_to_master[0] = rawluxdata[0];
walterluu 7:6264bc5b6421 114 // curr_raw_light_to_master[1] = rawluxdata[1];
walterluu 7:6264bc5b6421 115 //
walterluu 7:6264bc5b6421 116 // /***************************************************************************
walterluu 7:6264bc5b6421 117 // * Solar Harvester Data Measurement
walterluu 7:6264bc5b6421 118 // **************************************************************************/
walterluu 7:6264bc5b6421 119 //
walterluu 7:6264bc5b6421 120 // int ocv_error = AO32_read_register(&i2cBus0, AO32_i2c_add, AO32_VOC, rawOCVdata);
walterluu 7:6264bc5b6421 121 // int cnt_error = AO32_read_register(&i2cBus0, AO32_i2c_add, AO32_HARV_H, rawCntdata, 2); // burst read 2 bytes
walterluu 7:6264bc5b6421 122 //
walterluu 7:6264bc5b6421 123 // //calculate open circuit voltage from data
walterluu 7:6264bc5b6421 124 // double OCVFinal = calc_OCV(rawOCVdata);
walterluu 7:6264bc5b6421 125 //
walterluu 7:6264bc5b6421 126 // //calculate harvesting counts from data
walterluu 7:6264bc5b6421 127 // int countFinal = calc_Harvest(rawCntdata);
walterluu 7:6264bc5b6421 128 //
walterluu 7:6264bc5b6421 129 // //fill raw AO32 data into the array
walterluu 7:6264bc5b6421 130 // curr_raw_AO32_to_master[0] = rawOCVdata[0]; // Fill OCV hex first
walterluu 7:6264bc5b6421 131 // curr_raw_AO32_to_master[1] = rawCntdata[0]; // Fill Harvesting count high byte
walterluu 7:6264bc5b6421 132 // curr_raw_AO32_to_master[2] = rawCntdata[1]; // Fill Harvesting count low byte
walterluu 7:6264bc5b6421 133 //
walterluu 7:6264bc5b6421 134 // // print out sensor data
walterluu 7:6264bc5b6421 135 // pc.printf("SENSOR: [%.3f] [%d] [%.2f] [%d] [0]\r\n", tempFinal, luxFinal, OCVFinal, countFinal);
walterluu 7:6264bc5b6421 136 //
walterluu 7:6264bc5b6421 137 // /***************************************************************************
walterluu 7:6264bc5b6421 138 // * Fill Payload Buffer With Data From Main Program Buffers for next LoRa Transmition
walterluu 7:6264bc5b6421 139 // **************************************************************************/
walterluu 7:6264bc5b6421 140 // memcpy(&BufferTx[tx_idx_signature], PongMsg, size_signature);
walterluu 7:6264bc5b6421 141 // memcpy(&BufferTx[tx_idx_MAX30208], curr_raw_temp_to_master, size_of_MAX30208);
walterluu 7:6264bc5b6421 142 // memcpy(&BufferTx[tx_idx_MAX44009], curr_raw_light_to_master, size_of_MAX44009);
walterluu 7:6264bc5b6421 143 // memcpy(&BufferTx[tx_idx_MAX20361], curr_raw_AO32_to_master, size_of_MAX20361);
walterluu 7:6264bc5b6421 144 //
walterluu 7:6264bc5b6421 145 // /***************************************************************************
walterluu 7:6264bc5b6421 146 // * LoRa Communication: Send Sensor Data
walterluu 7:6264bc5b6421 147 // **************************************************************************/
walterluu 7:6264bc5b6421 148 // SX1276SlaveSendData();
walterluu 7:6264bc5b6421 149 //}
walterluu 7:6264bc5b6421 150
walterluu 0:664d9df11a00 151 int main() {
walterluu 0:664d9df11a00 152
walterluu 3:85fc843a9d7d 153 /***************************************************************************
walterluu 3:85fc843a9d7d 154
walterluu 3:85fc843a9d7d 155 /* Setup begins here: */
walterluu 3:85fc843a9d7d 156 #if MASTER == 1 // Master Device
walterluu 7:6264bc5b6421 157 rLED = LED_ON; // red LED on
walterluu 7:6264bc5b6421 158 myled = LED_OFF;
walterluu 7:6264bc5b6421 159 bLED = LED_OFF;
walterluu 3:85fc843a9d7d 160 #elif SLAVE == 1 // Slave Device
walterluu 7:6264bc5b6421 161 rLED = LED_OFF;
walterluu 7:6264bc5b6421 162 myled = LED_OFF;
walterluu 7:6264bc5b6421 163 bLED = LED_ON; // blue LED on
walterluu 7:6264bc5b6421 164
walterluu 7:6264bc5b6421 165 //configure RTC and start for slave
walterluu 7:6264bc5b6421 166 RTC_Setup();
walterluu 7:6264bc5b6421 167
walterluu 7:6264bc5b6421 168 // sleep(); // put slave in sleep mode LP2
walterluu 7:6264bc5b6421 169
walterluu 3:85fc843a9d7d 170 #endif
walterluu 3:85fc843a9d7d 171
walterluu 3:85fc843a9d7d 172 /***************************************************************************
walterluu 3:85fc843a9d7d 173 * Combined Payload Buffers for LoRa Communications
walterluu 3:85fc843a9d7d 174 **************************************************************************/
walterluu 3:85fc843a9d7d 175 uint8_t BufferTx[BufferSizeTx]; // more info in global_buffers.h
walterluu 3:85fc843a9d7d 176 uint8_t BufferRx[BufferSizeRx]; // more info in global_buffers.h
walterluu 3:85fc843a9d7d 177
walterluu 3:85fc843a9d7d 178 /***************************************************************************
walterluu 3:85fc843a9d7d 179 * Identification Buffers
walterluu 3:85fc843a9d7d 180 **************************************************************************/
walterluu 3:85fc843a9d7d 181 #if MASTER == 1 // Master Device
walterluu 3:85fc843a9d7d 182 uint8_t ID_of_slave[size_signature];
walterluu 3:85fc843a9d7d 183 #elif SLAVE == 1 // Slave Device
walterluu 3:85fc843a9d7d 184 uint8_t ID_of_master[size_signature];
walterluu 3:85fc843a9d7d 185 #endif
walterluu 3:85fc843a9d7d 186
walterluu 3:85fc843a9d7d 187 /***************************************************************************
walterluu 3:85fc843a9d7d 188 * MAX30208 Data Buffers
walterluu 3:85fc843a9d7d 189 **************************************************************************/
walterluu 3:85fc843a9d7d 190 #if MASTER == 1 // Master Device
walterluu 5:9e751733a6f3 191 char curr_raw_temp_from_slave[size_of_MAX30208]; // to match data type
walterluu 6:51f492ca61a2 192 char prev_raw_temp_from_slave[size_of_MAX30208];
walterluu 3:85fc843a9d7d 193 #elif SLAVE == 1 // Slave Device
walterluu 3:85fc843a9d7d 194 uint8_t curr_raw_temp_to_master[size_of_MAX30208];
walterluu 3:85fc843a9d7d 195 #endif
walterluu 3:85fc843a9d7d 196
walterluu 0:664d9df11a00 197
walterluu 3:85fc843a9d7d 198 /***************************************************************************
walterluu 3:85fc843a9d7d 199 * MAX44009 Data Buffers
walterluu 3:85fc843a9d7d 200 **************************************************************************/
walterluu 3:85fc843a9d7d 201 #if MASTER == 1 // Master Device
walterluu 5:9e751733a6f3 202 char curr_raw_light_from_slave[size_of_MAX44009]; // to match data type
walterluu 6:51f492ca61a2 203 char prev_raw_light_from_slave[size_of_MAX44009];
walterluu 3:85fc843a9d7d 204 #elif SLAVE == 1 // Slave Device
walterluu 3:85fc843a9d7d 205 uint8_t curr_raw_light_to_master[size_of_MAX44009];
walterluu 3:85fc843a9d7d 206 #endif
walterluu 3:85fc843a9d7d 207
walterluu 3:85fc843a9d7d 208 /***************************************************************************
walterluu 3:85fc843a9d7d 209 * MAX20361 Data Buffers
walterluu 3:85fc843a9d7d 210 **************************************************************************/
walterluu 3:85fc843a9d7d 211 #if MASTER == 1 // Master Device
walterluu 5:9e751733a6f3 212 char curr_raw_AO32_from_slave[size_of_MAX20361]; // to match data type
walterluu 6:51f492ca61a2 213 char prev_raw_AO32_from_slave[size_of_MAX20361];
walterluu 3:85fc843a9d7d 214 #elif SLAVE == 1 // Slave Device
walterluu 3:85fc843a9d7d 215 uint8_t curr_raw_AO32_to_master[size_of_MAX20361];
walterluu 3:85fc843a9d7d 216 #endif
walterluu 3:85fc843a9d7d 217
walterluu 3:85fc843a9d7d 218 /***************************************************************************
walterluu 3:85fc843a9d7d 219 * Finish Setting up LoRa Radios: This passes in pointers to Buffers to send
walterluu 3:85fc843a9d7d 220 **************************************************************************/
walterluu 3:85fc843a9d7d 221 SX1276PingPongSetup(BufferTx, BufferRx, &pc);
walterluu 3:85fc843a9d7d 222
walterluu 7:6264bc5b6421 223 // Pointer Tutorial
walterluu 3:85fc843a9d7d 224 // https://www.tutorialspoint.com/cprogramming/c_pointers.htm
walterluu 3:85fc843a9d7d 225
walterluu 3:85fc843a9d7d 226 /***************************************************************************
walterluu 3:85fc843a9d7d 227 * Create Dummy Data For Master and Slave
walterluu 3:85fc843a9d7d 228 **************************************************************************/
walterluu 0:664d9df11a00 229
walterluu 3:85fc843a9d7d 230 #if SLAVE == 1
walterluu 7:6264bc5b6421 231 // curr_raw_temp_to_master[0] = 99;
walterluu 7:6264bc5b6421 232 // curr_raw_temp_to_master[1] = 99;
walterluu 7:6264bc5b6421 233 //
walterluu 7:6264bc5b6421 234 // curr_raw_light_to_master[0] = 25;
walterluu 7:6264bc5b6421 235 // curr_raw_light_to_master[1] = 26;
walterluu 7:6264bc5b6421 236 //
walterluu 7:6264bc5b6421 237 // curr_raw_AO32_to_master[0] = 99;
walterluu 7:6264bc5b6421 238 // curr_raw_AO32_to_master[1] = 0;
walterluu 7:6264bc5b6421 239 // curr_raw_AO32_to_master[2] = 101;
walterluu 7:6264bc5b6421 240 // curr_raw_AO32_to_master[3] = 102;
walterluu 3:85fc843a9d7d 241 #endif
walterluu 3:85fc843a9d7d 242
walterluu 3:85fc843a9d7d 243 /***************************************************************************
walterluu 3:85fc843a9d7d 244 * Loop Counter
walterluu 3:85fc843a9d7d 245 **************************************************************************/
walterluu 3:85fc843a9d7d 246 int loopCnt = 0;
walterluu 3:85fc843a9d7d 247
walterluu 6:51f492ca61a2 248 #if MASTER == 1
walterluu 6:51f492ca61a2 249 //************* init ticker timer callbacks ****************
walterluu 6:51f492ca61a2 250 timer_M.attach(&onGatewayInterrupt, 3); //Gateway data print out frequency
walterluu 6:51f492ca61a2 251 #endif
walterluu 6:51f492ca61a2 252
walterluu 3:85fc843a9d7d 253 #if SLAVE == 1
walterluu 3:85fc843a9d7d 254 //************* init ticker timer callbacks ****************
walterluu 7:6264bc5b6421 255 timer_1.attach(&onTimerInterrupt, 10); //Sensor data transmission frequency
walterluu 3:85fc843a9d7d 256
walterluu 6:51f492ca61a2 257 //************* OT07 Variables ****************
walterluu 3:85fc843a9d7d 258 char rawtempdata[2];
walterluu 3:85fc843a9d7d 259 char OT07_i2c_add = 0xA0;
walterluu 3:85fc843a9d7d 260
walterluu 3:85fc843a9d7d 261 //************* MAX44009 Variables ****************
walterluu 3:85fc843a9d7d 262 char rawluxdata[2];
walterluu 5:9e751733a6f3 263 char MAX44009_i2c_add = 0x94; // 0b1001 010x
walterluu 3:85fc843a9d7d 264
walterluu 3:85fc843a9d7d 265 //************* AO32 Variables ****************
walterluu 3:85fc843a9d7d 266 char rawOCVdata[2]; // only needs 1
walterluu 3:85fc843a9d7d 267 char rawCntdata[2];
walterluu 3:85fc843a9d7d 268 char AO32_i2c_add = 0x2A; // 0b0010 101x
walterluu 3:85fc843a9d7d 269
walterluu 6:51f492ca61a2 270 //************* AO19 Settings ****************
walterluu 6:51f492ca61a2 271 // Enable AO19
walterluu 6:51f492ca61a2 272 char AO19_i2c_add = 0xD0; //
walterluu 6:51f492ca61a2 273 char AO19_BB_CFG[2]; // store result of AO19's register 0x01 BBstCfg0
walterluu 6:51f492ca61a2 274 int AO19_read = AO19_read_register(&i2cBus0, AO19_i2c_add, AO19_BB_CFG0, AO19_BB_CFG);
walterluu 6:51f492ca61a2 275
walterluu 6:51f492ca61a2 276 int AO19_en = AO19_write_register(&i2cBus0, AO19_i2c_add, AO19_BB_CFG0, AO19_BB_CFG[0]|0x80);
walterluu 6:51f492ca61a2 277
walterluu 6:51f492ca61a2 278 // if (AO19_en) {
walterluu 6:51f492ca61a2 279 // pc.printf("AO19 Enabled fail!\r\n");
walterluu 6:51f492ca61a2 280 // }
walterluu 6:51f492ca61a2 281 // else {
walterluu 6:51f492ca61a2 282 // pc.printf("AO19 Enabledsuccess!\r\n");
walterluu 6:51f492ca61a2 283 // }
walterluu 6:51f492ca61a2 284
walterluu 3:85fc843a9d7d 285 #endif
walterluu 0:664d9df11a00 286
walterluu 3:85fc843a9d7d 287 while (1) {
walterluu 6:51f492ca61a2 288
walterluu 3:85fc843a9d7d 289 #if SLAVE == 1
walterluu 7:6264bc5b6421 290
walterluu 7:6264bc5b6421 291 // Slave sleeps before interrupt calls
walterluu 7:6264bc5b6421 292 // sleep();
walterluu 7:6264bc5b6421 293
walterluu 7:6264bc5b6421 294 /***************************************************************************
walterluu 7:6264bc5b6421 295 * LP1 Experiment
walterluu 7:6264bc5b6421 296 **************************************************************************/
walterluu 7:6264bc5b6421 297 //Clear existing wake-up config
walterluu 7:6264bc5b6421 298 LP_ClearWakeUpConfig();
walterluu 7:6264bc5b6421 299
walterluu 7:6264bc5b6421 300 //Clear any event flags
walterluu 7:6264bc5b6421 301 LP_ClearWakeUpFlags();
walterluu 7:6264bc5b6421 302
walterluu 7:6264bc5b6421 303 //configure wake-up on RTC compare 1
walterluu 7:6264bc5b6421 304 LP_ConfigRTCWakeUp(0, 1, 0, 0);
walterluu 7:6264bc5b6421 305
walterluu 7:6264bc5b6421 306
walterluu 7:6264bc5b6421 307 //set RTC compare 1 value
walterluu 7:6264bc5b6421 308 uint32_t cmp = RTC_GetCount() + LP1_WakeTime;
walterluu 7:6264bc5b6421 309 RTC_SetCompare(1,cmp);
walterluu 7:6264bc5b6421 310 RTC_ClearFlags(MXC_F_RTC_FLAGS_COMP1);
walterluu 7:6264bc5b6421 311
walterluu 7:6264bc5b6421 312 //global disable interrupt
walterluu 7:6264bc5b6421 313 __disable_irq();
walterluu 7:6264bc5b6421 314
walterluu 7:6264bc5b6421 315 LP_EnterLP1();
walterluu 7:6264bc5b6421 316
walterluu 7:6264bc5b6421 317 //global enable interrupt
walterluu 7:6264bc5b6421 318 __enable_irq();
walterluu 7:6264bc5b6421 319
walterluu 7:6264bc5b6421 320 // Wakeup_LP1();
walterluu 7:6264bc5b6421 321 // Wake up from LP1, collect data and send
walterluu 3:85fc843a9d7d 322
walterluu 3:85fc843a9d7d 323 /***************************************************************************
walterluu 3:85fc843a9d7d 324 * Temperature Sensor Data Measurement
walterluu 3:85fc843a9d7d 325 **************************************************************************/
walterluu 3:85fc843a9d7d 326 // obtain register hex values
walterluu 3:85fc843a9d7d 327 convert_temperature(&i2cBus0, OT07_i2c_add); //send OW convert selected device
walterluu 3:85fc843a9d7d 328 wait_ms(CONVERT_T_DELAY); //wait 20 ms for convert temperature to complete
walterluu 3:85fc843a9d7d 329 int temp_error = OT07_read_register(&i2cBus0, OT07_i2c_add, OT07_FIFO_DATA, rawtempdata, 2);
walterluu 5:9e751733a6f3 330 double tempFinal = calc_temperature(rawtempdata);
walterluu 3:85fc843a9d7d 331
walterluu 3:85fc843a9d7d 332 //fill raw temp data into the array
walterluu 3:85fc843a9d7d 333 curr_raw_temp_to_master[0] = rawtempdata[0];
walterluu 3:85fc843a9d7d 334 curr_raw_temp_to_master[1] = rawtempdata[1];
walterluu 0:664d9df11a00 335
walterluu 3:85fc843a9d7d 336 /***************************************************************************
walterluu 3:85fc843a9d7d 337 * Light Intensity Sensor Data Measurement
walterluu 3:85fc843a9d7d 338 **************************************************************************/
walterluu 3:85fc843a9d7d 339 // obtain register hex values
walterluu 5:9e751733a6f3 340 int lux_error = MAX44009_read_lux_register(&i2cBus0, MAX44009_i2c_add, MAX44009_LUX_HI, rawluxdata);
walterluu 6:51f492ca61a2 341 int luxFinal = (int) (calc_lux(rawluxdata));
walterluu 3:85fc843a9d7d 342
walterluu 3:85fc843a9d7d 343 //fill raw lux data into the array
walterluu 5:9e751733a6f3 344 curr_raw_light_to_master[0] = rawluxdata[0];
walterluu 5:9e751733a6f3 345 curr_raw_light_to_master[1] = rawluxdata[1];
walterluu 3:85fc843a9d7d 346
walterluu 3:85fc843a9d7d 347 /***************************************************************************
walterluu 3:85fc843a9d7d 348 * Solar Harvester Data Measurement
walterluu 3:85fc843a9d7d 349 **************************************************************************/
walterluu 3:85fc843a9d7d 350
walterluu 3:85fc843a9d7d 351 int ocv_error = AO32_read_register(&i2cBus0, AO32_i2c_add, AO32_VOC, rawOCVdata);
walterluu 3:85fc843a9d7d 352 int cnt_error = AO32_read_register(&i2cBus0, AO32_i2c_add, AO32_HARV_H, rawCntdata, 2); // burst read 2 bytes
walterluu 3:85fc843a9d7d 353
walterluu 3:85fc843a9d7d 354 //calculate open circuit voltage from data
walterluu 7:6264bc5b6421 355 // double voltage = (double)(rawOCVdata[0]) / 100;
walterluu 5:9e751733a6f3 356 double OCVFinal = calc_OCV(rawOCVdata);
walterluu 3:85fc843a9d7d 357
walterluu 3:85fc843a9d7d 358 //calculate harvesting counts from data
walterluu 5:9e751733a6f3 359 int countFinal = calc_Harvest(rawCntdata);
walterluu 3:85fc843a9d7d 360
walterluu 3:85fc843a9d7d 361 //fill raw AO32 data into the array
walterluu 5:9e751733a6f3 362 curr_raw_AO32_to_master[0] = rawOCVdata[0]; // Fill OCV hex first
walterluu 5:9e751733a6f3 363 curr_raw_AO32_to_master[1] = rawCntdata[0]; // Fill Harvesting count high byte
walterluu 5:9e751733a6f3 364 curr_raw_AO32_to_master[2] = rawCntdata[1]; // Fill Harvesting count low byte
walterluu 0:664d9df11a00 365
walterluu 6:51f492ca61a2 366 // print out sensor data
walterluu 6:51f492ca61a2 367 pc.printf("SENSOR: [%.3f] [%d] [%.2f] [%d] [0]\r\n", tempFinal, luxFinal, OCVFinal, countFinal);
walterluu 6:51f492ca61a2 368
walterluu 3:85fc843a9d7d 369 /***************************************************************************
walterluu 3:85fc843a9d7d 370 * Fill Payload Buffer With Data From Main Program Buffers for next LoRa Transmition
walterluu 3:85fc843a9d7d 371 **************************************************************************/
walterluu 3:85fc843a9d7d 372 memcpy(&BufferTx[tx_idx_signature], PongMsg, size_signature);
walterluu 3:85fc843a9d7d 373 memcpy(&BufferTx[tx_idx_MAX30208], curr_raw_temp_to_master, size_of_MAX30208);
walterluu 3:85fc843a9d7d 374 memcpy(&BufferTx[tx_idx_MAX44009], curr_raw_light_to_master, size_of_MAX44009);
walterluu 3:85fc843a9d7d 375 memcpy(&BufferTx[tx_idx_MAX20361], curr_raw_AO32_to_master, size_of_MAX20361);
walterluu 7:6264bc5b6421 376
walterluu 3:85fc843a9d7d 377 /***************************************************************************
walterluu 3:85fc843a9d7d 378 * LoRa Communication: Send Sensor Data
walterluu 3:85fc843a9d7d 379 **************************************************************************/
walterluu 7:6264bc5b6421 380 SX1276SlaveSendData();
walterluu 7:6264bc5b6421 381
walterluu 3:85fc843a9d7d 382 /***************************************************************************
walterluu 7:6264bc5b6421 383 * Old scheme for timer interrupt
walterluu 3:85fc843a9d7d 384 **************************************************************************/
walterluu 7:6264bc5b6421 385 // if(get_data_flag) {
walterluu 7:6264bc5b6421 386 //
walterluu 7:6264bc5b6421 387 // //reset the flag
walterluu 7:6264bc5b6421 388 // get_data_flag = false;
walterluu 7:6264bc5b6421 389 //// pc.printf("Timer interval reached!\r\n");
walterluu 7:6264bc5b6421 390 //
walterluu 7:6264bc5b6421 391 // /***************************************************************************
walterluu 7:6264bc5b6421 392 // * Temperature Sensor Data Measurement
walterluu 7:6264bc5b6421 393 // **************************************************************************/
walterluu 7:6264bc5b6421 394 // // obtain register hex values
walterluu 7:6264bc5b6421 395 // convert_temperature(&i2cBus0, OT07_i2c_add); //send OW convert selected device
walterluu 7:6264bc5b6421 396 // wait_ms(CONVERT_T_DELAY); //wait 20 ms for convert temperature to complete
walterluu 7:6264bc5b6421 397 // int temp_error = OT07_read_register(&i2cBus0, OT07_i2c_add, OT07_FIFO_DATA, rawtempdata, 2);
walterluu 7:6264bc5b6421 398 // double tempFinal = calc_temperature(rawtempdata);
walterluu 7:6264bc5b6421 399 //
walterluu 7:6264bc5b6421 400 // //fill raw temp data into the array
walterluu 7:6264bc5b6421 401 // curr_raw_temp_to_master[0] = rawtempdata[0];
walterluu 7:6264bc5b6421 402 // curr_raw_temp_to_master[1] = rawtempdata[1];
walterluu 7:6264bc5b6421 403 //
walterluu 7:6264bc5b6421 404 // /***************************************************************************
walterluu 7:6264bc5b6421 405 // * Light Intensity Sensor Data Measurement
walterluu 7:6264bc5b6421 406 // **************************************************************************/
walterluu 7:6264bc5b6421 407 // // obtain register hex values
walterluu 7:6264bc5b6421 408 // int lux_error = MAX44009_read_lux_register(&i2cBus0, MAX44009_i2c_add, MAX44009_LUX_HI, rawluxdata);
walterluu 7:6264bc5b6421 409 // int luxFinal = (int) (calc_lux(rawluxdata));
walterluu 7:6264bc5b6421 410 //
walterluu 7:6264bc5b6421 411 // //fill raw lux data into the array
walterluu 7:6264bc5b6421 412 // curr_raw_light_to_master[0] = rawluxdata[0];
walterluu 7:6264bc5b6421 413 // curr_raw_light_to_master[1] = rawluxdata[1];
walterluu 7:6264bc5b6421 414 //
walterluu 7:6264bc5b6421 415 // /***************************************************************************
walterluu 7:6264bc5b6421 416 // * Solar Harvester Data Measurement
walterluu 7:6264bc5b6421 417 // **************************************************************************/
walterluu 7:6264bc5b6421 418 //
walterluu 7:6264bc5b6421 419 // int ocv_error = AO32_read_register(&i2cBus0, AO32_i2c_add, AO32_VOC, rawOCVdata);
walterluu 7:6264bc5b6421 420 // int cnt_error = AO32_read_register(&i2cBus0, AO32_i2c_add, AO32_HARV_H, rawCntdata, 2); // burst read 2 bytes
walterluu 7:6264bc5b6421 421 //
walterluu 7:6264bc5b6421 422 // //calculate open circuit voltage from data
walterluu 7:6264bc5b6421 423 //// double voltage = (double)(rawOCVdata[0]) / 100;
walterluu 7:6264bc5b6421 424 // double OCVFinal = calc_OCV(rawOCVdata);
walterluu 7:6264bc5b6421 425 //
walterluu 7:6264bc5b6421 426 // //calculate harvesting counts from data
walterluu 7:6264bc5b6421 427 // int countFinal = calc_Harvest(rawCntdata);
walterluu 7:6264bc5b6421 428 //
walterluu 7:6264bc5b6421 429 // //fill raw AO32 data into the array
walterluu 7:6264bc5b6421 430 // curr_raw_AO32_to_master[0] = rawOCVdata[0]; // Fill OCV hex first
walterluu 7:6264bc5b6421 431 // curr_raw_AO32_to_master[1] = rawCntdata[0]; // Fill Harvesting count high byte
walterluu 7:6264bc5b6421 432 // curr_raw_AO32_to_master[2] = rawCntdata[1]; // Fill Harvesting count low byte
walterluu 7:6264bc5b6421 433 //
walterluu 7:6264bc5b6421 434 // // print out sensor data
walterluu 7:6264bc5b6421 435 // pc.printf("SENSOR: [%.3f] [%d] [%.2f] [%d] [0]\r\n", tempFinal, luxFinal, OCVFinal, countFinal);
walterluu 7:6264bc5b6421 436 //
walterluu 7:6264bc5b6421 437 // /***************************************************************************
walterluu 7:6264bc5b6421 438 // * Fill Payload Buffer With Data From Main Program Buffers for next LoRa Transmition
walterluu 7:6264bc5b6421 439 // **************************************************************************/
walterluu 7:6264bc5b6421 440 // memcpy(&BufferTx[tx_idx_signature], PongMsg, size_signature);
walterluu 7:6264bc5b6421 441 // memcpy(&BufferTx[tx_idx_MAX30208], curr_raw_temp_to_master, size_of_MAX30208);
walterluu 7:6264bc5b6421 442 // memcpy(&BufferTx[tx_idx_MAX44009], curr_raw_light_to_master, size_of_MAX44009);
walterluu 7:6264bc5b6421 443 // memcpy(&BufferTx[tx_idx_MAX20361], curr_raw_AO32_to_master, size_of_MAX20361);
walterluu 7:6264bc5b6421 444 //
walterluu 7:6264bc5b6421 445 // /***************************************************************************
walterluu 7:6264bc5b6421 446 // * LoRa Communication: Send Sensor Data
walterluu 7:6264bc5b6421 447 // **************************************************************************/
walterluu 7:6264bc5b6421 448 //// SX1276PingPong();
walterluu 7:6264bc5b6421 449 // SX1276SlaveSendData();
walterluu 7:6264bc5b6421 450 // loopCnt = loopCnt + 1;
walterluu 7:6264bc5b6421 451 // } // end of transmission frequency for slave
walterluu 7:6264bc5b6421 452 /***************************************************************************
walterluu 7:6264bc5b6421 453 * End of Old scheme for timer interrupt
walterluu 7:6264bc5b6421 454 **************************************************************************/
walterluu 7:6264bc5b6421 455
walterluu 7:6264bc5b6421 456 #endif // end define for Slave
walterluu 3:85fc843a9d7d 457
walterluu 3:85fc843a9d7d 458
walterluu 7:6264bc5b6421 459 #if MASTER == 1 // only Receive Sensor Data
walterluu 3:85fc843a9d7d 460 /***************************************************************************
walterluu 3:85fc843a9d7d 461 * Fill Payload Buffer With Data From Main Program Buffers for next LoRa Transmition
walterluu 3:85fc843a9d7d 462 **************************************************************************/
walterluu 7:6264bc5b6421 463 memcpy(&BufferTx[tx_idx_signature], PingMsg, size_signature); // no need
walterluu 3:85fc843a9d7d 464
walterluu 3:85fc843a9d7d 465 /***************************************************************************
walterluu 3:85fc843a9d7d 466 * LoRa Communication: Gateway Receive Sensor Data
walterluu 3:85fc843a9d7d 467 **************************************************************************/
walterluu 7:6264bc5b6421 468 // SX1276PingPong();
walterluu 7:6264bc5b6421 469 if(SX1276MasterCheckForNewData())
walterluu 7:6264bc5b6421 470 {
walterluu 3:85fc843a9d7d 471
walterluu 3:85fc843a9d7d 472 /***************************************************************************
walterluu 3:85fc843a9d7d 473 * Fill Main Program Buffers With Data From Received Payload Buffer
walterluu 3:85fc843a9d7d 474 **************************************************************************/
walterluu 3:85fc843a9d7d 475 memcpy(ID_of_slave, &BufferRx[rx_idx_signature], size_signature);
walterluu 3:85fc843a9d7d 476 memcpy(curr_raw_temp_from_slave, &BufferRx[rx_idx_MAX30208], size_of_MAX30208);
walterluu 3:85fc843a9d7d 477 memcpy(curr_raw_light_from_slave, &BufferRx[rx_idx_MAX44009], size_of_MAX44009);
walterluu 3:85fc843a9d7d 478 memcpy(curr_raw_AO32_from_slave, &BufferRx[rx_idx_MAX20361], size_of_MAX20361);
walterluu 3:85fc843a9d7d 479
walterluu 3:85fc843a9d7d 480 /***************************************************************************
walterluu 3:85fc843a9d7d 481 * Master Device: Print out Slave Data
walterluu 3:85fc843a9d7d 482 **************************************************************************/
walterluu 3:85fc843a9d7d 483
walterluu 5:9e751733a6f3 484 double tempResult = calc_temperature(curr_raw_temp_from_slave);
walterluu 6:51f492ca61a2 485 int luxResult = (int) calc_lux(curr_raw_light_from_slave);
walterluu 5:9e751733a6f3 486
walterluu 5:9e751733a6f3 487 char OCVrawHex[2];
walterluu 5:9e751733a6f3 488 OCVrawHex[0] = curr_raw_AO32_from_slave[0];
walterluu 5:9e751733a6f3 489 OCVrawHex[1] = curr_raw_AO32_from_slave[1];
walterluu 5:9e751733a6f3 490 char CntrawHex[2];
walterluu 5:9e751733a6f3 491 CntrawHex[0] = curr_raw_AO32_from_slave[2];
walterluu 5:9e751733a6f3 492 CntrawHex[1] = curr_raw_AO32_from_slave[3];
walterluu 5:9e751733a6f3 493
walterluu 5:9e751733a6f3 494 double OCVResult = calc_OCV(OCVrawHex);
walterluu 5:9e751733a6f3 495 int CntResult = calc_Harvest(CntrawHex);
walterluu 7:6264bc5b6421 496
walterluu 7:6264bc5b6421 497 //reset the flag
walterluu 7:6264bc5b6421 498 print_data_flag = false; // no need
walterluu 7:6264bc5b6421 499 pc.printf("MSG: [%.3f] [%d] [%.2f] [%d] [0]\r\n", tempResult, luxResult, OCVResult, CntResult);
walterluu 3:85fc843a9d7d 500
walterluu 7:6264bc5b6421 501 } // end of SX1276MasterCheckForNewData
walterluu 7:6264bc5b6421 502
walterluu 3:85fc843a9d7d 503 loopCnt = loopCnt + 1;
walterluu 3:85fc843a9d7d 504
walterluu 7:6264bc5b6421 505 #endif // end define for Master
walterluu 7:6264bc5b6421 506
walterluu 7:6264bc5b6421 507 // sleep(); // going back to sleep mode
walterluu 3:85fc843a9d7d 508
walterluu 3:85fc843a9d7d 509 } // end of while(1) loop
walterluu 3:85fc843a9d7d 510
walterluu 6:51f492ca61a2 511 } // end of main()