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.
Dependencies: libmDot-dev-mbed5-deprecated ISL29011
Fork of mdot-examples by
copy_main.cpp@25:c92ef8ae7efb, 2018-01-10 (annotated)
- Committer:
- SDesign2018
- Date:
- Wed Jan 10 17:42:23 2018 +0000
- Revision:
- 25:c92ef8ae7efb
- Parent:
- 24:88c7bebf0b05
Welp, ticker and interrupt works now. I messed up and used accelerometer trigger in my if statement instead of the temperature.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| SDesign2018 | 20:dba07b7d9675 | 1 | #include <stdlib.h> |
| SDesign2018 | 20:dba07b7d9675 | 2 | #include <iostream> |
| SDesign2018 | 20:dba07b7d9675 | 3 | #include <string.h> |
| SDesign2018 | 20:dba07b7d9675 | 4 | #include <mbed.h> |
| SDesign2018 | 20:dba07b7d9675 | 5 | #include "dot_util.h" |
| SDesign2018 | 20:dba07b7d9675 | 6 | #include "RadioEvent.h" |
| SDesign2018 | 20:dba07b7d9675 | 7 | #include "itoa.h" |
| SDesign2018 | 20:dba07b7d9675 | 8 | |
| SDesign2018 | 20:dba07b7d9675 | 9 | #define BUFFER_SIZE 10 |
| SDesign2018 | 20:dba07b7d9675 | 10 | |
| SDesign2018 | 20:dba07b7d9675 | 11 | |
| SDesign2018 | 20:dba07b7d9675 | 12 | ///////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 13 | // -------------------- DOT LIBRARY REQUIRED ------------------------------// |
| SDesign2018 | 20:dba07b7d9675 | 14 | // * Because these example programs can be used for both mDot and xDot // |
| SDesign2018 | 20:dba07b7d9675 | 15 | // devices, the LoRa stack is not included. The libmDot library should // |
| SDesign2018 | 20:dba07b7d9675 | 16 | // be imported if building for mDot devices. The libxDot library // |
| SDesign2018 | 20:dba07b7d9675 | 17 | // should be imported if building for xDot devices. // |
| SDesign2018 | 20:dba07b7d9675 | 18 | // * https://developer.mbed.org/teams/MultiTech/code/libmDot-dev-mbed5/ // |
| SDesign2018 | 20:dba07b7d9675 | 19 | // * https://developer.mbed.org/teams/MultiTech/code/libmDot-mbed5/ // |
| SDesign2018 | 20:dba07b7d9675 | 20 | // * https://developer.mbed.org/teams/MultiTech/code/libxDot-dev-mbed5/ // |
| SDesign2018 | 20:dba07b7d9675 | 21 | // * https://developer.mbed.org/teams/MultiTech/code/libxDot-mbed5/ // |
| SDesign2018 | 20:dba07b7d9675 | 22 | ///////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 23 | |
| SDesign2018 | 20:dba07b7d9675 | 24 | |
| SDesign2018 | 20:dba07b7d9675 | 25 | ///////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 26 | // * these options must match between the two devices in // |
| SDesign2018 | 20:dba07b7d9675 | 27 | // order for communication to be successful |
| SDesign2018 | 20:dba07b7d9675 | 28 | //-------------------MDOT variables------------------------// |
| SDesign2018 | 20:dba07b7d9675 | 29 | ///////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 30 | static uint8_t network_address[] = { 0x00, 0x11, 0x22, 0x33 }; |
| SDesign2018 | 20:dba07b7d9675 | 31 | static uint8_t network_session_key[] = { 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33 }; |
| SDesign2018 | 20:dba07b7d9675 | 32 | static uint8_t data_session_key[] = { 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00 }; |
| SDesign2018 | 20:dba07b7d9675 | 33 | |
| SDesign2018 | 20:dba07b7d9675 | 34 | mDot* dot = NULL; |
| SDesign2018 | 20:dba07b7d9675 | 35 | lora::ChannelPlan* plan = NULL; |
| SDesign2018 | 20:dba07b7d9675 | 36 | //--------------End of MDOT variables-------------------// |
| SDesign2018 | 20:dba07b7d9675 | 37 | |
| SDesign2018 | 20:dba07b7d9675 | 38 | Serial pc(USBTX, USBRX); |
| SDesign2018 | 20:dba07b7d9675 | 39 | Ticker Periodic; |
| SDesign2018 | 20:dba07b7d9675 | 40 | |
| SDesign2018 | 20:dba07b7d9675 | 41 | // ADXL372 Slave I2C |
| SDesign2018 | 20:dba07b7d9675 | 42 | I2C ADXL372(I2C_SDA, I2C_SCL); // (D14,D15) (MISO, CS) |
| SDesign2018 | 20:dba07b7d9675 | 43 | |
| SDesign2018 | 20:dba07b7d9675 | 44 | // ADT7410 Temperature |
| SDesign2018 | 20:dba07b7d9675 | 45 | I2C ADT7410(I2C_SDA, I2C_SCL); // Attempt at making I2C connection to slaves (D14,D15) |
| SDesign2018 | 20:dba07b7d9675 | 46 | InterruptIn ADT7410_Int(D2); // Allow this pin for ADT7410 Interrupt critical temperature notice |
| SDesign2018 | 20:dba07b7d9675 | 47 | |
| SDesign2018 | 20:dba07b7d9675 | 48 | // DS7505s Temperature |
| SDesign2018 | 20:dba07b7d9675 | 49 | I2C DS7505(I2C_SDA, I2C_SCL); // Attempt at making I2C connection to slaves (D14,D15) |
| SDesign2018 | 20:dba07b7d9675 | 50 | |
| SDesign2018 | 20:dba07b7d9675 | 51 | // Create reocurring interrupt function that could be used to periodically take temperatures |
| SDesign2018 | 20:dba07b7d9675 | 52 | // Not working right now due to some mutex initialize error |
| SDesign2018 | 20:dba07b7d9675 | 53 | // Suspect that it is due to it having be a RTOS task thing |
| SDesign2018 | 20:dba07b7d9675 | 54 | // Should probably go back to using an in processor timer interrupt instead of mbed |
| SDesign2018 | 20:dba07b7d9675 | 55 | |
| SDesign2018 | 20:dba07b7d9675 | 56 | const int ADT7410_Address_7BIT = 0x49; // A0 set HIGH and A1 set LOW |
| SDesign2018 | 20:dba07b7d9675 | 57 | const int ADT7410_Address_8BIT = ADT7410_Address_7BIT << 1; // Shift 1 bit to left for R/~W bit, and basic I2C format |
| SDesign2018 | 20:dba07b7d9675 | 58 | |
| SDesign2018 | 20:dba07b7d9675 | 59 | const int ADXL372_Address_7bit = 0x1D; // Address for the I2C if MISO pulled low, 0x53 if pulled high |
| SDesign2018 | 20:dba07b7d9675 | 60 | const int ADXL372_Address_8bit = ADXL372_Address_7bit << 1; // Same |
| SDesign2018 | 20:dba07b7d9675 | 61 | |
| SDesign2018 | 20:dba07b7d9675 | 62 | const int DS7505s_Address_7bit = 0x48; // A0 set LOR, A1 set LOW, A2 set LOW |
| SDesign2018 | 20:dba07b7d9675 | 63 | const int DS7505s_Address_8bit = DS7505s_Address_7bit << 1; // Same |
| SDesign2018 | 20:dba07b7d9675 | 64 | |
| SDesign2018 | 20:dba07b7d9675 | 65 | |
| SDesign2018 | 20:dba07b7d9675 | 66 | int regAddress; // Used by all sensors |
| SDesign2018 | 20:dba07b7d9675 | 67 | |
| SDesign2018 | 20:dba07b7d9675 | 68 | /* |
| SDesign2018 | 20:dba07b7d9675 | 69 | * Variables used for ADT7410 Temperature |
| SDesign2018 | 20:dba07b7d9675 | 70 | */ |
| SDesign2018 | 20:dba07b7d9675 | 71 | // Points to the returned char pointer from called functions |
| SDesign2018 | 20:dba07b7d9675 | 72 | char * rawTempValues; // Could change to uint8_t, same for other char pointers |
| SDesign2018 | 20:dba07b7d9675 | 73 | uint16_t convertedTempValue; // Data values must be uint16_t for conversion and send prep |
| SDesign2018 | 20:dba07b7d9675 | 74 | uint16_t temperatureBuffer[BUFFER_SIZE]; |
| SDesign2018 | 20:dba07b7d9675 | 75 | |
| SDesign2018 | 20:dba07b7d9675 | 76 | |
| SDesign2018 | 20:dba07b7d9675 | 77 | /* |
| SDesign2018 | 20:dba07b7d9675 | 78 | * Variables used for mDot |
| SDesign2018 | 20:dba07b7d9675 | 79 | */ |
| SDesign2018 | 20:dba07b7d9675 | 80 | |
| SDesign2018 | 20:dba07b7d9675 | 81 | |
| SDesign2018 | 20:dba07b7d9675 | 82 | uint32_t tx_frequency; |
| SDesign2018 | 20:dba07b7d9675 | 83 | uint8_t tx_datarate; |
| SDesign2018 | 20:dba07b7d9675 | 84 | uint8_t tx_power; |
| SDesign2018 | 20:dba07b7d9675 | 85 | uint8_t frequency_band; |
| SDesign2018 | 20:dba07b7d9675 | 86 | |
| SDesign2018 | 20:dba07b7d9675 | 87 | |
| SDesign2018 | 21:d96ef380a5d3 | 88 | |
| SDesign2018 | 20:dba07b7d9675 | 89 | /* |
| SDesign2018 | 20:dba07b7d9675 | 90 | * Variables used for ADXL372 Accelerometer |
| SDesign2018 | 20:dba07b7d9675 | 91 | */ |
| SDesign2018 | 20:dba07b7d9675 | 92 | char *accelValues; |
| SDesign2018 | 20:dba07b7d9675 | 93 | char Xmsb; // Gets most significant byte |
| SDesign2018 | 20:dba07b7d9675 | 94 | char Xlsb; // Gets least significant byte |
| SDesign2018 | 20:dba07b7d9675 | 95 | char Ymsb; |
| SDesign2018 | 20:dba07b7d9675 | 96 | char Ylsb; |
| SDesign2018 | 20:dba07b7d9675 | 97 | char Zmsb; |
| SDesign2018 | 20:dba07b7d9675 | 98 | char Zlsb; |
| SDesign2018 | 20:dba07b7d9675 | 99 | uint16_t XData; |
| SDesign2018 | 20:dba07b7d9675 | 100 | uint16_t YData; |
| SDesign2018 | 20:dba07b7d9675 | 101 | uint16_t ZData; |
| SDesign2018 | 20:dba07b7d9675 | 102 | |
| SDesign2018 | 20:dba07b7d9675 | 103 | uint16_t XDataInterrupt[BUFFER_SIZE]; |
| SDesign2018 | 20:dba07b7d9675 | 104 | uint16_t YDataInterrupt[BUFFER_SIZE]; |
| SDesign2018 | 20:dba07b7d9675 | 105 | uint16_t ZDataInterrupt[BUFFER_SIZE]; |
| SDesign2018 | 20:dba07b7d9675 | 106 | |
| SDesign2018 | 20:dba07b7d9675 | 107 | |
| SDesign2018 | 20:dba07b7d9675 | 108 | |
| SDesign2018 | 20:dba07b7d9675 | 109 | /* |
| SDesign2018 | 20:dba07b7d9675 | 110 | * Variables used for interrupt triggers |
| SDesign2018 | 20:dba07b7d9675 | 111 | */ |
| SDesign2018 | 20:dba07b7d9675 | 112 | bool takeTemperature = false; // Trigger temperature reading |
| SDesign2018 | 20:dba07b7d9675 | 113 | bool takeAccelerometer = false; // Trigger accelerometer reading |
| SDesign2018 | 22:388f97cf422a | 114 | bool periodicReadingTrigger = false; // Trigger reading both accelerometer and temperature |
| SDesign2018 | 20:dba07b7d9675 | 115 | |
| SDesign2018 | 20:dba07b7d9675 | 116 | /* |
| SDesign2018 | 20:dba07b7d9675 | 117 | * Prototype functions |
| SDesign2018 | 20:dba07b7d9675 | 118 | */ |
| SDesign2018 | 20:dba07b7d9675 | 119 | |
| SDesign2018 | 20:dba07b7d9675 | 120 | char twosComplementConversion(char value); |
| SDesign2018 | 20:dba07b7d9675 | 121 | |
| SDesign2018 | 20:dba07b7d9675 | 122 | void ADXL372Initialize(void); |
| SDesign2018 | 20:dba07b7d9675 | 123 | void ADXL372Reset(void); |
| SDesign2018 | 20:dba07b7d9675 | 124 | void I2CSelfTest(void); |
| SDesign2018 | 20:dba07b7d9675 | 125 | void accelerometerI2CWrite(int hexAddress, int hexData); |
| SDesign2018 | 20:dba07b7d9675 | 126 | char * accelerometerI2CRead(int hexAddress); |
| SDesign2018 | 20:dba07b7d9675 | 127 | |
| SDesign2018 | 20:dba07b7d9675 | 128 | void ADT7410Initialize(void); |
| SDesign2018 | 20:dba07b7d9675 | 129 | void ADT7410Write(unsigned char registerAddress, unsigned char data); |
| SDesign2018 | 20:dba07b7d9675 | 130 | char * ADT7410Read(int hex); |
| SDesign2018 | 20:dba07b7d9675 | 131 | |
| SDesign2018 | 20:dba07b7d9675 | 132 | |
| SDesign2018 | 20:dba07b7d9675 | 133 | /* |
| SDesign2018 | 20:dba07b7d9675 | 134 | * Interrupt functions |
| SDesign2018 | 20:dba07b7d9675 | 135 | */ |
| SDesign2018 | 20:dba07b7d9675 | 136 | void CriticalTemperatureInterrupt(void){ |
| SDesign2018 | 20:dba07b7d9675 | 137 | takeTemperature = true; // Take temperature because something happened |
| SDesign2018 | 20:dba07b7d9675 | 138 | } |
| SDesign2018 | 20:dba07b7d9675 | 139 | |
| SDesign2018 | 20:dba07b7d9675 | 140 | void CriticalAccelerometerInterrupt(void){ |
| SDesign2018 | 20:dba07b7d9675 | 141 | takeAccelerometer = true; // Take accelerometer because something happened |
| SDesign2018 | 20:dba07b7d9675 | 142 | } |
| SDesign2018 | 20:dba07b7d9675 | 143 | |
| SDesign2018 | 24:88c7bebf0b05 | 144 | void takePeriodicReading(std::vector<uint8_t> tx_data){ |
| SDesign2018 | 24:88c7bebf0b05 | 145 | pc.printf("Regular periodic reading \n\r"); |
| SDesign2018 | 24:88c7bebf0b05 | 146 | /* |
| SDesign2018 | 20:dba07b7d9675 | 147 | * Taking accelerometer data |
| SDesign2018 | 20:dba07b7d9675 | 148 | */ |
| SDesign2018 | 20:dba07b7d9675 | 149 | regAddress = 0x08; // This is the register address for XData |
| SDesign2018 | 20:dba07b7d9675 | 150 | accelValues = accelerometerI2CRead(regAddress); |
| SDesign2018 | 20:dba07b7d9675 | 151 | Xmsb = *(accelValues + 0); |
| SDesign2018 | 20:dba07b7d9675 | 152 | Xlsb = *(accelValues + 1); |
| SDesign2018 | 20:dba07b7d9675 | 153 | Ymsb = *(accelValues + 2); |
| SDesign2018 | 20:dba07b7d9675 | 154 | Ylsb = *(accelValues + 3); |
| SDesign2018 | 20:dba07b7d9675 | 155 | Zmsb = *(accelValues + 4); |
| SDesign2018 | 20:dba07b7d9675 | 156 | Zlsb = *(accelValues + 5); |
| SDesign2018 | 20:dba07b7d9675 | 157 | |
| SDesign2018 | 20:dba07b7d9675 | 158 | XData = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits |
| SDesign2018 | 20:dba07b7d9675 | 159 | YData = (Ymsb << 8 | Ylsb) >> 4; |
| SDesign2018 | 20:dba07b7d9675 | 160 | ZData = (Zmsb << 8 | Zlsb) >> 4; |
| SDesign2018 | 20:dba07b7d9675 | 161 | |
| SDesign2018 | 20:dba07b7d9675 | 162 | XData = twosComplementConversion(XData); |
| SDesign2018 | 20:dba07b7d9675 | 163 | YData = twosComplementConversion(YData); |
| SDesign2018 | 20:dba07b7d9675 | 164 | ZData = twosComplementConversion(ZData); |
| SDesign2018 | 20:dba07b7d9675 | 165 | |
| SDesign2018 | 20:dba07b7d9675 | 166 | /* |
| SDesign2018 | 20:dba07b7d9675 | 167 | * Taking temperature data |
| SDesign2018 | 20:dba07b7d9675 | 168 | */ |
| SDesign2018 | 20:dba07b7d9675 | 169 | regAddress = 0x00; |
| SDesign2018 | 20:dba07b7d9675 | 170 | rawTempValues = ADT7410Read(regAddress); |
| SDesign2018 | 20:dba07b7d9675 | 171 | convertedTempValue = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into |
| SDesign2018 | 20:dba07b7d9675 | 172 | // a short int variable(16 bits), remove last 3 bits |
| SDesign2018 | 20:dba07b7d9675 | 173 | pc.printf("Accelerometer::: "); |
| SDesign2018 | 20:dba07b7d9675 | 174 | pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XData, YData, ZData); |
| SDesign2018 | 20:dba07b7d9675 | 175 | pc.printf("Temperature::: "); |
| SDesign2018 | 20:dba07b7d9675 | 176 | pc.printf("Celsius: 0x%x\n\r", convertedTempValue); |
| SDesign2018 | 24:88c7bebf0b05 | 177 | |
| SDesign2018 | 24:88c7bebf0b05 | 178 | |
| SDesign2018 | 24:88c7bebf0b05 | 179 | |
| SDesign2018 | 24:88c7bebf0b05 | 180 | tx_data.push_back((convertedTempValue >> 8) & 0xFF); |
| SDesign2018 | 24:88c7bebf0b05 | 181 | tx_data.push_back(convertedTempValue & 0xFF); |
| SDesign2018 | 24:88c7bebf0b05 | 182 | logInfo("Temperautre: %lu [0x%04X]", convertedTempValue, convertedTempValue); |
| SDesign2018 | 24:88c7bebf0b05 | 183 | send_data(tx_data); |
| SDesign2018 | 24:88c7bebf0b05 | 184 | periodicReadingTrigger = false; // Flip back to no trigger |
| SDesign2018 | 20:dba07b7d9675 | 185 | } |
| SDesign2018 | 20:dba07b7d9675 | 186 | |
| SDesign2018 | 23:9c95ba021bdc | 187 | void takePeriodicReadingTicker(void){ |
| SDesign2018 | 22:388f97cf422a | 188 | periodicReadingTrigger = true; |
| SDesign2018 | 22:388f97cf422a | 189 | } |
| SDesign2018 | 22:388f97cf422a | 190 | |
| SDesign2018 | 20:dba07b7d9675 | 191 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 192 | /* _ |
| SDesign2018 | 20:dba07b7d9675 | 193 | ____ ___ ____ _(_)___ |
| SDesign2018 | 20:dba07b7d9675 | 194 | / __ `__ \/ __ `/ / __ \ |
| SDesign2018 | 20:dba07b7d9675 | 195 | / / / / / / /_/ / / / / / |
| SDesign2018 | 20:dba07b7d9675 | 196 | /_/ /_/ /_/\__,_/_/_/ /_/ |
| SDesign2018 | 20:dba07b7d9675 | 197 | |
| SDesign2018 | 20:dba07b7d9675 | 198 | *////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 199 | int main(void) |
| SDesign2018 | 20:dba07b7d9675 | 200 | { |
| SDesign2018 | 20:dba07b7d9675 | 201 | // Custom event handler for automatically displaying RX data |
| SDesign2018 | 20:dba07b7d9675 | 202 | //interruptEverything.attach(&interruptReadTemperature, 7.0); |
| SDesign2018 | 20:dba07b7d9675 | 203 | RadioEvent events; |
| SDesign2018 | 20:dba07b7d9675 | 204 | // Change baud rate in serial terminal to this value |
| SDesign2018 | 20:dba07b7d9675 | 205 | pc.baud(115200); |
| SDesign2018 | 20:dba07b7d9675 | 206 | ADXL372.frequency(300000); // I2C devices are connected to the same clock |
| SDesign2018 | 20:dba07b7d9675 | 207 | ADT7410.frequency(300000); // Redundant but whatever |
| SDesign2018 | 25:c92ef8ae7efb | 208 | ADT7410_Int.rise(&CriticalTemperatureInterrupt); |
| SDesign2018 | 20:dba07b7d9675 | 209 | |
| SDesign2018 | 20:dba07b7d9675 | 210 | |
| SDesign2018 | 20:dba07b7d9675 | 211 | mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL); |
| SDesign2018 | 20:dba07b7d9675 | 212 | |
| SDesign2018 | 20:dba07b7d9675 | 213 | // Sometimes when calling this, it creates error: type specifier expected |
| SDesign2018 | 20:dba07b7d9675 | 214 | // Even with identical include files I would get this in another workspace. |
| SDesign2018 | 20:dba07b7d9675 | 215 | plan = new lora::ChannelPlan_US915(); |
| SDesign2018 | 20:dba07b7d9675 | 216 | |
| SDesign2018 | 20:dba07b7d9675 | 217 | logInfo("Now asserting"); |
| SDesign2018 | 20:dba07b7d9675 | 218 | assert(plan); |
| SDesign2018 | 20:dba07b7d9675 | 219 | |
| SDesign2018 | 20:dba07b7d9675 | 220 | // Careful when using this. The production ready libmdot-mbed5 has a void constructor |
| SDesign2018 | 20:dba07b7d9675 | 221 | // Therefore, can only use the libmDot-dev-mbed5 version, for now. |
| SDesign2018 | 20:dba07b7d9675 | 222 | dot = mDot::getInstance(plan); |
| SDesign2018 | 20:dba07b7d9675 | 223 | assert(dot); |
| SDesign2018 | 20:dba07b7d9675 | 224 | |
| SDesign2018 | 20:dba07b7d9675 | 225 | logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION); |
| SDesign2018 | 20:dba07b7d9675 | 226 | |
| SDesign2018 | 20:dba07b7d9675 | 227 | // start from a well-known state |
| SDesign2018 | 20:dba07b7d9675 | 228 | logInfo("defaulting Dot configuration"); |
| SDesign2018 | 20:dba07b7d9675 | 229 | dot->resetConfig(); |
| SDesign2018 | 20:dba07b7d9675 | 230 | |
| SDesign2018 | 20:dba07b7d9675 | 231 | // make sure library logging is turned on |
| SDesign2018 | 20:dba07b7d9675 | 232 | dot->setLogLevel(mts::MTSLog::INFO_LEVEL); |
| SDesign2018 | 20:dba07b7d9675 | 233 | |
| SDesign2018 | 20:dba07b7d9675 | 234 | // attach the custom events handler |
| SDesign2018 | 20:dba07b7d9675 | 235 | dot->setEvents(&events); |
| SDesign2018 | 20:dba07b7d9675 | 236 | |
| SDesign2018 | 20:dba07b7d9675 | 237 | // update configuration if necessary |
| SDesign2018 | 20:dba07b7d9675 | 238 | if (dot->getJoinMode() != mDot::PEER_TO_PEER) { |
| SDesign2018 | 20:dba07b7d9675 | 239 | logInfo("changing network join mode to PEER_TO_PEER"); |
| SDesign2018 | 20:dba07b7d9675 | 240 | if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) { |
| SDesign2018 | 20:dba07b7d9675 | 241 | logError("failed to set network join mode to PEER_TO_PEER"); |
| SDesign2018 | 20:dba07b7d9675 | 242 | } |
| SDesign2018 | 20:dba07b7d9675 | 243 | } |
| SDesign2018 | 20:dba07b7d9675 | 244 | |
| SDesign2018 | 20:dba07b7d9675 | 245 | /* |
| SDesign2018 | 20:dba07b7d9675 | 246 | * Get the Frequency and then choose transfer frequency, datarate, and power accordingly |
| SDesign2018 | 20:dba07b7d9675 | 247 | * |
| SDesign2018 | 20:dba07b7d9675 | 248 | */ |
| SDesign2018 | 20:dba07b7d9675 | 249 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 250 | frequency_band = dot->getFrequencyBand(); |
| SDesign2018 | 20:dba07b7d9675 | 251 | switch (frequency_band) { |
| SDesign2018 | 20:dba07b7d9675 | 252 | case lora::ChannelPlan::EU868_OLD: |
| SDesign2018 | 20:dba07b7d9675 | 253 | case lora::ChannelPlan::EU868: |
| SDesign2018 | 20:dba07b7d9675 | 254 | // 250kHz channels achieve higher throughput |
| SDesign2018 | 20:dba07b7d9675 | 255 | // DR_6 : SF7 @ 250kHz |
| SDesign2018 | 20:dba07b7d9675 | 256 | // DR_0 - DR_5 (125kHz channels) available but much slower |
| SDesign2018 | 20:dba07b7d9675 | 257 | tx_frequency = 869850000; |
| SDesign2018 | 20:dba07b7d9675 | 258 | tx_datarate = lora::DR_6; |
| SDesign2018 | 20:dba07b7d9675 | 259 | // the 869850000 frequency is 100% duty cycle if the total power is under 7 dBm - tx power 4 + antenna gain 3 = 7 |
| SDesign2018 | 20:dba07b7d9675 | 260 | tx_power = 4; |
| SDesign2018 | 20:dba07b7d9675 | 261 | break; |
| SDesign2018 | 20:dba07b7d9675 | 262 | |
| SDesign2018 | 20:dba07b7d9675 | 263 | case lora::ChannelPlan::US915_OLD: |
| SDesign2018 | 20:dba07b7d9675 | 264 | case lora::ChannelPlan::US915: |
| SDesign2018 | 20:dba07b7d9675 | 265 | case lora::ChannelPlan::AU915_OLD: |
| SDesign2018 | 20:dba07b7d9675 | 266 | case lora::ChannelPlan::AU915: |
| SDesign2018 | 20:dba07b7d9675 | 267 | // 500kHz channels achieve highest throughput |
| SDesign2018 | 20:dba07b7d9675 | 268 | // DR_8 : SF12 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 269 | // DR_9 : SF11 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 270 | // DR_10 : SF10 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 271 | // DR_11 : SF9 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 272 | // DR_12 : SF8 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 273 | // DR_13 : SF7 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 274 | // DR_0 - DR_3 (125kHz channels) available but much slower |
| SDesign2018 | 20:dba07b7d9675 | 275 | tx_frequency = 915500000; |
| SDesign2018 | 20:dba07b7d9675 | 276 | tx_datarate = lora::DR_13; |
| SDesign2018 | 20:dba07b7d9675 | 277 | // 915 bands have no duty cycle restrictions, set tx power to max |
| SDesign2018 | 20:dba07b7d9675 | 278 | tx_power = 20; |
| SDesign2018 | 20:dba07b7d9675 | 279 | break; |
| SDesign2018 | 20:dba07b7d9675 | 280 | |
| SDesign2018 | 20:dba07b7d9675 | 281 | case lora::ChannelPlan::AS923: |
| SDesign2018 | 20:dba07b7d9675 | 282 | case lora::ChannelPlan::AS923_JAPAN: |
| SDesign2018 | 20:dba07b7d9675 | 283 | // 250kHz channels achieve higher throughput |
| SDesign2018 | 20:dba07b7d9675 | 284 | // DR_6 : SF7 @ 250kHz |
| SDesign2018 | 20:dba07b7d9675 | 285 | // DR_0 - DR_5 (125kHz channels) available but much slower |
| SDesign2018 | 20:dba07b7d9675 | 286 | tx_frequency = 924800000; |
| SDesign2018 | 20:dba07b7d9675 | 287 | tx_datarate = lora::DR_6; |
| SDesign2018 | 20:dba07b7d9675 | 288 | tx_power = 16; |
| SDesign2018 | 20:dba07b7d9675 | 289 | break; |
| SDesign2018 | 20:dba07b7d9675 | 290 | |
| SDesign2018 | 20:dba07b7d9675 | 291 | case lora::ChannelPlan::KR920: |
| SDesign2018 | 20:dba07b7d9675 | 292 | // DR_5 : SF7 @ 125kHz |
| SDesign2018 | 20:dba07b7d9675 | 293 | tx_frequency = 922700000; |
| SDesign2018 | 20:dba07b7d9675 | 294 | tx_datarate = lora::DR_5; |
| SDesign2018 | 20:dba07b7d9675 | 295 | tx_power = 14; |
| SDesign2018 | 20:dba07b7d9675 | 296 | break; |
| SDesign2018 | 20:dba07b7d9675 | 297 | |
| SDesign2018 | 20:dba07b7d9675 | 298 | default: |
| SDesign2018 | 20:dba07b7d9675 | 299 | while (true) { |
| SDesign2018 | 20:dba07b7d9675 | 300 | logFatal("no known channel plan in use - extra configuration is needed!"); |
| SDesign2018 | 20:dba07b7d9675 | 301 | wait(5); |
| SDesign2018 | 20:dba07b7d9675 | 302 | } |
| SDesign2018 | 20:dba07b7d9675 | 303 | break; |
| SDesign2018 | 20:dba07b7d9675 | 304 | } |
| SDesign2018 | 20:dba07b7d9675 | 305 | ///////////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 306 | |
| SDesign2018 | 20:dba07b7d9675 | 307 | // in PEER_TO_PEER mode there is no join request/response transaction |
| SDesign2018 | 20:dba07b7d9675 | 308 | // as long as both Dots are configured correctly, they should be able to communicate |
| SDesign2018 | 20:dba07b7d9675 | 309 | update_peer_to_peer_config(network_address, network_session_key, data_session_key, tx_frequency, tx_datarate, tx_power); |
| SDesign2018 | 20:dba07b7d9675 | 310 | |
| SDesign2018 | 20:dba07b7d9675 | 311 | // save changes to configuration |
| SDesign2018 | 20:dba07b7d9675 | 312 | logInfo("saving configuration"); |
| SDesign2018 | 20:dba07b7d9675 | 313 | if (!dot->saveConfig()) { |
| SDesign2018 | 20:dba07b7d9675 | 314 | logError("failed to save configuration"); |
| SDesign2018 | 20:dba07b7d9675 | 315 | } |
| SDesign2018 | 20:dba07b7d9675 | 316 | |
| SDesign2018 | 20:dba07b7d9675 | 317 | // Display configuration |
| SDesign2018 | 20:dba07b7d9675 | 318 | // It's gonna output a lot of information onto the Serial Terminal |
| SDesign2018 | 20:dba07b7d9675 | 319 | display_config(); |
| SDesign2018 | 20:dba07b7d9675 | 320 | |
| SDesign2018 | 20:dba07b7d9675 | 321 | |
| SDesign2018 | 20:dba07b7d9675 | 322 | ADT7410Initialize(); |
| SDesign2018 | 20:dba07b7d9675 | 323 | ADXL372Initialize(); |
| SDesign2018 | 20:dba07b7d9675 | 324 | |
| SDesign2018 | 25:c92ef8ae7efb | 325 | Periodic.attach(&takePeriodicReadingTicker,5); |
| SDesign2018 | 20:dba07b7d9675 | 326 | |
| SDesign2018 | 20:dba07b7d9675 | 327 | while(1){ |
| SDesign2018 | 21:d96ef380a5d3 | 328 | // Create a vector of uint8_t elements to be sent later |
| SDesign2018 | 22:388f97cf422a | 329 | |
| SDesign2018 | 21:d96ef380a5d3 | 330 | std::vector<uint8_t> tx_data; |
| SDesign2018 | 20:dba07b7d9675 | 331 | |
| SDesign2018 | 21:d96ef380a5d3 | 332 | |
| SDesign2018 | 23:9c95ba021bdc | 333 | if(periodicReadingTrigger) |
| SDesign2018 | 22:388f97cf422a | 334 | { |
| SDesign2018 | 24:88c7bebf0b05 | 335 | takePeriodicReading(tx_data); |
| SDesign2018 | 22:388f97cf422a | 336 | } |
| SDesign2018 | 21:d96ef380a5d3 | 337 | |
| SDesign2018 | 25:c92ef8ae7efb | 338 | if(takeAccelerometer || takeTemperature){ |
| SDesign2018 | 20:dba07b7d9675 | 339 | pc.printf("INTERRUPTEDDDDDDDD: "); |
| SDesign2018 | 25:c92ef8ae7efb | 340 | if(takeTemperature) pc.printf("Temperature triggered!!!!!!!!!!!!\n\r"); |
| SDesign2018 | 22:388f97cf422a | 341 | else if(takeAccelerometer) pc.printf("AccelerometerTriggered!!!!!!!!!!!!!\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 342 | |
| SDesign2018 | 20:dba07b7d9675 | 343 | for(int i = 0; i < BUFFER_SIZE; ++i){ |
| SDesign2018 | 20:dba07b7d9675 | 344 | /* |
| SDesign2018 | 20:dba07b7d9675 | 345 | * Taking accelerometer data |
| SDesign2018 | 20:dba07b7d9675 | 346 | */ |
| SDesign2018 | 20:dba07b7d9675 | 347 | regAddress = 0x08; // This is the register address for XData |
| SDesign2018 | 20:dba07b7d9675 | 348 | accelValues = accelerometerI2CRead(regAddress); |
| SDesign2018 | 20:dba07b7d9675 | 349 | Xmsb = *(accelValues + 0); |
| SDesign2018 | 20:dba07b7d9675 | 350 | Xlsb = *(accelValues + 1); |
| SDesign2018 | 20:dba07b7d9675 | 351 | Ymsb = *(accelValues + 2); |
| SDesign2018 | 20:dba07b7d9675 | 352 | Ylsb = *(accelValues + 3); |
| SDesign2018 | 20:dba07b7d9675 | 353 | Zmsb = *(accelValues + 4); |
| SDesign2018 | 20:dba07b7d9675 | 354 | Zlsb = *(accelValues + 5); |
| SDesign2018 | 20:dba07b7d9675 | 355 | |
| SDesign2018 | 20:dba07b7d9675 | 356 | XDataInterrupt[i] = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits |
| SDesign2018 | 20:dba07b7d9675 | 357 | YDataInterrupt[i] = (Ymsb << 8 | Ylsb) >> 4; |
| SDesign2018 | 20:dba07b7d9675 | 358 | ZDataInterrupt[i] = (Zmsb << 8 | Zlsb) >> 4; |
| SDesign2018 | 20:dba07b7d9675 | 359 | |
| SDesign2018 | 20:dba07b7d9675 | 360 | XDataInterrupt[i] = twosComplementConversion(XDataInterrupt[i]); |
| SDesign2018 | 20:dba07b7d9675 | 361 | YDataInterrupt[i] = twosComplementConversion(YDataInterrupt[i]); |
| SDesign2018 | 20:dba07b7d9675 | 362 | ZDataInterrupt[i] = twosComplementConversion(ZDataInterrupt[i]); |
| SDesign2018 | 20:dba07b7d9675 | 363 | |
| SDesign2018 | 20:dba07b7d9675 | 364 | /* |
| SDesign2018 | 20:dba07b7d9675 | 365 | * Taking temperature data |
| SDesign2018 | 20:dba07b7d9675 | 366 | */ |
| SDesign2018 | 20:dba07b7d9675 | 367 | regAddress = 0x00; |
| SDesign2018 | 20:dba07b7d9675 | 368 | rawTempValues = ADT7410Read(regAddress); |
| SDesign2018 | 20:dba07b7d9675 | 369 | temperatureBuffer[i] = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into |
| SDesign2018 | 20:dba07b7d9675 | 370 | // a short int variable(16 bits), remove last 3 bits |
| SDesign2018 | 20:dba07b7d9675 | 371 | } |
| SDesign2018 | 20:dba07b7d9675 | 372 | |
| SDesign2018 | 20:dba07b7d9675 | 373 | for(int i = 0; i < BUFFER_SIZE; ++i){ |
| SDesign2018 | 20:dba07b7d9675 | 374 | pc.printf("Accelerometer::: "); |
| SDesign2018 | 20:dba07b7d9675 | 375 | pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XDataInterrupt[i], YDataInterrupt[i], ZDataInterrupt[i]); |
| SDesign2018 | 20:dba07b7d9675 | 376 | pc.printf("Temperature::: "); |
| SDesign2018 | 20:dba07b7d9675 | 377 | pc.printf("Celsius: 0x%x\n\r", temperatureBuffer[i]); |
| SDesign2018 | 20:dba07b7d9675 | 378 | } |
| SDesign2018 | 22:388f97cf422a | 379 | //wait(0.2); |
| SDesign2018 | 20:dba07b7d9675 | 380 | takeAccelerometer = false; // Flip back to no trigger |
| SDesign2018 | 20:dba07b7d9675 | 381 | takeTemperature = false; // Flip back to no trigger |
| SDesign2018 | 23:9c95ba021bdc | 382 | |
| SDesign2018 | 20:dba07b7d9675 | 383 | } |
| SDesign2018 | 20:dba07b7d9675 | 384 | |
| SDesign2018 | 20:dba07b7d9675 | 385 | |
| SDesign2018 | 22:388f97cf422a | 386 | |
| SDesign2018 | 22:388f97cf422a | 387 | |
| SDesign2018 | 22:388f97cf422a | 388 | //wait(1); |
| SDesign2018 | 20:dba07b7d9675 | 389 | } |
| SDesign2018 | 20:dba07b7d9675 | 390 | |
| SDesign2018 | 20:dba07b7d9675 | 391 | return 0; |
| SDesign2018 | 20:dba07b7d9675 | 392 | } |
| SDesign2018 | 20:dba07b7d9675 | 393 | |
| SDesign2018 | 20:dba07b7d9675 | 394 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 395 | * Not really used at the moment |
| SDesign2018 | 20:dba07b7d9675 | 396 | * Not really needed. But keep just in case because I don't want to rewrite it |
| SDesign2018 | 20:dba07b7d9675 | 397 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 398 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 399 | char twosComplementConversion(char value) |
| SDesign2018 | 20:dba07b7d9675 | 400 | { |
| SDesign2018 | 20:dba07b7d9675 | 401 | /* |
| SDesign2018 | 20:dba07b7d9675 | 402 | * Go from bit 0 to bit 7 and invert them |
| SDesign2018 | 20:dba07b7d9675 | 403 | * Then finally add 1 |
| SDesign2018 | 20:dba07b7d9675 | 404 | */ |
| SDesign2018 | 20:dba07b7d9675 | 405 | char mask = value & 0x80; |
| SDesign2018 | 20:dba07b7d9675 | 406 | if(mask == 0x80){ // Check for sign |
| SDesign2018 | 20:dba07b7d9675 | 407 | value = ~value + 1; |
| SDesign2018 | 20:dba07b7d9675 | 408 | return value; |
| SDesign2018 | 20:dba07b7d9675 | 409 | } |
| SDesign2018 | 20:dba07b7d9675 | 410 | return value; |
| SDesign2018 | 20:dba07b7d9675 | 411 | } |
| SDesign2018 | 20:dba07b7d9675 | 412 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 413 | |
| SDesign2018 | 20:dba07b7d9675 | 414 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 415 | * Initializes whatever settings you want for the accelerometer |
| SDesign2018 | 20:dba07b7d9675 | 416 | * Can change it to use the previous I2C write function instead of all this mess |
| SDesign2018 | 20:dba07b7d9675 | 417 | * |
| SDesign2018 | 20:dba07b7d9675 | 418 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 419 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 420 | void ADXL372Initialize(void){ |
| SDesign2018 | 20:dba07b7d9675 | 421 | pc.printf("Initializing ADXL372 accelerometer\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 422 | accelerometerI2CWrite(0x3F, 0x0F); // Enable I2C highspeed,Low Pass, High pass and full bandwidth measurement mode |
| SDesign2018 | 20:dba07b7d9675 | 423 | accelerometerI2CWrite(0x38, 0x01); // Enable the High pass filter corner 1 at register 0x38 |
| SDesign2018 | 20:dba07b7d9675 | 424 | /* accelerometerI2CWrite(0x24, 0x01); // X used for activity threshold |
| SDesign2018 | 20:dba07b7d9675 | 425 | accelerometerI2CWrite(0x26, 0x01); // Y used for activity threshold |
| SDesign2018 | 20:dba07b7d9675 | 426 | accelerometerI2CWrite(0x28, 0x01); // Z used for activity threshold */ |
| SDesign2018 | 20:dba07b7d9675 | 427 | pc.printf("\n\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 428 | } |
| SDesign2018 | 20:dba07b7d9675 | 429 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 430 | |
| SDesign2018 | 20:dba07b7d9675 | 431 | |
| SDesign2018 | 20:dba07b7d9675 | 432 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 433 | * ADT7410 Initializing function |
| SDesign2018 | 20:dba07b7d9675 | 434 | * Make critical temperature 24 celsius |
| SDesign2018 | 20:dba07b7d9675 | 435 | * Make CRIT pin active high |
| SDesign2018 | 20:dba07b7d9675 | 436 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 437 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 438 | void ADT7410Initialize(void){ |
| SDesign2018 | 20:dba07b7d9675 | 439 | pc.printf("Initializing ADT7410 Temperature\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 440 | // Make critical temperature be 24 celsius |
| SDesign2018 | 20:dba07b7d9675 | 441 | ADT7410Write(0x08, 0x01); // MSB of Temperature Crit value |
| SDesign2018 | 20:dba07b7d9675 | 442 | ADT7410Write(0x09, 0x80); // LSB of Temperature Crit value |
| SDesign2018 | 20:dba07b7d9675 | 443 | |
| SDesign2018 | 20:dba07b7d9675 | 444 | // Make CRIT pin active high |
| SDesign2018 | 20:dba07b7d9675 | 445 | ADT7410Write(0x03, 0x08); // Turn INT HIGH, works for the interrupt pin |
| SDesign2018 | 20:dba07b7d9675 | 446 | pc.printf("\n\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 447 | } |
| SDesign2018 | 20:dba07b7d9675 | 448 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 449 | |
| SDesign2018 | 20:dba07b7d9675 | 450 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 451 | * ADXL372 reset function |
| SDesign2018 | 20:dba07b7d9675 | 452 | * Resets all registers and settings back to default |
| SDesign2018 | 20:dba07b7d9675 | 453 | * Basically the same as the previous ADXL372 I2C write function |
| SDesign2018 | 20:dba07b7d9675 | 454 | * |
| SDesign2018 | 20:dba07b7d9675 | 455 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 456 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 457 | void ADXL372Reset(void){ |
| SDesign2018 | 20:dba07b7d9675 | 458 | int flag; |
| SDesign2018 | 20:dba07b7d9675 | 459 | //--------- One full writing cycle for ADXL372 for Z Enable ------------------// |
| SDesign2018 | 20:dba07b7d9675 | 460 | /* '0' - NAK was received |
| SDesign2018 | 20:dba07b7d9675 | 461 | * '1' - ACK was received, <---- This good |
| SDesign2018 | 20:dba07b7d9675 | 462 | * '2' - timeout |
| SDesign2018 | 20:dba07b7d9675 | 463 | */ |
| SDesign2018 | 20:dba07b7d9675 | 464 | ADXL372.start(); |
| SDesign2018 | 20:dba07b7d9675 | 465 | flag = ADXL372.write(ADXL372_Address_8bit | 0); |
| SDesign2018 | 20:dba07b7d9675 | 466 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 467 | { |
| SDesign2018 | 20:dba07b7d9675 | 468 | //pc.printf("Write to I2C address success\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 469 | |
| SDesign2018 | 20:dba07b7d9675 | 470 | flag = ADXL372.write(0x41); |
| SDesign2018 | 20:dba07b7d9675 | 471 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 472 | { |
| SDesign2018 | 20:dba07b7d9675 | 473 | //pc.printf("Write to 0x41 register address success\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 474 | flag = ADXL372.write(0x52); // Set bit 0 |
| SDesign2018 | 20:dba07b7d9675 | 475 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 476 | { |
| SDesign2018 | 20:dba07b7d9675 | 477 | pc.printf("Everything has been reset\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 478 | ADXL372.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 479 | } |
| SDesign2018 | 20:dba07b7d9675 | 480 | } |
| SDesign2018 | 20:dba07b7d9675 | 481 | } |
| SDesign2018 | 20:dba07b7d9675 | 482 | else ADXL372.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 483 | // ---------------- End of writing cycle --------------------------// |
| SDesign2018 | 20:dba07b7d9675 | 484 | } |
| SDesign2018 | 20:dba07b7d9675 | 485 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 486 | |
| SDesign2018 | 20:dba07b7d9675 | 487 | /* |
| SDesign2018 | 20:dba07b7d9675 | 488 | * |
| SDesign2018 | 20:dba07b7d9675 | 489 | * Self-test to see if the accelerometer is working as intended |
| SDesign2018 | 20:dba07b7d9675 | 490 | * Wait 300 ms. |
| SDesign2018 | 20:dba07b7d9675 | 491 | * Check bit 2 for a 1 for success. Bit 1 for completion of self-test. |
| SDesign2018 | 20:dba07b7d9675 | 492 | * Returns whole register |
| SDesign2018 | 20:dba07b7d9675 | 493 | */ |
| SDesign2018 | 20:dba07b7d9675 | 494 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 495 | void I2CSelfTest(void){ |
| SDesign2018 | 20:dba07b7d9675 | 496 | char *result; |
| SDesign2018 | 20:dba07b7d9675 | 497 | uint8_t check; |
| SDesign2018 | 20:dba07b7d9675 | 498 | accelerometerI2CWrite(0x3F, 0x0F); |
| SDesign2018 | 20:dba07b7d9675 | 499 | accelerometerI2CWrite(0x40, 0x01); |
| SDesign2018 | 20:dba07b7d9675 | 500 | wait(0.3); |
| SDesign2018 | 20:dba07b7d9675 | 501 | result = accelerometerI2CRead(0x40); |
| SDesign2018 | 20:dba07b7d9675 | 502 | check = result[0]; |
| SDesign2018 | 20:dba07b7d9675 | 503 | if(check & 0x04){ |
| SDesign2018 | 20:dba07b7d9675 | 504 | pc.printf("Passed\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 505 | }else {pc.printf("FAILED\n\r");} |
| SDesign2018 | 20:dba07b7d9675 | 506 | } |
| SDesign2018 | 20:dba07b7d9675 | 507 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 508 | |
| SDesign2018 | 20:dba07b7d9675 | 509 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 510 | * |
| SDesign2018 | 20:dba07b7d9675 | 511 | * I2C function for the the ADXL372 accelerometer for a write sequence |
| SDesign2018 | 20:dba07b7d9675 | 512 | * Param: |
| SDesign2018 | 20:dba07b7d9675 | 513 | * hexAddress: Pass the hexadecimal value for what register you want |
| SDesign2018 | 20:dba07b7d9675 | 514 | * hexData: Pass the hexadecimal value for what data you want to send |
| SDesign2018 | 20:dba07b7d9675 | 515 | * i.e. hexadecimal represenatation of certain bits |
| SDesign2018 | 20:dba07b7d9675 | 516 | * Returns from mbed library write function |
| SDesign2018 | 20:dba07b7d9675 | 517 | * 0: NAK was reveived |
| SDesign2018 | 20:dba07b7d9675 | 518 | * 1: ACK was received <---- Good for us |
| SDesign2018 | 20:dba07b7d9675 | 519 | * 2: Timeout |
| SDesign2018 | 20:dba07b7d9675 | 520 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 521 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 522 | void accelerometerI2CWrite(int hexAddress, int hexData){ |
| SDesign2018 | 20:dba07b7d9675 | 523 | |
| SDesign2018 | 20:dba07b7d9675 | 524 | int flag; |
| SDesign2018 | 20:dba07b7d9675 | 525 | int registerAddress = hexAddress; |
| SDesign2018 | 20:dba07b7d9675 | 526 | int data = hexData; |
| SDesign2018 | 20:dba07b7d9675 | 527 | |
| SDesign2018 | 20:dba07b7d9675 | 528 | ADXL372.start(); |
| SDesign2018 | 20:dba07b7d9675 | 529 | flag = ADXL372.write(ADXL372_Address_8bit); |
| SDesign2018 | 20:dba07b7d9675 | 530 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 531 | { |
| SDesign2018 | 20:dba07b7d9675 | 532 | //pc.printf("Write to I2C address success\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 533 | wait(0.1); |
| SDesign2018 | 20:dba07b7d9675 | 534 | flag = ADXL372.write(registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 535 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 536 | { |
| SDesign2018 | 20:dba07b7d9675 | 537 | //pc.printf("Write to register 0x%x address success\n\r", registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 538 | flag = ADXL372.write(data); |
| SDesign2018 | 20:dba07b7d9675 | 539 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 540 | { |
| SDesign2018 | 20:dba07b7d9675 | 541 | pc.printf("Writing data 0x%x to register address 0x%d success\n\r", data, registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 542 | ADXL372.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 543 | return; |
| SDesign2018 | 20:dba07b7d9675 | 544 | }else {ADXL372.stop();} |
| SDesign2018 | 20:dba07b7d9675 | 545 | }else {ADXL372.stop();} |
| SDesign2018 | 20:dba07b7d9675 | 546 | }else ADXL372.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 547 | |
| SDesign2018 | 20:dba07b7d9675 | 548 | } |
| SDesign2018 | 20:dba07b7d9675 | 549 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 550 | |
| SDesign2018 | 20:dba07b7d9675 | 551 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 552 | * I2C read sequence for the accelerometer |
| SDesign2018 | 20:dba07b7d9675 | 553 | * Param: |
| SDesign2018 | 20:dba07b7d9675 | 554 | * hexAddress: pass the hexadecimal representation of desired Register address |
| SDesign2018 | 20:dba07b7d9675 | 555 | * Return: |
| SDesign2018 | 20:dba07b7d9675 | 556 | * Char pointer to the array of read data. |
| SDesign2018 | 20:dba07b7d9675 | 557 | * |
| SDesign2018 | 20:dba07b7d9675 | 558 | * Right now it works only for the XData, YData, ZData because I wrote it to read |
| SDesign2018 | 20:dba07b7d9675 | 559 | * 6 bytes(6 registers). |
| SDesign2018 | 20:dba07b7d9675 | 560 | * Should change it to be 1 byte at a time |
| SDesign2018 | 20:dba07b7d9675 | 561 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 562 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 563 | char * accelerometerI2CRead(int hexAddress){ |
| SDesign2018 | 20:dba07b7d9675 | 564 | char accelData[6]; |
| SDesign2018 | 20:dba07b7d9675 | 565 | char registerAddress[1]; |
| SDesign2018 | 20:dba07b7d9675 | 566 | registerAddress[0] = hexAddress; |
| SDesign2018 | 20:dba07b7d9675 | 567 | |
| SDesign2018 | 20:dba07b7d9675 | 568 | // Perform mbed's way sending a start bit, then device address[r/~w], and then the register address |
| SDesign2018 | 20:dba07b7d9675 | 569 | // Also if it succeeds, continue to the next operation |
| SDesign2018 | 20:dba07b7d9675 | 570 | if(ADXL372.write(ADXL372_Address_8bit, registerAddress, 1) == 0){ |
| SDesign2018 | 20:dba07b7d9675 | 571 | |
| SDesign2018 | 20:dba07b7d9675 | 572 | // If previous sequence works, get 6 bytes into char array accelData |
| SDesign2018 | 20:dba07b7d9675 | 573 | // Char array because it uses 1 byte(8bits) |
| SDesign2018 | 20:dba07b7d9675 | 574 | // Should probably change it to uint8_t type |
| SDesign2018 | 20:dba07b7d9675 | 575 | if(ADXL372.read(ADXL372_Address_8bit, accelData, 6) == 0){ |
| SDesign2018 | 20:dba07b7d9675 | 576 | return accelData; |
| SDesign2018 | 20:dba07b7d9675 | 577 | }else pc.printf("Failed to read\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 578 | }else pc.printf("Failed to write\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 579 | return 0; // Only if it fails completely |
| SDesign2018 | 20:dba07b7d9675 | 580 | } |
| SDesign2018 | 20:dba07b7d9675 | 581 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 582 | |
| SDesign2018 | 20:dba07b7d9675 | 583 | |
| SDesign2018 | 20:dba07b7d9675 | 584 | |
| SDesign2018 | 20:dba07b7d9675 | 585 | |
| SDesign2018 | 20:dba07b7d9675 | 586 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 587 | * Performs one byte write I2C protocol |
| SDesign2018 | 20:dba07b7d9675 | 588 | * PARAM: |
| SDesign2018 | 20:dba07b7d9675 | 589 | * registerAddress: register you want access to in device, one byte char hex format |
| SDesign2018 | 20:dba07b7d9675 | 590 | * data: one byte data that you want to write to device register |
| SDesign2018 | 20:dba07b7d9675 | 591 | * Return results from mbed library function: |
| SDesign2018 | 20:dba07b7d9675 | 592 | * 0: failure at writing i2c address |
| SDesign2018 | 20:dba07b7d9675 | 593 | * 1: successful write |
| SDesign2018 | 20:dba07b7d9675 | 594 | * 2: failure at writing data |
| SDesign2018 | 20:dba07b7d9675 | 595 | * |
| SDesign2018 | 20:dba07b7d9675 | 596 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 597 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 598 | void ADT7410Write(unsigned char registerAddress, unsigned char data){ |
| SDesign2018 | 20:dba07b7d9675 | 599 | int flag; |
| SDesign2018 | 20:dba07b7d9675 | 600 | ADT7410.start(); |
| SDesign2018 | 20:dba07b7d9675 | 601 | flag = ADT7410.write(ADT7410_Address_8BIT); |
| SDesign2018 | 20:dba07b7d9675 | 602 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 603 | { |
| SDesign2018 | 20:dba07b7d9675 | 604 | |
| SDesign2018 | 20:dba07b7d9675 | 605 | wait(0.1); |
| SDesign2018 | 20:dba07b7d9675 | 606 | flag = ADT7410.write(registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 607 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 608 | { |
| SDesign2018 | 20:dba07b7d9675 | 609 | |
| SDesign2018 | 20:dba07b7d9675 | 610 | flag = ADT7410.write(data); |
| SDesign2018 | 20:dba07b7d9675 | 611 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 612 | { |
| SDesign2018 | 20:dba07b7d9675 | 613 | pc.printf("Writing data 0x%x to register address 0x%x success\n\r", data, registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 614 | ADT7410.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 615 | |
| SDesign2018 | 20:dba07b7d9675 | 616 | }else {ADT7410.stop();} |
| SDesign2018 | 20:dba07b7d9675 | 617 | }else {ADT7410.stop();} |
| SDesign2018 | 20:dba07b7d9675 | 618 | }else ADT7410.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 619 | |
| SDesign2018 | 20:dba07b7d9675 | 620 | |
| SDesign2018 | 20:dba07b7d9675 | 621 | } |
| SDesign2018 | 20:dba07b7d9675 | 622 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 623 | |
| SDesign2018 | 20:dba07b7d9675 | 624 | |
| SDesign2018 | 20:dba07b7d9675 | 625 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 626 | * I2C Read function for ADT7410 Temperature sensor |
| SDesign2018 | 20:dba07b7d9675 | 627 | * Param: |
| SDesign2018 | 20:dba07b7d9675 | 628 | * hex: hexadecimal representation for desired register |
| SDesign2018 | 20:dba07b7d9675 | 629 | * Return: |
| SDesign2018 | 20:dba07b7d9675 | 630 | * Char pointer to the array of data values. |
| SDesign2018 | 20:dba07b7d9675 | 631 | * Could also change from a char pointer to a uint8_t pointer. |
| SDesign2018 | 20:dba07b7d9675 | 632 | * |
| SDesign2018 | 20:dba07b7d9675 | 633 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 634 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 635 | char * ADT7410Read(int hex){ |
| SDesign2018 | 20:dba07b7d9675 | 636 | //short int convertedVal; |
| SDesign2018 | 20:dba07b7d9675 | 637 | char data[2] = {0, 0}; |
| SDesign2018 | 20:dba07b7d9675 | 638 | char cmd[1]; |
| SDesign2018 | 20:dba07b7d9675 | 639 | cmd[0] = hex; |
| SDesign2018 | 20:dba07b7d9675 | 640 | //pc.printf("Register Addres is: %x \n\r", cmd[0]); |
| SDesign2018 | 20:dba07b7d9675 | 641 | if(ADT7410.write(ADT7410_Address_8BIT, cmd,1) == 0){ |
| SDesign2018 | 20:dba07b7d9675 | 642 | if(ADT7410.read(ADT7410_Address_8BIT, data, 2) == 0){ |
| SDesign2018 | 20:dba07b7d9675 | 643 | |
| SDesign2018 | 20:dba07b7d9675 | 644 | return data; |
| SDesign2018 | 20:dba07b7d9675 | 645 | //return (data[0] << 8 | data[1])>>3; // Explained here: https://stackoverflow.com/a/141576 SOOO GREAT |
| SDesign2018 | 20:dba07b7d9675 | 646 | |
| SDesign2018 | 20:dba07b7d9675 | 647 | }else {pc.printf("Failed to read \n\r"); return data;} |
| SDesign2018 | 20:dba07b7d9675 | 648 | }else {pc.printf("Failed to write \n\r"); return data;} |
| SDesign2018 | 20:dba07b7d9675 | 649 | |
| SDesign2018 | 20:dba07b7d9675 | 650 | } |
| SDesign2018 | 20:dba07b7d9675 | 651 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 652 |
