Software
ACHTUNG: erst alles lesen, dann loslegen.
1.) Arduino IDE auf dem PC installieren
Batterie CR1220 in Data logger einsetzen
2.) Data logger mit USB-Kabel mit PC verbinden. Feststellen wie die USB-Schnittstelle heißt.
3.) IDE starten, im Menü 'Werkzeuge/Bord: Arduino UNO' einstellen; in 'Werkzeuge/Port' die ermittelte Schnittstelle einstellen.
4.) RTC (Uhr) initialisieren: Menü 'Werkzeuge/Bibliotheken verwalten' die RTClib installieren.
'Datei/Beispiele/RTClib' DS1307 öffnen.
Seriellen Monitor in der IDE öffnen und unten die Geschwindigkeit auf 57600 Baud einstellen (wie im sketch hinter Serial.begin steht)
Kompilieren und zügig hochladen, da die PC-Zeit vom Kompilieren als Ist-Zeit gesetzt wird. Zeit bleibt erhalten solange die Batterie drin ist.
Wenn alles OK ist, erscheint auf dem seriellen Monitor fortlaufen Datum und Uhrzeit.
Fehlermeldungen beziehen sich meistens auf fehlende Libraries.
5.) GPS testen:
Die Librarie TinyGPSPlus-1.0.2b.zip installieren (ich kann sie nicht hochladen, selber bei Google suchen): Menü 'Sketch/Bibliothek einbinden/.ZIP- Bibliothek einbinden
Menü 'Datei/Beispiele/TinyGPS++/DeviceExaple' öffnen.
Zeile 8: ... TXPin = 3 auf 5 ändern. ACHTUNG:: am Zeilenende immer auf das ; achten
Zeile 9: ...GPSBaud = 4800 auf 9600 ändern.
Seriellen Monitor auf 115200 Baud einstellen.
Kompilieren und hochladen. Jedes Hochladen eines neuen skatches überschreibt automatisch den vorherigen.
GPS Empfänge ans Fenster legen, im Raum funktioniert es nicht. Wenn alles richtig ist sollten nach 2-5 min. GPS Position und Datum auf dem seriellen Monitor erscheinen.
Fehlermöglichkeiten gibt es viele: falsche Geschwindigkeiten eingestellt oder die Datenkabel TX und RX vertauscht.
Noch ein Hinweis: es gibt im Web das Programm u-center von der Fa. u-blox, mit dem kann man am GPS Empfänger rumschrauben, z.B. die Übertragungsgeschwindigkeit ändern. Das sollte man aber nur benutzen wenn man genau weiß was man tut, sonst funktioniert der Empfänger gar nicht mehr.
6.) Jetzt wird's ernst. Die SD Karte einstecken, ohne funktioniert es nicht.
Die Datei AFR_GPS_Forum.ino dort speichern wo die Arduino IDE sie findet.
Sketch AFR_GPS_Forum.ino öffnen.
Seriellen Monitor auf 115200 Baud einstellen.
Kompilieren, Warnungen über geringen Speicherplatz können ignoriert werden.
Hochladen und warten was passiert.
Auf dem seriellen Monitor sollte eine Meldung über das Erstellen einer Datei erscheinen und die Kopfzeile der Tabelle
time; afr; kmph
Nicht vergessen, GPS Empfänger ans Fenster legen sonst passiert gar nichts.
Die Datenaufzeichnung beginnt erst, wenn ein gültiges GPS Signal und ein gültiger AFR Wert anliegt.
Wahrscheinlich ist der AFR Meter noch nicht angeschlossen und trotzdem erscheinen nach ein paar Minuten Daten. Sollten auf jeden Fall.
An dem offenen Anschluss entsteht im Arduino ein undefinierter Wert, der zufällig gültig ist. Also den AFR Wert noch nicht ernst nehmen.
Die angezeigte Zeit sind Millisekunden seit Start des DAta logger. Die Geschwindigkeit sollte nahe Null sein.
Wenn die Aufzeichnung läuft blinkt eine der zwei LED's neben dem Reset-Taster. Es wird alle 0,5 sec ein Messwert erfasst und nach 10 Stück (=5 sec.)
auf die Karte geschrieben und die LED blinkt.
Wenn's läuft, logger wieder vom USB trennen und die SD Karte kann entnommen werden. Bei Jedem Start entsteht eine neue AFRxx.CSV Datei.
Die kann man jetzt schon zum spielen und Auswertungstest benutzen.
Die Darstellung und Auswertung ist ein eigenes Kapitel und sollte jeder selber schaffen.
7.) ab ins Pony. Der JST Stecker ist jetzt hoffentlich an den richtigen Kabeln des AFR Meter angelötet und kann an den Datalogger gesteckt werden.
Der data logger sollte auf dem Armaturenbrett liegen, sonst wird es mit dem GPS Empfang schwierig.
Stromversorgung mit dem USB-Kabel mit USB-Lader in der 12V Buchse verbinden.
ACHTUNG: keine andere Stromquelle benutzen, sonst stimmen die AFR Werte nicht.
Warten bis die LED blinkt, dann läuft er.
Abfahrt
Viel Erfolg und Spaß beim Basteln
Jörg
AFR_GPS_forum.ino
Code: Alles auswählen
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
/*
This sample code demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
It requires the use of SoftwareSerial, and assumes that you have a
57600-baud serial GPS device hooked up on pins 4(rx) and 5(tx).
*/
static const int RXPin = 4, TXPin = 5;
static const uint32_t GPSBaud = 9600;
// A simple data logger for the Arduino analog pins
// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL 500 // mills between entries (reduce to take more/faster data)
// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 10*LOG_INTERVAL // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()
#define ECHO_TO_SERIAL 1 // echo data to serial port
#define WAIT_TO_START 0 // Wait for serial input in setup()
// the digital pins that connect to the LEDs
#define redLEDpin 2
#define greenLEDpin 3
// The analog pins that connect to the sensors
const int afrpin=A3;
unsigned long Time;
char timestamp[30];
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
RTC_DS1307 RTC; // define the Real Time Clock object
// for the data logging shield, we use digital pin 10 for the SD cs line
const int chipSelect = 10;
// the logging file
File logfile;
void error(char *str)
{
Serial.print("error: ");
Serial.println(str);
// red LED indicates error
digitalWrite(redLEDpin, HIGH);
while(1);
}
//------------------------------------------------------------------------------
// call back for file timestamps
void dateTime(uint16_t* date, uint16_t* time) {
DateTime now = RTC.now();
// sprintf(timestamp, "%02d:%02d:%02d %2d/%2d/%2d \n", now.hour(),now.minute(),now.second(),now.month(),now.day(),now.year()-2000);
// Serial.println("yy");
// Serial.println(timestamp);
// return date using FAT_DATE macro to format fields
*date = FAT_DATE(now.year(), now.month(), now.day());
// return time using FAT_TIME macro to format fields
*time = FAT_TIME(now.hour()-2, now.minute(), now.second());
}
//------------------------------------------------------------------------------
void setup(void)
{
Serial.begin(115200);
Serial.println();
ss.begin(GPSBaud);
// use debugging LEDs
pinMode(redLEDpin, OUTPUT);
pinMode(greenLEDpin, OUTPUT);
#if WAIT_TO_START
Serial.println("Type any character to start");
while (!Serial.available());
#endif //WAIT_TO_START
// connect to RTC
Wire.begin();
if (!RTC.begin()) {
logfile.println("RTC failed");
#if ECHO_TO_SERIAL
Serial.println("RTC failed");
#endif //ECHO_TO_SERIAL
}
// set date time callback function
SdFile::dateTimeCallback(dateTime);
// initialize the SD card
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(10, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
error("Card failed, or not present");
}
Serial.println("card initialized.");
// create a new file
char filename[] = "AFR00.CSV";
for (uint8_t i = 0; i < 100; i++) {
filename[3] = i/10 + '0';
filename[4] = i%10 + '0';
if (! SD.exists(filename)) {
// only open a new file if it doesn't exist
logfile = SD.open(filename, FILE_WRITE);
break; // leave the loop!
}
}
if (! logfile) {
error("couldnt create file");
}
Serial.print("Logging to: ");
Serial.println(filename);
logfile.println("time; afr; kmph");
#if ECHO_TO_SERIAL
Serial.println("time; afr; kmph");
#endif //ECHO_TO_SERIAL
// If you want to set the aref to something other than 5v
// analogReference(EXTERNAL);
}
int afr = 0;
int afr_alt = 0;
void loop(void)
{
//GPS auslesen
while (ss.available() > 0)
gps.encode(ss.read());
analogRead(afrpin);
int afr = analogRead(afrpin);
//glaetten
afr = (afr + afr_alt)/2;
// fetch the time
Time=millis()/100;
// log time if afr and GPS is valid
if (afr>102 && afr<921 && gps.location.isUpdated())
{
digitalWrite(greenLEDpin, HIGH);
logfile.print('"');
logfile.print(Time);
logfile.print('"');
#if ECHO_TO_SERIAL
Serial.print('"');
Serial.print(Time);
Serial.print('"');
#endif //ECHO_TO_SERIAL
}
smartDelay(500);
//Umrechnungsformeln
double afr_Volt = 5.0 / 1023.0 * (float)afr;
double afr_Wert = (2.3750 * afr_Volt)+7.3125;
afr_alt = afr;
if (afr>102 && afr<921 && gps.location.isUpdated())
{
logfile.print("; ");
logfile.print(afr_Wert);
logfile.print("; ");
#if ECHO_TO_SERIAL
Serial.print("; ");
Serial.print(afr_Wert);
Serial.print("; ");
#endif //ECHO_TO_SERIAL
}
if (afr>102 && afr<921 && gps.location.isUpdated())
{
logfile.println(gps.speed.kmph(), 0);
#if ECHO_TO_SERIAL
Serial.print(gps.speed.kmph(), 0);
Serial.println();
#endif //ECHO_TO_SERIAL
}
digitalWrite(greenLEDpin, LOW);
// Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
// which uses a bunch of power and takes time
if ((millis() - syncTime) < SYNC_INTERVAL) return;
syncTime = millis();
// blink LED to show we are syncing data to the card & updating FAT!
digitalWrite(redLEDpin, HIGH);
logfile.flush();
digitalWrite(redLEDpin, LOW);
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS data received: check wiring"));
digitalWrite(greenLEDpin, LOW);
digitalWrite(redLEDpin, LOW);
}
}
// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (ss.available())
gps.encode(ss.read());
} while (millis() - start < ms);
}