Skip to content

Instantly share code, notes, and snippets.

@pingud98
Created July 27, 2015 02:11
Show Gist options
  • Save pingud98/45560a28a2048cd38093 to your computer and use it in GitHub Desktop.
Save pingud98/45560a28a2048cd38093 to your computer and use it in GitHub Desktop.
CosmicpiDraft1 - Full functionality
/*
Cosmic Pi fully integrated script mk1
Designed for Arduino Due, sampling performance <500ksps (to be measured)
untested. Runs on interrupt to pins 50 (time reset) and 49 (event detection)
*/
#include <Adafruit_GPS.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_L3GD20_U.h>
#include <Adafruit_BMP085_U.h>
#include <Adafruit_LSM303_U.h>
#include <Adafruit_10DOF.h>
#include <Adafruit_HTU21DF.h>
#include <Wire.h>
#define mySerial Serial1
#define GPSECHO true
const int timeresetpin = 50;
const int eventtrigger = 49;
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);
unsigned long values[2000];
char gpstext[ ] = "";
String gpstalk;
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
boolean eventhappened = false; //has an event been detected?
boolean timereset = false; //has an event been detected?
String lastgpsread;
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 timereset = 0;
int exacttime =0;
int uptime = 0;
/* Update this with the correct SLP for accurate altitude measurements */
float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
void setup()
{
initSensors();
// connect at 115200 so we can read the GPS fast enough and echo without dropping chars
// also spit it out
Serial.begin(115200);
// 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800
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("GPS online");
inputString.reserve(200);
//timing reset pin, hook up to 1pps output pin from GPSmodule
pinMode(timeresetpin, INPUT);
attachInterrupt(timeresetpin, timeset, RISING);
//event trigger pin, makes readout happen
pinMode(timeresetpin, INPUT);
attachInterrupt(timeresetpin, eventtrigger, RISING);
unsigned int adcloopctr;
adcloopctr=0;
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 A0
}
void loop() // run over and over again
{
exacttime++;
//if the ADC conversion is completed, then read it into the buffer and increment the index
if((ADC->ADC_ISR & 0x03)==0){; // wait for conversion
values[i]=ADC->ADC_CDR[0];
values[i+1000]=ADC->ADC_CDR[1];//get values
adcloopctr++;
}
if (stringComplete) {
lastgpsread = inputString;
lastgpsread.trim();
//debug printout
//Serial.println(inputString);
// clear the string:
inputString = "";
stringComplete = false;
}
if (eventhappened) {
Serial.println("Event Detection on pin 49");
eventhappened = false;
sensorreadout();
printdatajson(adcloopctr);
}
if (timereset) {
Serial.println("Timereset Detection on pin 50")
exacttime = 0;
}
if (adcloopctr==999) {
adcloopctr=0;
}
}
void printdatajson(int adcindex)
{
//start the data output on in json format
Serial.print("{ ");
Serial.print(" \"gps\":");
Serial.print(" \"");
Serial.print(lastgpsread);
Serial.print("\"");
Serial.print(" ,");
Serial.print(" \"timing\": ");
Serial.print(exacttime);
Serial.print(',');
Serial.print(" \"energy\": {");
Serial.print(" \"channel1\": ");
for (int printctr = adcloopctr; printctr < 999+adcloopctr; printctr++) {
Serial.print(values[(printctr-adcloopctr)]);
Serial.print(',');
}
Serial.print(values[(adcloopctr-1)]);
Serial.print(" \"channel2\": ");
for (int printctr = adcloopctr; printctr < 999+adcloopctr; printctr++) {
Serial.print(values[(1000+printctr-adcloopctr)]);
Serial.print(',');
}
Serial.print(values[(999+adcloopctr)]);
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 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;
}
}
}
void serialEventRun(void)
{
if (Serial1.available())
serialEvent1();
}
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);
}
}
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 eventtrigger()
{
eventhappened = true;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment