#include <math.h>
#include <TinyGPS.h>
#include <SoftwareSerial.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define EXT_BUS 22
#define INT_BUS 23
#define AC_BUS 24
//GPS in Serial 2
#include <Wire.h>
SoftwareSerial Serial32(14, 15); //need to fix with new shield (BT1)
//Coolant, Oil, Trans Temp
const byte t1 = 246, t2 = 46, t4 = 84;
const int t3 = 297;
const byte OTP = 1;
byte Ct, Ot, Tt;
const byte TTP = 2;
const float rtov (5 / 1024);
//Oil Pressure
const byte OPP = 3;
byte Op;
const int op1 = -3004, op2 = 29332;
const long op3 = 95837, op4 = 105439;
//Vacuum
const byte VAP = 7;
byte Va1 = 27, Va2 = 19;
int Va;
//Digital Temp Sensors
OneWire oneWire1(EXT_BUS);
OneWire oneWire2(INT_BUS);
OneWire oneWire3(AC_BUS);
DallasTemperature sensors1(&oneWire1);
DallasTemperature sensors2(&oneWire2);
DallasTemperature sensors3(&oneWire3);
int Et = (sensors1.getTempFByIndex(0));
int It = (sensors2.getTempFByIndex(0));
int Vt = (sensors3.getTempFByIndex(0));
//Battery Voltage
const byte VOI = 15;
byte Vo, Vtot;
const int Vo2 = (7500 / (30000 + 7500)) * 100;
const int numReadings = 5;
int readings[numReadings];
int readIndex = 0;
float Vav;
unsigned long timingstart;
//RPM
//volatile byte rpmcount = 0;
//unsigned long rpmnum = 0;
//int rpmdec = 0;
int rpm = 0;
//unsigned long timeold = 0;
//int interrupt = 4;
int cylinders = 8;
volatile bool newPulse = false;
volatile unsigned long lastPulseTime;
volatile unsigned long lastPulseInterval;
//GPS
long lat, lon;
float flat, flon, Sp, Spc, Alt;
unsigned long age, date, time, chars, Cr;
int year;
byte Hr, Mn;
byte month, day, hour, minute, second, hundredths;
unsigned short sentences, failed;
TinyGPS gps;
//Fuel Level
byte Fl;
const byte FlOhmsMax = 60, FlOhmsMin = 10;
const byte LevelMin = ((5 * (FlOhmsMax / (FlOhmsMax + 100))) * 100), LevelMax = ((5 * (FlOhmsMin / (FlOhmsMin + 100))) * 100);
const int LevelP = (LevelMax - LevelMin);
//define voltage conversion formula variables
//Fuel Pressure
const byte FPP = 6;
const byte Fp1 = 11, Fp2 = 20;
float Fp;
//Fuel Temp
const byte FTP = 4;
const byte ft2 = 47, ft4 = 137;
byte Ft;
const int ft1 = 270, ft3 = 680;
//Fuel Flow
byte sensorPin = 18;
float calibrationFactor = 11;
volatile byte pulseCount;
float Ff;
float flowMilliLitres;
float Fu;
unsigned long oldTime;
//Accelerometer
const int MPU_addr = 0x68; int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
int minVal = 265; int maxVal = 402;
double x; double y; double z;
int calibratepin = 27, calibratestate = 0;
float pitchcalib = 0, rollcalib = 0, compcalib = 0;
bool timeoutOccurred(void);
void setup() {
//RPM trigger
attachInterrupt(digitalPinToInterrupt(19), rpmtrigger, FALLING);
//Digital Temp
sensors1.begin();
sensors2.begin();
sensors3.begin();
sensors1.setResolution(9);
sensors2.setResolution(9);
sensors3.setResolution(9);
Serial.begin(9600);
Serial2.begin(4800);
Serial32.begin(9600);
//BT2serial.begin(9600);
//Accelerometer
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
pulseCount = 0;
Ff = 0.0;
flowMilliLitres = 0;
Fu = 0;
oldTime = 0;
attachInterrupt(digitalPinToInterrupt(18), pulseCounter, FALLING);
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
}
void gpsdump(TinyGPS &gps)
gps.f_altitude();
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
gps.f_speed_mph();
gps.course();
gps.f_get_position(&flat, &flon, &age);
Hr = (static_cast<int>(hour));
Mn = (static_cast<int>(minute));
Sp = (gps.f_speed_mph());
Alt = (gps.f_altitude());
Cr = (gps.course() / 100);
}
void rpmtrigger()
{
unsigned long now = micros();
unsigned long pulseInterval = now - lastPulseTime;
if (pulseInterval > 10)
{
lastPulseTime = now;
lastPulseInterval = pulseInterval;
newPulse = true;
}
}
void pulseCounter() {
pulseCount++;
}
void loop() {
timingstart = (millis());
//Coolant DONE
if ((analogRead(CTP)) < 270) {
Ct = (t3 - ((analogRead(CTP) * rtov) * t4));
}
else {
Ct = (t1 - ((analogRead(CTP) * rtov) * t2));
}
Serial32.print(F("<C,")); Serial32.print(Ct); Serial32.print(F(">"));
Serial.print(F("Coolant:")); Serial.print(Ct); Serial.println(F("F;"));
Serial.print(F("Coolant time:")); Serial.println(millis() - timingstart);
//same setup for other thermistors (9000 character limit)
//Voltage DONE
Vo = (((analogRead(VOI) * rtov) * 100) / (Vo2)) * 10;
Vtot = Vtot - readings[readIndex];
readings[readIndex] = Vo;
Vtot = Vtot + readings[readIndex];
readIndex = readIndex + 1;
if (readIndex >= numReadings) {
readIndex = 0;
}
Vav = (Vtot / numReadings) / 10;
Serial32.print(F("<fv,")); Serial32.print(Vav); Serial32.print(F(">"));
Serial.print(F("Volt:")); Serial.println(Vo / 10);
Serial.print(F("VoltAverage:")); Serial.println(Vav, 1);
Serial.print(F("Voltagetime:")); Serial.println(millis() - timingstart);
//Vacuum DONE
Va = (Va1 - (Va2 * (analogRead(VAP) * rtov)));
//Va = Va/2 yeids approx PSI
Serial32.print(F("<U,")); Serial32.print(Va); Serial32.print(F(">"));
Serial.print(F("Vac:")); Serial.print(Va); Serial.println(F("inHg;"));
Serial.print(F("Vactime:")); Serial.println(millis() - timingstart);
//RPM
int rpm;
if (newPulse)
{
rpm = 60000000 / lastPulseInterval;
newPulse = false;
}
else
{
rpm = 0;
}
if (rpm < 1) rpm = 0;
Serial32.print(F("<R,")); Serial32.print(rpm); Serial32.print(F(">"));
Serial.print(F("RPM: ")); Serial.println(rpm);
Serial.print(F("RPMtime:")); Serial.println(millis() - timingstart);
//GPS
bool newdata = false;
unsigned long start = millis();
Serial2.flush();
while (millis() - start < 600)
{ if (Serial2.available() > 0)
{ char c = Serial2.read();
if (gps.encode(c))
{ newdata = true;
break;
}
}
}
if (newdata)
{
gpsdump(gps);
}
Serial32.print(F("<S,")); Serial32.print(Sp, 0); Serial32.print(F(">"));
//...prints other variables
Serial.print(F("Time:")); Serial.print(Hr); Serial.print(F(":")); Serial.println(Mn);
//...prints other variables
//Fuel Flow
if ((millis() - oldTime) > 1000) {
detachInterrupt(digitalPinToInterrupt(18));
//Ff = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
Ff = (((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor) * .26; ///gives gallons
oldTime = millis();
//flowMilliLitres = (Ff / 60) * 1000; //gives ml
flowMilliLitres = (Ff / 60) * .26; //gives gallons
Fu += flowMilliLitres;
}
Serial32.print(F("<ff,")); Serial32.print(Ff, 2); Serial32.print(F(">"));
//...
Serial.print(F("Rate:")); Serial.print(Ff, 2); Serial.println(F("L/Min; "));
//...
pulseCount = 0;
attachInterrupt(digitalPinToInterrupt(18), pulseCounter, FALLING);
Serial.print(F("Fuel flow time:")); Serial.println(millis() - timingstart);
//Digital Temp
sensors1.requestTemperatures();
sensors2.requestTemperatures();
sensors3.requestTemperatures();
Serial32.print(F("<E,")); Serial32.print(Et); Serial32.print(F(">"));
//...
Serial.print(F("Outside Temp:")); Serial.print(Et); Serial.println(F(" F"));
//...
Serial.print(F("Digital temp time:")); Serial.println(millis() - timingstart);
//ACCEL
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr, 14, true);
AcX = Wire.read() << 8 | Wire.read();
AcY = Wire.read() << 8 | Wire.read();
AcZ = Wire.read() << 8 | Wire.read();
int xAng = map(AcX, minVal, maxVal, -90, 90);
int yAng = map(AcY, minVal, maxVal, -90, 90);
int zAng = map(AcZ, minVal, maxVal, -90, 90);
x = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI); y = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI); z = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);
if (x > 180) x = (x - 360);
if (y > 180) y = (y - 360);
Serial32.print(F("<fx,")); Serial32.print(x, 1); Serial32.print(F(">"));
//...
Serial.print(F("Left/Right: ")); Serial.println(x, 1);
//...
Serial.print(F("Accel time:")); Serial.println(millis() - timingstart);
Serial.print(F("TOTAL LOOP TIME:")); Serial.println(millis() - timingstart);
}
[/ code]