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@21:d96ef380a5d3, 2018-01-10 (annotated)
- Committer:
- SDesign2018
- Date:
- Wed Jan 10 16:35:54 2018 +0000
- Revision:
- 21:d96ef380a5d3
- Parent:
- 20:dba07b7d9675
- Child:
- 22:388f97cf422a
Line 199 changed to at fall interrupt response;
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 | 20:dba07b7d9675 | 114 | bool periodicReadings = 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 | 20:dba07b7d9675 | 144 | void takePeriodicReading(void){ |
| SDesign2018 | 20:dba07b7d9675 | 145 | pc.printf("Periodic Reading\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 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 | if(convertedTempValue & 0x8000){ |
| SDesign2018 | 20:dba07b7d9675 | 174 | |
| SDesign2018 | 20:dba07b7d9675 | 175 | } |
| SDesign2018 | 20:dba07b7d9675 | 176 | pc.printf("Accelerometer::: "); |
| SDesign2018 | 20:dba07b7d9675 | 177 | pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XData, YData, ZData); |
| SDesign2018 | 20:dba07b7d9675 | 178 | pc.printf("Temperature::: "); |
| SDesign2018 | 20:dba07b7d9675 | 179 | pc.printf("Celsius: 0x%x\n\r", convertedTempValue); |
| SDesign2018 | 20:dba07b7d9675 | 180 | } |
| SDesign2018 | 20:dba07b7d9675 | 181 | |
| SDesign2018 | 20:dba07b7d9675 | 182 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 183 | /* _ |
| SDesign2018 | 20:dba07b7d9675 | 184 | ____ ___ ____ _(_)___ |
| SDesign2018 | 20:dba07b7d9675 | 185 | / __ `__ \/ __ `/ / __ \ |
| SDesign2018 | 20:dba07b7d9675 | 186 | / / / / / / /_/ / / / / / |
| SDesign2018 | 20:dba07b7d9675 | 187 | /_/ /_/ /_/\__,_/_/_/ /_/ |
| SDesign2018 | 20:dba07b7d9675 | 188 | |
| SDesign2018 | 20:dba07b7d9675 | 189 | *////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 190 | int main(void) |
| SDesign2018 | 20:dba07b7d9675 | 191 | { |
| SDesign2018 | 20:dba07b7d9675 | 192 | // Custom event handler for automatically displaying RX data |
| SDesign2018 | 20:dba07b7d9675 | 193 | //interruptEverything.attach(&interruptReadTemperature, 7.0); |
| SDesign2018 | 20:dba07b7d9675 | 194 | RadioEvent events; |
| SDesign2018 | 20:dba07b7d9675 | 195 | // Change baud rate in serial terminal to this value |
| SDesign2018 | 20:dba07b7d9675 | 196 | pc.baud(115200); |
| SDesign2018 | 20:dba07b7d9675 | 197 | ADXL372.frequency(300000); // I2C devices are connected to the same clock |
| SDesign2018 | 20:dba07b7d9675 | 198 | ADT7410.frequency(300000); // Redundant but whatever |
| SDesign2018 | 21:d96ef380a5d3 | 199 | ADT7410_Int.fall(&CriticalTemperatureInterrupt); |
| SDesign2018 | 20:dba07b7d9675 | 200 | |
| SDesign2018 | 20:dba07b7d9675 | 201 | |
| SDesign2018 | 20:dba07b7d9675 | 202 | mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL); |
| SDesign2018 | 20:dba07b7d9675 | 203 | |
| SDesign2018 | 20:dba07b7d9675 | 204 | // Sometimes when calling this, it creates error: type specifier expected |
| SDesign2018 | 20:dba07b7d9675 | 205 | // Even with identical include files I would get this in another workspace. |
| SDesign2018 | 20:dba07b7d9675 | 206 | plan = new lora::ChannelPlan_US915(); |
| SDesign2018 | 20:dba07b7d9675 | 207 | |
| SDesign2018 | 20:dba07b7d9675 | 208 | logInfo("Now asserting"); |
| SDesign2018 | 20:dba07b7d9675 | 209 | assert(plan); |
| SDesign2018 | 20:dba07b7d9675 | 210 | |
| SDesign2018 | 20:dba07b7d9675 | 211 | // Careful when using this. The production ready libmdot-mbed5 has a void constructor |
| SDesign2018 | 20:dba07b7d9675 | 212 | // Therefore, can only use the libmDot-dev-mbed5 version, for now. |
| SDesign2018 | 20:dba07b7d9675 | 213 | dot = mDot::getInstance(plan); |
| SDesign2018 | 20:dba07b7d9675 | 214 | assert(dot); |
| SDesign2018 | 20:dba07b7d9675 | 215 | |
| SDesign2018 | 20:dba07b7d9675 | 216 | logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION); |
| SDesign2018 | 20:dba07b7d9675 | 217 | |
| SDesign2018 | 20:dba07b7d9675 | 218 | // start from a well-known state |
| SDesign2018 | 20:dba07b7d9675 | 219 | logInfo("defaulting Dot configuration"); |
| SDesign2018 | 20:dba07b7d9675 | 220 | dot->resetConfig(); |
| SDesign2018 | 20:dba07b7d9675 | 221 | |
| SDesign2018 | 20:dba07b7d9675 | 222 | // make sure library logging is turned on |
| SDesign2018 | 20:dba07b7d9675 | 223 | dot->setLogLevel(mts::MTSLog::INFO_LEVEL); |
| SDesign2018 | 20:dba07b7d9675 | 224 | |
| SDesign2018 | 20:dba07b7d9675 | 225 | // attach the custom events handler |
| SDesign2018 | 20:dba07b7d9675 | 226 | dot->setEvents(&events); |
| SDesign2018 | 20:dba07b7d9675 | 227 | |
| SDesign2018 | 20:dba07b7d9675 | 228 | // update configuration if necessary |
| SDesign2018 | 20:dba07b7d9675 | 229 | if (dot->getJoinMode() != mDot::PEER_TO_PEER) { |
| SDesign2018 | 20:dba07b7d9675 | 230 | logInfo("changing network join mode to PEER_TO_PEER"); |
| SDesign2018 | 20:dba07b7d9675 | 231 | if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) { |
| SDesign2018 | 20:dba07b7d9675 | 232 | logError("failed to set network join mode to PEER_TO_PEER"); |
| SDesign2018 | 20:dba07b7d9675 | 233 | } |
| SDesign2018 | 20:dba07b7d9675 | 234 | } |
| SDesign2018 | 20:dba07b7d9675 | 235 | |
| SDesign2018 | 20:dba07b7d9675 | 236 | /* |
| SDesign2018 | 20:dba07b7d9675 | 237 | * Get the Frequency and then choose transfer frequency, datarate, and power accordingly |
| SDesign2018 | 20:dba07b7d9675 | 238 | * |
| SDesign2018 | 20:dba07b7d9675 | 239 | */ |
| SDesign2018 | 20:dba07b7d9675 | 240 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 241 | frequency_band = dot->getFrequencyBand(); |
| SDesign2018 | 20:dba07b7d9675 | 242 | switch (frequency_band) { |
| SDesign2018 | 20:dba07b7d9675 | 243 | case lora::ChannelPlan::EU868_OLD: |
| SDesign2018 | 20:dba07b7d9675 | 244 | case lora::ChannelPlan::EU868: |
| SDesign2018 | 20:dba07b7d9675 | 245 | // 250kHz channels achieve higher throughput |
| SDesign2018 | 20:dba07b7d9675 | 246 | // DR_6 : SF7 @ 250kHz |
| SDesign2018 | 20:dba07b7d9675 | 247 | // DR_0 - DR_5 (125kHz channels) available but much slower |
| SDesign2018 | 20:dba07b7d9675 | 248 | tx_frequency = 869850000; |
| SDesign2018 | 20:dba07b7d9675 | 249 | tx_datarate = lora::DR_6; |
| SDesign2018 | 20:dba07b7d9675 | 250 | // 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 | 251 | tx_power = 4; |
| SDesign2018 | 20:dba07b7d9675 | 252 | break; |
| SDesign2018 | 20:dba07b7d9675 | 253 | |
| SDesign2018 | 20:dba07b7d9675 | 254 | case lora::ChannelPlan::US915_OLD: |
| SDesign2018 | 20:dba07b7d9675 | 255 | case lora::ChannelPlan::US915: |
| SDesign2018 | 20:dba07b7d9675 | 256 | case lora::ChannelPlan::AU915_OLD: |
| SDesign2018 | 20:dba07b7d9675 | 257 | case lora::ChannelPlan::AU915: |
| SDesign2018 | 20:dba07b7d9675 | 258 | // 500kHz channels achieve highest throughput |
| SDesign2018 | 20:dba07b7d9675 | 259 | // DR_8 : SF12 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 260 | // DR_9 : SF11 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 261 | // DR_10 : SF10 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 262 | // DR_11 : SF9 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 263 | // DR_12 : SF8 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 264 | // DR_13 : SF7 @ 500kHz |
| SDesign2018 | 20:dba07b7d9675 | 265 | // DR_0 - DR_3 (125kHz channels) available but much slower |
| SDesign2018 | 20:dba07b7d9675 | 266 | tx_frequency = 915500000; |
| SDesign2018 | 20:dba07b7d9675 | 267 | tx_datarate = lora::DR_13; |
| SDesign2018 | 20:dba07b7d9675 | 268 | // 915 bands have no duty cycle restrictions, set tx power to max |
| SDesign2018 | 20:dba07b7d9675 | 269 | tx_power = 20; |
| SDesign2018 | 20:dba07b7d9675 | 270 | break; |
| SDesign2018 | 20:dba07b7d9675 | 271 | |
| SDesign2018 | 20:dba07b7d9675 | 272 | case lora::ChannelPlan::AS923: |
| SDesign2018 | 20:dba07b7d9675 | 273 | case lora::ChannelPlan::AS923_JAPAN: |
| SDesign2018 | 20:dba07b7d9675 | 274 | // 250kHz channels achieve higher throughput |
| SDesign2018 | 20:dba07b7d9675 | 275 | // DR_6 : SF7 @ 250kHz |
| SDesign2018 | 20:dba07b7d9675 | 276 | // DR_0 - DR_5 (125kHz channels) available but much slower |
| SDesign2018 | 20:dba07b7d9675 | 277 | tx_frequency = 924800000; |
| SDesign2018 | 20:dba07b7d9675 | 278 | tx_datarate = lora::DR_6; |
| SDesign2018 | 20:dba07b7d9675 | 279 | tx_power = 16; |
| SDesign2018 | 20:dba07b7d9675 | 280 | break; |
| SDesign2018 | 20:dba07b7d9675 | 281 | |
| SDesign2018 | 20:dba07b7d9675 | 282 | case lora::ChannelPlan::KR920: |
| SDesign2018 | 20:dba07b7d9675 | 283 | // DR_5 : SF7 @ 125kHz |
| SDesign2018 | 20:dba07b7d9675 | 284 | tx_frequency = 922700000; |
| SDesign2018 | 20:dba07b7d9675 | 285 | tx_datarate = lora::DR_5; |
| SDesign2018 | 20:dba07b7d9675 | 286 | tx_power = 14; |
| SDesign2018 | 20:dba07b7d9675 | 287 | break; |
| SDesign2018 | 20:dba07b7d9675 | 288 | |
| SDesign2018 | 20:dba07b7d9675 | 289 | default: |
| SDesign2018 | 20:dba07b7d9675 | 290 | while (true) { |
| SDesign2018 | 20:dba07b7d9675 | 291 | logFatal("no known channel plan in use - extra configuration is needed!"); |
| SDesign2018 | 20:dba07b7d9675 | 292 | wait(5); |
| SDesign2018 | 20:dba07b7d9675 | 293 | } |
| SDesign2018 | 20:dba07b7d9675 | 294 | break; |
| SDesign2018 | 20:dba07b7d9675 | 295 | } |
| SDesign2018 | 20:dba07b7d9675 | 296 | ///////////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 297 | |
| SDesign2018 | 20:dba07b7d9675 | 298 | // in PEER_TO_PEER mode there is no join request/response transaction |
| SDesign2018 | 20:dba07b7d9675 | 299 | // as long as both Dots are configured correctly, they should be able to communicate |
| SDesign2018 | 20:dba07b7d9675 | 300 | update_peer_to_peer_config(network_address, network_session_key, data_session_key, tx_frequency, tx_datarate, tx_power); |
| SDesign2018 | 20:dba07b7d9675 | 301 | |
| SDesign2018 | 20:dba07b7d9675 | 302 | // save changes to configuration |
| SDesign2018 | 20:dba07b7d9675 | 303 | logInfo("saving configuration"); |
| SDesign2018 | 20:dba07b7d9675 | 304 | if (!dot->saveConfig()) { |
| SDesign2018 | 20:dba07b7d9675 | 305 | logError("failed to save configuration"); |
| SDesign2018 | 20:dba07b7d9675 | 306 | } |
| SDesign2018 | 20:dba07b7d9675 | 307 | |
| SDesign2018 | 20:dba07b7d9675 | 308 | // Display configuration |
| SDesign2018 | 20:dba07b7d9675 | 309 | // It's gonna output a lot of information onto the Serial Terminal |
| SDesign2018 | 20:dba07b7d9675 | 310 | display_config(); |
| SDesign2018 | 20:dba07b7d9675 | 311 | |
| SDesign2018 | 20:dba07b7d9675 | 312 | |
| SDesign2018 | 20:dba07b7d9675 | 313 | ADT7410Initialize(); |
| SDesign2018 | 20:dba07b7d9675 | 314 | ADXL372Initialize(); |
| SDesign2018 | 20:dba07b7d9675 | 315 | |
| SDesign2018 | 20:dba07b7d9675 | 316 | //Periodic.attach(&takePeriodicReading,3); |
| SDesign2018 | 20:dba07b7d9675 | 317 | |
| SDesign2018 | 20:dba07b7d9675 | 318 | while(1){ |
| SDesign2018 | 21:d96ef380a5d3 | 319 | // Create a vector of uint8_t elements to be sent later |
| SDesign2018 | 21:d96ef380a5d3 | 320 | std::vector<uint8_t> tx_data; |
| SDesign2018 | 20:dba07b7d9675 | 321 | pc.printf("Regular looped reading "); |
| SDesign2018 | 20:dba07b7d9675 | 322 | /* |
| SDesign2018 | 20:dba07b7d9675 | 323 | * Taking accelerometer data |
| SDesign2018 | 20:dba07b7d9675 | 324 | */ |
| SDesign2018 | 20:dba07b7d9675 | 325 | regAddress = 0x08; // This is the register address for XData |
| SDesign2018 | 20:dba07b7d9675 | 326 | accelValues = accelerometerI2CRead(regAddress); |
| SDesign2018 | 20:dba07b7d9675 | 327 | Xmsb = *(accelValues + 0); |
| SDesign2018 | 20:dba07b7d9675 | 328 | Xlsb = *(accelValues + 1); |
| SDesign2018 | 20:dba07b7d9675 | 329 | Ymsb = *(accelValues + 2); |
| SDesign2018 | 20:dba07b7d9675 | 330 | Ylsb = *(accelValues + 3); |
| SDesign2018 | 20:dba07b7d9675 | 331 | Zmsb = *(accelValues + 4); |
| SDesign2018 | 20:dba07b7d9675 | 332 | Zlsb = *(accelValues + 5); |
| SDesign2018 | 20:dba07b7d9675 | 333 | |
| SDesign2018 | 20:dba07b7d9675 | 334 | XData = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits |
| SDesign2018 | 20:dba07b7d9675 | 335 | YData = (Ymsb << 8 | Ylsb) >> 4; |
| SDesign2018 | 20:dba07b7d9675 | 336 | ZData = (Zmsb << 8 | Zlsb) >> 4; |
| SDesign2018 | 20:dba07b7d9675 | 337 | |
| SDesign2018 | 20:dba07b7d9675 | 338 | XData = twosComplementConversion(XData); |
| SDesign2018 | 20:dba07b7d9675 | 339 | YData = twosComplementConversion(YData); |
| SDesign2018 | 20:dba07b7d9675 | 340 | ZData = twosComplementConversion(ZData); |
| SDesign2018 | 20:dba07b7d9675 | 341 | |
| SDesign2018 | 20:dba07b7d9675 | 342 | /* |
| SDesign2018 | 20:dba07b7d9675 | 343 | * Taking temperature data |
| SDesign2018 | 20:dba07b7d9675 | 344 | */ |
| SDesign2018 | 20:dba07b7d9675 | 345 | regAddress = 0x00; |
| SDesign2018 | 20:dba07b7d9675 | 346 | rawTempValues = ADT7410Read(regAddress); |
| SDesign2018 | 20:dba07b7d9675 | 347 | convertedTempValue = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into |
| SDesign2018 | 20:dba07b7d9675 | 348 | // a short int variable(16 bits), remove last 3 bits |
| SDesign2018 | 20:dba07b7d9675 | 349 | if(convertedTempValue & 0x8000){ |
| SDesign2018 | 20:dba07b7d9675 | 350 | |
| SDesign2018 | 20:dba07b7d9675 | 351 | } |
| SDesign2018 | 20:dba07b7d9675 | 352 | pc.printf("Accelerometer::: "); |
| SDesign2018 | 20:dba07b7d9675 | 353 | pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XData, YData, ZData); |
| SDesign2018 | 20:dba07b7d9675 | 354 | pc.printf("Temperature::: "); |
| SDesign2018 | 20:dba07b7d9675 | 355 | pc.printf("Celsius: 0x%x\n\r", convertedTempValue); |
| SDesign2018 | 20:dba07b7d9675 | 356 | |
| SDesign2018 | 21:d96ef380a5d3 | 357 | |
| SDesign2018 | 21:d96ef380a5d3 | 358 | |
| SDesign2018 | 21:d96ef380a5d3 | 359 | tx_data.push_back((convertedTempValue >> 8) & 0xFF); |
| SDesign2018 | 21:d96ef380a5d3 | 360 | tx_data.push_back(convertedTempValue & 0xFF); |
| SDesign2018 | 21:d96ef380a5d3 | 361 | logInfo("Temperautre: %lu [0x%04X]", convertedTempValue, convertedTempValue); |
| SDesign2018 | 21:d96ef380a5d3 | 362 | send_data(tx_data); |
| SDesign2018 | 21:d96ef380a5d3 | 363 | |
| SDesign2018 | 20:dba07b7d9675 | 364 | if(takeAccelerometer || takeAccelerometer){ |
| SDesign2018 | 20:dba07b7d9675 | 365 | pc.printf("INTERRUPTEDDDDDDDD: "); |
| SDesign2018 | 20:dba07b7d9675 | 366 | if(takeAccelerometer) pc.printf("Temperature triggered\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 367 | else if(takeAccelerometer) pc.printf("AccelerometerTriggered\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 368 | |
| SDesign2018 | 20:dba07b7d9675 | 369 | for(int i = 0; i < BUFFER_SIZE; ++i){ |
| SDesign2018 | 20:dba07b7d9675 | 370 | /* |
| SDesign2018 | 20:dba07b7d9675 | 371 | * Taking accelerometer data |
| SDesign2018 | 20:dba07b7d9675 | 372 | */ |
| SDesign2018 | 20:dba07b7d9675 | 373 | regAddress = 0x08; // This is the register address for XData |
| SDesign2018 | 20:dba07b7d9675 | 374 | accelValues = accelerometerI2CRead(regAddress); |
| SDesign2018 | 20:dba07b7d9675 | 375 | Xmsb = *(accelValues + 0); |
| SDesign2018 | 20:dba07b7d9675 | 376 | Xlsb = *(accelValues + 1); |
| SDesign2018 | 20:dba07b7d9675 | 377 | Ymsb = *(accelValues + 2); |
| SDesign2018 | 20:dba07b7d9675 | 378 | Ylsb = *(accelValues + 3); |
| SDesign2018 | 20:dba07b7d9675 | 379 | Zmsb = *(accelValues + 4); |
| SDesign2018 | 20:dba07b7d9675 | 380 | Zlsb = *(accelValues + 5); |
| SDesign2018 | 20:dba07b7d9675 | 381 | |
| SDesign2018 | 20:dba07b7d9675 | 382 | XDataInterrupt[i] = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits |
| SDesign2018 | 20:dba07b7d9675 | 383 | YDataInterrupt[i] = (Ymsb << 8 | Ylsb) >> 4; |
| SDesign2018 | 20:dba07b7d9675 | 384 | ZDataInterrupt[i] = (Zmsb << 8 | Zlsb) >> 4; |
| SDesign2018 | 20:dba07b7d9675 | 385 | |
| SDesign2018 | 20:dba07b7d9675 | 386 | XDataInterrupt[i] = twosComplementConversion(XDataInterrupt[i]); |
| SDesign2018 | 20:dba07b7d9675 | 387 | YDataInterrupt[i] = twosComplementConversion(YDataInterrupt[i]); |
| SDesign2018 | 20:dba07b7d9675 | 388 | ZDataInterrupt[i] = twosComplementConversion(ZDataInterrupt[i]); |
| SDesign2018 | 20:dba07b7d9675 | 389 | |
| SDesign2018 | 20:dba07b7d9675 | 390 | /* |
| SDesign2018 | 20:dba07b7d9675 | 391 | * Taking temperature data |
| SDesign2018 | 20:dba07b7d9675 | 392 | */ |
| SDesign2018 | 20:dba07b7d9675 | 393 | regAddress = 0x00; |
| SDesign2018 | 20:dba07b7d9675 | 394 | rawTempValues = ADT7410Read(regAddress); |
| SDesign2018 | 20:dba07b7d9675 | 395 | temperatureBuffer[i] = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into |
| SDesign2018 | 20:dba07b7d9675 | 396 | // a short int variable(16 bits), remove last 3 bits |
| SDesign2018 | 20:dba07b7d9675 | 397 | } |
| SDesign2018 | 20:dba07b7d9675 | 398 | |
| SDesign2018 | 20:dba07b7d9675 | 399 | for(int i = 0; i < BUFFER_SIZE; ++i){ |
| SDesign2018 | 20:dba07b7d9675 | 400 | pc.printf("Accelerometer::: "); |
| SDesign2018 | 20:dba07b7d9675 | 401 | pc.printf("X: 0x%x | Y: 0x%x | Z: 0x%x\n\r", XDataInterrupt[i], YDataInterrupt[i], ZDataInterrupt[i]); |
| SDesign2018 | 20:dba07b7d9675 | 402 | pc.printf("Temperature::: "); |
| SDesign2018 | 20:dba07b7d9675 | 403 | pc.printf("Celsius: 0x%x\n\r", temperatureBuffer[i]); |
| SDesign2018 | 20:dba07b7d9675 | 404 | } |
| SDesign2018 | 20:dba07b7d9675 | 405 | wait(0.2); |
| SDesign2018 | 20:dba07b7d9675 | 406 | takeAccelerometer = false; // Flip back to no trigger |
| SDesign2018 | 20:dba07b7d9675 | 407 | takeTemperature = false; // Flip back to no trigger |
| SDesign2018 | 20:dba07b7d9675 | 408 | } |
| SDesign2018 | 20:dba07b7d9675 | 409 | |
| SDesign2018 | 20:dba07b7d9675 | 410 | |
| SDesign2018 | 21:d96ef380a5d3 | 411 | wait(1); |
| SDesign2018 | 20:dba07b7d9675 | 412 | } |
| SDesign2018 | 20:dba07b7d9675 | 413 | |
| SDesign2018 | 20:dba07b7d9675 | 414 | return 0; |
| SDesign2018 | 20:dba07b7d9675 | 415 | } |
| SDesign2018 | 20:dba07b7d9675 | 416 | |
| SDesign2018 | 20:dba07b7d9675 | 417 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 418 | * Not really used at the moment |
| SDesign2018 | 20:dba07b7d9675 | 419 | * Not really needed. But keep just in case because I don't want to rewrite it |
| SDesign2018 | 20:dba07b7d9675 | 420 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 421 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 422 | char twosComplementConversion(char value) |
| SDesign2018 | 20:dba07b7d9675 | 423 | { |
| SDesign2018 | 20:dba07b7d9675 | 424 | /* |
| SDesign2018 | 20:dba07b7d9675 | 425 | * Go from bit 0 to bit 7 and invert them |
| SDesign2018 | 20:dba07b7d9675 | 426 | * Then finally add 1 |
| SDesign2018 | 20:dba07b7d9675 | 427 | */ |
| SDesign2018 | 20:dba07b7d9675 | 428 | char mask = value & 0x80; |
| SDesign2018 | 20:dba07b7d9675 | 429 | if(mask == 0x80){ // Check for sign |
| SDesign2018 | 20:dba07b7d9675 | 430 | value = ~value + 1; |
| SDesign2018 | 20:dba07b7d9675 | 431 | return value; |
| SDesign2018 | 20:dba07b7d9675 | 432 | } |
| SDesign2018 | 20:dba07b7d9675 | 433 | return value; |
| SDesign2018 | 20:dba07b7d9675 | 434 | } |
| SDesign2018 | 20:dba07b7d9675 | 435 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 436 | |
| SDesign2018 | 20:dba07b7d9675 | 437 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 438 | * Initializes whatever settings you want for the accelerometer |
| SDesign2018 | 20:dba07b7d9675 | 439 | * Can change it to use the previous I2C write function instead of all this mess |
| SDesign2018 | 20:dba07b7d9675 | 440 | * |
| SDesign2018 | 20:dba07b7d9675 | 441 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 442 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 443 | void ADXL372Initialize(void){ |
| SDesign2018 | 20:dba07b7d9675 | 444 | pc.printf("Initializing ADXL372 accelerometer\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 445 | accelerometerI2CWrite(0x3F, 0x0F); // Enable I2C highspeed,Low Pass, High pass and full bandwidth measurement mode |
| SDesign2018 | 20:dba07b7d9675 | 446 | accelerometerI2CWrite(0x38, 0x01); // Enable the High pass filter corner 1 at register 0x38 |
| SDesign2018 | 20:dba07b7d9675 | 447 | /* accelerometerI2CWrite(0x24, 0x01); // X used for activity threshold |
| SDesign2018 | 20:dba07b7d9675 | 448 | accelerometerI2CWrite(0x26, 0x01); // Y used for activity threshold |
| SDesign2018 | 20:dba07b7d9675 | 449 | accelerometerI2CWrite(0x28, 0x01); // Z used for activity threshold */ |
| SDesign2018 | 20:dba07b7d9675 | 450 | pc.printf("\n\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 451 | } |
| SDesign2018 | 20:dba07b7d9675 | 452 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 453 | |
| SDesign2018 | 20:dba07b7d9675 | 454 | |
| SDesign2018 | 20:dba07b7d9675 | 455 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 456 | * ADT7410 Initializing function |
| SDesign2018 | 20:dba07b7d9675 | 457 | * Make critical temperature 24 celsius |
| SDesign2018 | 20:dba07b7d9675 | 458 | * Make CRIT pin active high |
| SDesign2018 | 20:dba07b7d9675 | 459 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 460 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 461 | void ADT7410Initialize(void){ |
| SDesign2018 | 20:dba07b7d9675 | 462 | pc.printf("Initializing ADT7410 Temperature\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 463 | // Make critical temperature be 24 celsius |
| SDesign2018 | 20:dba07b7d9675 | 464 | ADT7410Write(0x08, 0x01); // MSB of Temperature Crit value |
| SDesign2018 | 20:dba07b7d9675 | 465 | ADT7410Write(0x09, 0x80); // LSB of Temperature Crit value |
| SDesign2018 | 20:dba07b7d9675 | 466 | |
| SDesign2018 | 20:dba07b7d9675 | 467 | // Make CRIT pin active high |
| SDesign2018 | 20:dba07b7d9675 | 468 | ADT7410Write(0x03, 0x08); // Turn INT HIGH, works for the interrupt pin |
| SDesign2018 | 20:dba07b7d9675 | 469 | pc.printf("\n\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 470 | } |
| SDesign2018 | 20:dba07b7d9675 | 471 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 472 | |
| SDesign2018 | 20:dba07b7d9675 | 473 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 474 | * ADXL372 reset function |
| SDesign2018 | 20:dba07b7d9675 | 475 | * Resets all registers and settings back to default |
| SDesign2018 | 20:dba07b7d9675 | 476 | * Basically the same as the previous ADXL372 I2C write function |
| SDesign2018 | 20:dba07b7d9675 | 477 | * |
| SDesign2018 | 20:dba07b7d9675 | 478 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 479 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 480 | void ADXL372Reset(void){ |
| SDesign2018 | 20:dba07b7d9675 | 481 | int flag; |
| SDesign2018 | 20:dba07b7d9675 | 482 | //--------- One full writing cycle for ADXL372 for Z Enable ------------------// |
| SDesign2018 | 20:dba07b7d9675 | 483 | /* '0' - NAK was received |
| SDesign2018 | 20:dba07b7d9675 | 484 | * '1' - ACK was received, <---- This good |
| SDesign2018 | 20:dba07b7d9675 | 485 | * '2' - timeout |
| SDesign2018 | 20:dba07b7d9675 | 486 | */ |
| SDesign2018 | 20:dba07b7d9675 | 487 | ADXL372.start(); |
| SDesign2018 | 20:dba07b7d9675 | 488 | flag = ADXL372.write(ADXL372_Address_8bit | 0); |
| SDesign2018 | 20:dba07b7d9675 | 489 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 490 | { |
| SDesign2018 | 20:dba07b7d9675 | 491 | //pc.printf("Write to I2C address success\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 492 | |
| SDesign2018 | 20:dba07b7d9675 | 493 | flag = ADXL372.write(0x41); |
| SDesign2018 | 20:dba07b7d9675 | 494 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 495 | { |
| SDesign2018 | 20:dba07b7d9675 | 496 | //pc.printf("Write to 0x41 register address success\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 497 | flag = ADXL372.write(0x52); // Set bit 0 |
| SDesign2018 | 20:dba07b7d9675 | 498 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 499 | { |
| SDesign2018 | 20:dba07b7d9675 | 500 | pc.printf("Everything has been reset\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 501 | ADXL372.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 502 | } |
| SDesign2018 | 20:dba07b7d9675 | 503 | } |
| SDesign2018 | 20:dba07b7d9675 | 504 | } |
| SDesign2018 | 20:dba07b7d9675 | 505 | else ADXL372.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 506 | // ---------------- End of writing cycle --------------------------// |
| SDesign2018 | 20:dba07b7d9675 | 507 | } |
| SDesign2018 | 20:dba07b7d9675 | 508 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 509 | |
| SDesign2018 | 20:dba07b7d9675 | 510 | /* |
| SDesign2018 | 20:dba07b7d9675 | 511 | * |
| SDesign2018 | 20:dba07b7d9675 | 512 | * Self-test to see if the accelerometer is working as intended |
| SDesign2018 | 20:dba07b7d9675 | 513 | * Wait 300 ms. |
| SDesign2018 | 20:dba07b7d9675 | 514 | * Check bit 2 for a 1 for success. Bit 1 for completion of self-test. |
| SDesign2018 | 20:dba07b7d9675 | 515 | * Returns whole register |
| SDesign2018 | 20:dba07b7d9675 | 516 | */ |
| SDesign2018 | 20:dba07b7d9675 | 517 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 518 | void I2CSelfTest(void){ |
| SDesign2018 | 20:dba07b7d9675 | 519 | char *result; |
| SDesign2018 | 20:dba07b7d9675 | 520 | uint8_t check; |
| SDesign2018 | 20:dba07b7d9675 | 521 | accelerometerI2CWrite(0x3F, 0x0F); |
| SDesign2018 | 20:dba07b7d9675 | 522 | accelerometerI2CWrite(0x40, 0x01); |
| SDesign2018 | 20:dba07b7d9675 | 523 | wait(0.3); |
| SDesign2018 | 20:dba07b7d9675 | 524 | result = accelerometerI2CRead(0x40); |
| SDesign2018 | 20:dba07b7d9675 | 525 | check = result[0]; |
| SDesign2018 | 20:dba07b7d9675 | 526 | if(check & 0x04){ |
| SDesign2018 | 20:dba07b7d9675 | 527 | pc.printf("Passed\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 528 | }else {pc.printf("FAILED\n\r");} |
| SDesign2018 | 20:dba07b7d9675 | 529 | } |
| SDesign2018 | 20:dba07b7d9675 | 530 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 531 | |
| SDesign2018 | 20:dba07b7d9675 | 532 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 533 | * |
| SDesign2018 | 20:dba07b7d9675 | 534 | * I2C function for the the ADXL372 accelerometer for a write sequence |
| SDesign2018 | 20:dba07b7d9675 | 535 | * Param: |
| SDesign2018 | 20:dba07b7d9675 | 536 | * hexAddress: Pass the hexadecimal value for what register you want |
| SDesign2018 | 20:dba07b7d9675 | 537 | * hexData: Pass the hexadecimal value for what data you want to send |
| SDesign2018 | 20:dba07b7d9675 | 538 | * i.e. hexadecimal represenatation of certain bits |
| SDesign2018 | 20:dba07b7d9675 | 539 | * Returns from mbed library write function |
| SDesign2018 | 20:dba07b7d9675 | 540 | * 0: NAK was reveived |
| SDesign2018 | 20:dba07b7d9675 | 541 | * 1: ACK was received <---- Good for us |
| SDesign2018 | 20:dba07b7d9675 | 542 | * 2: Timeout |
| SDesign2018 | 20:dba07b7d9675 | 543 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 544 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 545 | void accelerometerI2CWrite(int hexAddress, int hexData){ |
| SDesign2018 | 20:dba07b7d9675 | 546 | |
| SDesign2018 | 20:dba07b7d9675 | 547 | int flag; |
| SDesign2018 | 20:dba07b7d9675 | 548 | int registerAddress = hexAddress; |
| SDesign2018 | 20:dba07b7d9675 | 549 | int data = hexData; |
| SDesign2018 | 20:dba07b7d9675 | 550 | |
| SDesign2018 | 20:dba07b7d9675 | 551 | ADXL372.start(); |
| SDesign2018 | 20:dba07b7d9675 | 552 | flag = ADXL372.write(ADXL372_Address_8bit); |
| SDesign2018 | 20:dba07b7d9675 | 553 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 554 | { |
| SDesign2018 | 20:dba07b7d9675 | 555 | //pc.printf("Write to I2C address success\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 556 | wait(0.1); |
| SDesign2018 | 20:dba07b7d9675 | 557 | flag = ADXL372.write(registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 558 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 559 | { |
| SDesign2018 | 20:dba07b7d9675 | 560 | //pc.printf("Write to register 0x%x address success\n\r", registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 561 | flag = ADXL372.write(data); |
| SDesign2018 | 20:dba07b7d9675 | 562 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 563 | { |
| SDesign2018 | 20:dba07b7d9675 | 564 | pc.printf("Writing data 0x%x to register address 0x%d success\n\r", data, registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 565 | ADXL372.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 566 | return; |
| SDesign2018 | 20:dba07b7d9675 | 567 | }else {ADXL372.stop();} |
| SDesign2018 | 20:dba07b7d9675 | 568 | }else {ADXL372.stop();} |
| SDesign2018 | 20:dba07b7d9675 | 569 | }else ADXL372.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 570 | |
| SDesign2018 | 20:dba07b7d9675 | 571 | } |
| SDesign2018 | 20:dba07b7d9675 | 572 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 573 | |
| SDesign2018 | 20:dba07b7d9675 | 574 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 575 | * I2C read sequence for the accelerometer |
| SDesign2018 | 20:dba07b7d9675 | 576 | * Param: |
| SDesign2018 | 20:dba07b7d9675 | 577 | * hexAddress: pass the hexadecimal representation of desired Register address |
| SDesign2018 | 20:dba07b7d9675 | 578 | * Return: |
| SDesign2018 | 20:dba07b7d9675 | 579 | * Char pointer to the array of read data. |
| SDesign2018 | 20:dba07b7d9675 | 580 | * |
| SDesign2018 | 20:dba07b7d9675 | 581 | * Right now it works only for the XData, YData, ZData because I wrote it to read |
| SDesign2018 | 20:dba07b7d9675 | 582 | * 6 bytes(6 registers). |
| SDesign2018 | 20:dba07b7d9675 | 583 | * Should change it to be 1 byte at a time |
| SDesign2018 | 20:dba07b7d9675 | 584 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 585 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 586 | char * accelerometerI2CRead(int hexAddress){ |
| SDesign2018 | 20:dba07b7d9675 | 587 | char accelData[6]; |
| SDesign2018 | 20:dba07b7d9675 | 588 | char registerAddress[1]; |
| SDesign2018 | 20:dba07b7d9675 | 589 | registerAddress[0] = hexAddress; |
| SDesign2018 | 20:dba07b7d9675 | 590 | |
| SDesign2018 | 20:dba07b7d9675 | 591 | // Perform mbed's way sending a start bit, then device address[r/~w], and then the register address |
| SDesign2018 | 20:dba07b7d9675 | 592 | // Also if it succeeds, continue to the next operation |
| SDesign2018 | 20:dba07b7d9675 | 593 | if(ADXL372.write(ADXL372_Address_8bit, registerAddress, 1) == 0){ |
| SDesign2018 | 20:dba07b7d9675 | 594 | |
| SDesign2018 | 20:dba07b7d9675 | 595 | // If previous sequence works, get 6 bytes into char array accelData |
| SDesign2018 | 20:dba07b7d9675 | 596 | // Char array because it uses 1 byte(8bits) |
| SDesign2018 | 20:dba07b7d9675 | 597 | // Should probably change it to uint8_t type |
| SDesign2018 | 20:dba07b7d9675 | 598 | if(ADXL372.read(ADXL372_Address_8bit, accelData, 6) == 0){ |
| SDesign2018 | 20:dba07b7d9675 | 599 | return accelData; |
| SDesign2018 | 20:dba07b7d9675 | 600 | }else pc.printf("Failed to read\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 601 | }else pc.printf("Failed to write\n\r"); |
| SDesign2018 | 20:dba07b7d9675 | 602 | return 0; // Only if it fails completely |
| SDesign2018 | 20:dba07b7d9675 | 603 | } |
| SDesign2018 | 20:dba07b7d9675 | 604 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 605 | |
| SDesign2018 | 20:dba07b7d9675 | 606 | |
| SDesign2018 | 20:dba07b7d9675 | 607 | |
| SDesign2018 | 20:dba07b7d9675 | 608 | |
| SDesign2018 | 20:dba07b7d9675 | 609 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 610 | * Performs one byte write I2C protocol |
| SDesign2018 | 20:dba07b7d9675 | 611 | * PARAM: |
| SDesign2018 | 20:dba07b7d9675 | 612 | * registerAddress: register you want access to in device, one byte char hex format |
| SDesign2018 | 20:dba07b7d9675 | 613 | * data: one byte data that you want to write to device register |
| SDesign2018 | 20:dba07b7d9675 | 614 | * Return results from mbed library function: |
| SDesign2018 | 20:dba07b7d9675 | 615 | * 0: failure at writing i2c address |
| SDesign2018 | 20:dba07b7d9675 | 616 | * 1: successful write |
| SDesign2018 | 20:dba07b7d9675 | 617 | * 2: failure at writing data |
| SDesign2018 | 20:dba07b7d9675 | 618 | * |
| SDesign2018 | 20:dba07b7d9675 | 619 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 620 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 621 | void ADT7410Write(unsigned char registerAddress, unsigned char data){ |
| SDesign2018 | 20:dba07b7d9675 | 622 | int flag; |
| SDesign2018 | 20:dba07b7d9675 | 623 | ADT7410.start(); |
| SDesign2018 | 20:dba07b7d9675 | 624 | flag = ADT7410.write(ADT7410_Address_8BIT); |
| SDesign2018 | 20:dba07b7d9675 | 625 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 626 | { |
| SDesign2018 | 20:dba07b7d9675 | 627 | |
| SDesign2018 | 20:dba07b7d9675 | 628 | wait(0.1); |
| SDesign2018 | 20:dba07b7d9675 | 629 | flag = ADT7410.write(registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 630 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 631 | { |
| SDesign2018 | 20:dba07b7d9675 | 632 | |
| SDesign2018 | 20:dba07b7d9675 | 633 | flag = ADT7410.write(data); |
| SDesign2018 | 20:dba07b7d9675 | 634 | if(flag == 1) |
| SDesign2018 | 20:dba07b7d9675 | 635 | { |
| SDesign2018 | 20:dba07b7d9675 | 636 | pc.printf("Writing data 0x%x to register address 0x%x success\n\r", data, registerAddress); |
| SDesign2018 | 20:dba07b7d9675 | 637 | ADT7410.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 638 | |
| SDesign2018 | 20:dba07b7d9675 | 639 | }else {ADT7410.stop();} |
| SDesign2018 | 20:dba07b7d9675 | 640 | }else {ADT7410.stop();} |
| SDesign2018 | 20:dba07b7d9675 | 641 | }else ADT7410.stop(); |
| SDesign2018 | 20:dba07b7d9675 | 642 | |
| SDesign2018 | 20:dba07b7d9675 | 643 | |
| SDesign2018 | 20:dba07b7d9675 | 644 | } |
| SDesign2018 | 20:dba07b7d9675 | 645 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 646 | |
| SDesign2018 | 20:dba07b7d9675 | 647 | |
| SDesign2018 | 20:dba07b7d9675 | 648 | /******************************************************************************* |
| SDesign2018 | 20:dba07b7d9675 | 649 | * I2C Read function for ADT7410 Temperature sensor |
| SDesign2018 | 20:dba07b7d9675 | 650 | * Param: |
| SDesign2018 | 20:dba07b7d9675 | 651 | * hex: hexadecimal representation for desired register |
| SDesign2018 | 20:dba07b7d9675 | 652 | * Return: |
| SDesign2018 | 20:dba07b7d9675 | 653 | * Char pointer to the array of data values. |
| SDesign2018 | 20:dba07b7d9675 | 654 | * Could also change from a char pointer to a uint8_t pointer. |
| SDesign2018 | 20:dba07b7d9675 | 655 | * |
| SDesign2018 | 20:dba07b7d9675 | 656 | ******************************************************************************/ |
| SDesign2018 | 20:dba07b7d9675 | 657 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 658 | char * ADT7410Read(int hex){ |
| SDesign2018 | 20:dba07b7d9675 | 659 | //short int convertedVal; |
| SDesign2018 | 20:dba07b7d9675 | 660 | char data[2] = {0, 0}; |
| SDesign2018 | 20:dba07b7d9675 | 661 | char cmd[1]; |
| SDesign2018 | 20:dba07b7d9675 | 662 | cmd[0] = hex; |
| SDesign2018 | 20:dba07b7d9675 | 663 | //pc.printf("Register Addres is: %x \n\r", cmd[0]); |
| SDesign2018 | 20:dba07b7d9675 | 664 | if(ADT7410.write(ADT7410_Address_8BIT, cmd,1) == 0){ |
| SDesign2018 | 20:dba07b7d9675 | 665 | if(ADT7410.read(ADT7410_Address_8BIT, data, 2) == 0){ |
| SDesign2018 | 20:dba07b7d9675 | 666 | |
| SDesign2018 | 20:dba07b7d9675 | 667 | return data; |
| SDesign2018 | 20:dba07b7d9675 | 668 | //return (data[0] << 8 | data[1])>>3; // Explained here: https://stackoverflow.com/a/141576 SOOO GREAT |
| SDesign2018 | 20:dba07b7d9675 | 669 | |
| SDesign2018 | 20:dba07b7d9675 | 670 | }else {pc.printf("Failed to read \n\r"); return data;} |
| SDesign2018 | 20:dba07b7d9675 | 671 | }else {pc.printf("Failed to write \n\r"); return data;} |
| SDesign2018 | 20:dba07b7d9675 | 672 | |
| SDesign2018 | 20:dba07b7d9675 | 673 | } |
| SDesign2018 | 20:dba07b7d9675 | 674 | //////////////////////////////////////////////////////////////////////////////// |
| SDesign2018 | 20:dba07b7d9675 | 675 |
