From c5d5f78884e16643df7fb2bef33af7b3ce245ab4 Mon Sep 17 00:00:00 2001 From: James Devine Date: Sun, 4 Oct 2015 15:31:22 +0200 Subject: [PATCH] --- CosmicPiComplete0410151531.ino | 375 +++++++++++++++++++++++++++++++++ 1 file changed, 375 insertions(+) create mode 100644 CosmicPiComplete0410151531.ino diff --git a/CosmicPiComplete0410151531.ino b/CosmicPiComplete0410151531.ino new file mode 100644 index 0000000..804ec91 --- /dev/null +++ b/CosmicPiComplete0410151531.ino @@ -0,0 +1,375 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +//definitions of stuff +//GPS serial read on Due serial 2 +#define mySerial Serial1 +#define GPSECHO true +//SPI device enable pin +const int slaveAPin = 52; +//integer array for data sampling +unsigned int values[200]; +//byte outputbuffer[1200]; +//define trigger pin +const int eventtrigger = 49; +boolean eventhappened = false; + +//How many samples to readback on trigger +const int sampledepth = 10; + +//how many events have happened since reset +long eventcounter = 0; + +//how many measurement points have been readback in the adcoutput loop +int readoutctr = 0; + +//Index counter for the ADC buffer, +int adcloopctr = 0; + +//timing second reset signal from GPS +const int timeresetpin = 50; + +//define adafruit components +Adafruit_10DOF dof = Adafruit_10DOF(); +Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(30301); +Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(30302); +Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(18001); +Adafruit_HTU21DF htu = Adafruit_HTU21DF(); +Adafruit_GPS GPS(&mySerial); + +//define variables +String inputString = ""; // a string to hold incoming data +boolean stringComplete = false; // whether the string is complete +boolean timereset = false; //has an event been detected? +String lastgpsread = ""; +//lastgpsread.reserve(100); +int deviceid = random(1, 10000); +float temperature; +double temperatureh = 0; +double humidity = 0; +double baroaltitude = 0; +double accelx = 0; +double accely = 0; +double accelz = 0; +double magx = 0; +double magy = 0; +double magz = 0; +int currentval = 0xFF; +long exacttime = 0; +int uptime = 0; +String outputbuffer = ""; //write all the outputs to a buffer and then fmacro it out +float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; + +//define a reservation for the lastgpsread +//didn't work as there's already a reservation + +void setup() +{ + //run the sensor initialisation routine + initSensors(); + + //init GPS on second serial port + GPS.begin(9600); + mySerial.begin(9600); + GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); + GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate + delay(1000); + Serial.println(F("GPS online")); + inputString.reserve(250); + pinMode(timeresetpin, INPUT); + attachInterrupt(timeresetpin, timeset, RISING); + pinMode(eventtrigger, INPUT); + attachInterrupt(eventtrigger, monkey, FALLING); + Serial.begin(115200); // initialize the serial port: + + //setup ADC + REG_ADC_MR = 0x10380180; // change from 10380200 to 10380180, 1 is the PREESCALER and 8 means FREERUN + ADC -> ADC_CHER = 0x03; // enable ADC on pin A6 and A7 + eventhappened = false; + adcloopctr = 0; + Serial.println("ADC Alive"); + + pinMode (slaveAPin, OUTPUT); + digitalWrite(slaveAPin, LOW); + SPI.begin(); + Serial.println(F("ramping start")); + ramp(0x6D); + +} + +void loop() { + + exacttime++; //increment the sub second timer + + unsigned long t = micros(); // init time an elapsed time, in micro seconds + +// instrucction to measure from ADC in rolling mode + while ((ADC->ADC_ISR & 0x3) == 0); // wait for conversion + values[adcloopctr + 100] = ADC->ADC_CDR[0]; // read value A0 + values[adcloopctr] = ADC->ADC_CDR[1]; // read value A0 + adcloopctr++; + +//read out from the GPS if the string has finished + if (stringComplete) { + lastgpsread = inputString; + lastgpsread.trim(); + //debug printout + //Serial.println(inputString); + // clear the string: + inputString = ""; + stringComplete = false; + } + +//if the GPS says it's one second then restart the local clock and echo + if (timereset) { + Serial.println("Timereset Detection on pin 50"); + Serial.println(exacttime); + exacttime = 0; + timereset = false; + } + + +if (eventhappened) { + readoutctr = 10; + sensorreadout(); + eventcounter++; + printdatajson(); + //Serial.println(F("Event")); + eventhappened = false; + } + +if (adcloopctr == sampledepth) { + adcloopctr = 0; + } + + +} + +//serial event from GPS handling +void serialEvent1() { + while (Serial1.available()) { + // get the new byte: + char inChar = (char)Serial1.read(); + // add it to the inputString: + if (inChar != char(10)) + { + inputString += inChar; + } + // if the incoming character is a newline, set a flag + // so the main loop can do something about it: + if (inChar == '\n') { + stringComplete = true; + } + } +} + +//Serial event from GPS interrupt, launches the second routine to avoid a crash +void serialEventRun(void) +{ + if (Serial1.available()) + serialEvent1(); +} + +//run once to initialise the sensor systems +void initSensors() +{ + if (!accel.begin()) + { + /* There was a problem detecting the LSM303 ... check your connections */ + Serial.println(F("Ooops, no LSM303 detected ... Check your wiring!")); + while (1); + } + if (!mag.begin()) + { + /* There was a problem detecting the LSM303 ... check your connections */ + Serial.println("Ooops, no LSM303 detected ... Check your wiring!"); + while (1); + } + if (!bmp.begin()) + { + /* There was a problem detecting the BMP180 ... check your connections */ + Serial.println("Ooops, no BMP180 detected ... Check your wiring!"); + while (1); + } + if (!htu.begin()) { + Serial.println("Couldn't find HTU21DF sensor!"); + while (1); + } +} + +//print out everything +void printdatajson() +{ + //rewritten to use a buffer + //start the data output on in json format + outputbuffer = "{\"gps\": \""; + outputbuffer = outputbuffer + lastgpsread; + outputbuffer = outputbuffer + "\" ,\"timing\":"; + outputbuffer = outputbuffer + exacttime; + outputbuffer = outputbuffer +",\"energy\": { \"energy1\": ["; + + for (int firsthalf = adcloopctr + 1; firsthalf < sampledepth; firsthalf++) + { + outputbuffer = outputbuffer + (values[firsthalf]); + if (readoutctr != 1) outputbuffer = outputbuffer + (", "); + readoutctr--; + } + for (int secondhalf = 0; secondhalf < adcloopctr + 1; secondhalf++) + { + outputbuffer = outputbuffer + (values[secondhalf]); + if (readoutctr != 1) outputbuffer = outputbuffer + (", "); + readoutctr--; + } + Serial.print((outputbuffer)); + outputbuffer = ""; + Serial.print(" ],"); + Serial.print(" \"energy2\": ["); + readoutctr = 10; + + for (int firsthalf = adcloopctr + 1; firsthalf < sampledepth; firsthalf++) + { + Serial.print(values[firsthalf + 100]); + if (readoutctr != 1) Serial.print(", "); + readoutctr--; + } + for (int secondhalf = 0; secondhalf < adcloopctr + 1; secondhalf++) + { + Serial.print(values[secondhalf + 100]); + if (readoutctr != 1) Serial.print(", "); + readoutctr--; + } + Serial.print(" ]"); + Serial.print(" },"); + + Serial.print(" \"altitude\": "); + Serial.print(baroaltitude); + Serial.print(","); + + Serial.print(" \"humidity\": "); + Serial.print(humidity); + Serial.print(","); + + Serial.print(" \"gravitationalOrientation\": {"); + Serial.print(" \"x\": "); + Serial.print(accelx); + Serial.print(","); + Serial.print(" \"y\": "); + Serial.print(accely); + Serial.print(","); + Serial.print(" \"z\": "); + Serial.print(accelz); + Serial.print(" },"); + + Serial.print(" \"magneticOrientation\": {"); + Serial.print(" \"x\": "); + Serial.print(magx); + Serial.print(","); + Serial.print(" \"y\": "); + Serial.print(magy); + Serial.print(","); + Serial.print(" \"z\": "); + Serial.print(magz); + Serial.print(" },"); + + Serial.print(" \"temperature\": {"); + Serial.print(" \"value1\": "); + Serial.print(temperatureh); //val1 is from the humidity sensor + Serial.print(","); + Serial.print(" \"value2\": "); + Serial.print(temperature); + Serial.print(" },"); + + Serial.print(" \"uptime\": "); + Serial.print(uptime); + Serial.print(","); + + Serial.print(" \"id\": "); + Serial.print(deviceid); + Serial.println("}"); +} + + +void monkey() +{ + //Serial.println("trigger"); + eventhappened = true; +} + +void sensorreadout() +{ + sensors_event_t accel_event; + sensors_event_t mag_event; + sensors_event_t bmp_event; + sensors_vec_t orientation; + + /* Calculate pitch and roll from the raw accelerometer data */ + accel.getEvent(&accel_event); + if (dof.accelGetOrientation(&accel_event, &orientation)) + { + accelx = (accel_event.acceleration.x); + accely = (accel_event.acceleration.y); + accelz = (accel_event.acceleration.z); + + } + + /* Calculate the heading using the magnetometer */ + mag.getEvent(&mag_event); + if (dof.magGetOrientation(SENSOR_AXIS_Z, &mag_event, &orientation)) + { + magx = (mag_event.magnetic.x); + magy = (mag_event.magnetic.y); + magz = (mag_event.magnetic.z); + } + + /* Calculate the altitude using the barometric pressure sensor */ + bmp.getEvent(&bmp_event); + if (bmp_event.pressure) + { + /* Get ambient temperature in C */ + bmp.getTemperature(&temperature); + /* Convert atmospheric pressure, SLP and temp to altitude */ + baroaltitude = (bmp.pressureToAltitude(seaLevelPressure, bmp_event.pressure, temperature)); + + temperatureh = (htu.readTemperature()); + humidity = (htu.readHumidity()); + } + + // energy1= energy1 + random(-100,100); + // energy2= energy2 + random(-100,100); + uptime++; + +} + +void timeset() +{ + timereset = true; +} + +void ramp(int target) +{ + //wait 100ms before ramp up + int difference = currentval - target; + + while (currentval > target) + { + digitalWrite(slaveAPin, LOW); + SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); + //digitalWrite(slaveAPin, LOW); + delay(180); + SPI.transfer(currentval); + Serial.println(currentval); + delay(180); + //digitalWrite(slaveAPin, HIGH); + SPI.endTransaction(); + digitalWrite(slaveAPin, HIGH); + currentval = currentval - 2; + } +} \ No newline at end of file