ADXL345 test on L476
main.cpp
- Committer:
- tifo
- Date:
- 2018-01-24
- Revision:
- 3:618d78c7c53a
- Parent:
- 2:2a57e2a50796
- Child:
- 4:d850da8732c1
File content as of revision 3:618d78c7c53a:
#include "mbed.h"
#include "adxl345.h"
#include <string>
// skywire -------------------
/* --CHANGE THIS FOR YOUR SETUP-- */
#define DeviceID "yourDeviceIDhere" //Freeboard DweetIO unique ID
/* --CHANGE THIS FOR YORU SETUP (IF APPLICABLE)-- */
string APN = "yourAPNhere";
// ===========================
ADXL345 adxl;
int x, y, z;
volatile char input_buffer[90]; // store everything received
volatile char message_buffer[90]; // store message
volatile char input_buffer_counter = 0;
volatile char message_counter = 0;
volatile char input_flag = false;
volatile char latitude[15] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
volatile char longtitude[15] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
volatile char coorFlag = 0;
// skywire ------------------------
DigitalOut skywire_en(PA_6); // Skywire Enable
DigitalOut skywire_rts(PA_7); // Skywire Send
Serial skywire(PA_9,PA_10); // Serial comms to Skywire
// Variables for UART comms
volatile int rx_in=0;
volatile int rx_out=0;
const int buffer_size = 600;
char rx_buffer[buffer_size+1];
char rx_line[buffer_size];
// char array for reading from Skywire
char str[255];
// ===============================
Serial pcSerial(SERIAL_TX, SERIAL_RX, 9600); // tx, rx // pc
Serial gpsSerial(A0, A1, 9600); // tx, rx // gps
I2C i2cAcc(I2C_SDA, I2C_SCL);
DigitalOut led(LED1);
void ADXL_ISR();
void rxHandler();
//===================================================================
//FUNCTIONS
//===================================================================
/********************* ISR *********************/
/* Look for Interrupts and Triggered Action */
void ADXL_ISR() {
// getInterruptSource clears all triggered actions after returning value
// Do not call again until you need to recheck for triggered actions
int interrupts = adxl.getInterruptSource();
// Free Fall Detection
if(adxl.triggered(interrupts, ADXL345_FREE_FALL)){
pcSerial.printf("*** FREE FALL ***\n");
led = 1;
wait(2);
led = 0;
}
}
//===================================================================
// RX interrupt handler
// stores everything into input_buffer
void rxHandler()
{
char tmp;
do
{
tmp = gpsSerial.getc(); // read serial data
if(tmp == '$') // if message start character( every nmea message starts with $)
{
input_buffer_counter = 0; // reset inut buffer counter
return;
}
if(tmp == '*') // if end of message( every nmea message ends with *+CRC)
{
input_buffer[input_buffer_counter] = tmp;
input_buffer_counter++;
if(input_buffer[3] == 'L') // if nmea string type is GPGLL
{
int t = 0;
int lat = 0;
int lon = 0;
for(int i=0; i<15; i++) // clear latitude and longtitude
{
latitude[lat++] = ' ';
longtitude[lon++] = ' ';
}
while(input_buffer[t] != ',') // find coma after GPGLL
t++; // t points coma after GPGLL
t++; // set to to first latitude character
lat = 0;
while(input_buffer[t] != ',') // copy latitude value
{
latitude[lat] = input_buffer[t];
lat++;
t++; // t points coma after latitude
}
latitude[lat] = input_buffer[t]; // copy coma
lat++;
t++;
latitude[lat] = input_buffer[t]; // copy N or S direction
lat++;
t++;
latitude[lat] = '\0'; // write null character
t++; // set t to first character of longtitude
lon = 0;
while(input_buffer[t] != ',') // copy longtitude value
{
longtitude[lon] = input_buffer[t];
lon++;
t++; // t points coma after longtitude
}
longtitude[lon] = input_buffer[t]; // copy coma
lon++;
t++;
longtitude[lon] = input_buffer[t]; // copy W or E direction
lon++;
longtitude[lon] = '\0'; // write null character
coorFlag = 1;
}
return;
}
input_buffer[input_buffer_counter] = tmp;
input_buffer_counter++;
}
while(gpsSerial.readable());
}
//===================================================================
// Read line from the UART
void read_line()
{
int i;
i = 0;
// Start Critical Section - don't interrupt while changing global buffer variables
__disable_irq();
// Loop reading rx buffer characters until end of line character
while ((i==0) || (rx_line[i-1] != '\n')) {
// Wait if buffer empty
if (rx_in == rx_out) {
// End Critical Section - need to allow rx interrupt to get new characters for buffer
__enable_irq();
while (rx_in == rx_out) {
}
// Start Critical Section - don't interrupt while changing global buffer variables
__disable_irq();
}
rx_line[i] = rx_buffer[rx_out];
i++;
rx_out = (rx_out + 1) % buffer_size;
}
// End Critical Section
__enable_irq();
rx_line[i-1] = 0;
return;
}
//=======================================================================
// Wait for specific response
int WaitForResponse(char* response, int num)
{
do {
read_line();
pcSerial.printf("Waiting for: %s, Recieved: %s\r\n", response, rx_line);
} while (strncmp(rx_line, response, num));
return 0;
}
//==========================================================================
// Interrupt for the Skywire
void Skywire_Rx_interrupt()
{
// Loop just in case more than one character is in UART's receive FIFO buffer
// Stop if buffer full
while ((skywire.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) {
rx_buffer[rx_in] = skywire.getc();
rx_in = (rx_in + 1) % buffer_size;
}
return;
}
void data_send()
{
skywire.printf("AT+SQNSD=3,0,80,\"dweet.io\"\r\n");
WaitForResponse("CONNECT", 7);
pcSerial.printf("Sending information...\r\n");
// Report the sensor data to dweet.io
skywire.printf("POST /dweet/for/%s?latitude=%s&longtitude=%s HTTP/1.0\r\n\r\n", DeviceID, latitude, longtitude);
// Wait for response from dweet.io
WaitForResponse("OK", 2);
wait(1);
}
// MAIN -=-=-=-=-=-=-=-=-
//++++++++++++++++++++++++++++++++++++++++++++++++++++
int main() {
skywire.baud(115200);
skywire.attach(&Skywire_Rx_interrupt, Serial::RxIrq);
i2cAcc.frequency(100000);
adxl.powerOn(); // Power on the ADXL345
adxl.setRangeSetting(8); // Give the range settings
// Accepted values are 2g, 4g, 8g or 16g
// Higher Values = Wider Measurement Range
// Lower Values = Greater Sensitivity
// Set values for what is considered FREE FALL (0-255)
adxl.setFreeFallThreshold(9); // (5 - 9) recommended - 62.5mg per increment
adxl.setFreeFallDuration(20); // (20 - 70) recommended - 5ms per increment
// Setting all interupts to take place on INT1 pin
adxl.setImportantInterruptMapping(0, 0, 1, 0, 0); // Sets "adxl.setEveryInterruptMapping(single tap, double tap, free fall, activity, inactivity);"
// Accepts only 1 or 2 values for pins INT1 and INT2. This chooses the pin on the ADXL345 to use for Interrupts.
// This library may have a problem using INT2 pin. Default to INT1 pin.
// Turn on Interrupts for each mode (1 == ON, 0 == OFF)
adxl.FreeFallINT(1);
pcSerial.printf("SparkFun ADXL345 Accelerometer Hook Up Guide Example\n");
gpsSerial.attach(rxHandler);
pcSerial.printf("Starting Demo...\r\n");
pcSerial.printf("Waiting for Skywire to Boot...\r\n");
//Enable Skywire
skywire_en=0;
wait(2);
skywire_en=1;
wait(2);
skywire_en=0;
// Wait for modem to initialize
wait(60);
//Turn off echo
// Helps with checking responses from Skywire
pcSerial.printf("Turning off echo...\r\n");
skywire.printf("ATE0\r\n");
WaitForResponse("OK", 2);
// Turn on DNS Response Caching
// Used on the Telit-based Skywires
pcSerial.printf("Turning on DNS Cacheing to improve speed...");
skywire.printf("AT#CACHEDNS=1\r\n");
WaitForResponse("OK", 2);
pcSerial.printf("Connecting to Network...\r\n");
// get IP address
// The last parameter in AT+SQNSCFG sets the timeout if transmit buffer is not full
// Time is in hundreds of ms: so, a value of 5 = 500ms
pcSerial.printf("Configuring context part 1...\r\n");
skywire.printf("AT+SQNSCFG=3,3,300,90,600,5\r\n");
WaitForResponse("OK", 2);
wait(1);
pcSerial.printf("Configuring context part 2...\r\n");
skywire.printf("AT+CGDCONT=3,\"IP\",\"vzwinternet\"\r\n");
WaitForResponse("OK", 2);
wait(1);
pcSerial.printf("Activating context...\r\n");
skywire.printf("AT+CGACT=1,3\r\n");
WaitForResponse("OK", 2);
while(1) {
// Accelerometer Readings
//int x,y,z;
//adxl.readAccel(&x, &y, &z); // Read the accelerometer values and store them in variables declared above x,y,z
// Output Results to Serial
/* UNCOMMENT TO VIEW X Y Z ACCELEROMETER VALUES */
//mySerial.printf("X: %i\nY: %i\nZ: %i\n================\n", x, y, z);
//wait(2);
ADXL_ISR();
// You may also choose to avoid using interrupts and simply run the functions within ADXL_ISR();
// and place it within the loop instead.
// This may come in handy when it doesn't matter when the action occurs.
if(coorFlag) // show coordinates
{
pcSerial.printf("message: %s\n", input_buffer);
pcSerial.printf("latitude: %s\n", latitude);
pcSerial.printf("longtitude: %s\n", longtitude);
data_send();
coorFlag = 0;
}
}
}