#include <SD.h> //include SD module library
#include <SPI.h>
#define chipSelect 4 //define CS pin
void setup(){
// Open serial communications and wait for port to open:
Serial.begin(9600);
// wait for Serial Monitor to connect. Needed for native USB port boards only:
while (!Serial){
Serial.print("no serial port");
};
Serial.print("Initializing SD card...");
while (!SD.begin(chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("1. is a card inserted?");
Serial.println("2. is your wiring correct?");
Serial.println("3. did you change the chipSelect pin to match your shield or module?");
Serial.println("Note: press reset button on the board and reopen this Serial Monitor after fixing your issue!");
}
}
void loop()
{
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// Es wird Hy in die datei geschrieben
dataFile.println("Hi ");
dataFile.close();
//Ausmessen der Länge der Datafile
dataFile = SD.open("datalog.txt", FILE_READ);
int lange = dataFile.available();
//Serial.print(lange);
//Auslesen der Datei
for (int i=0; i<lange;i++){
// Die ausgelesene Zeile in Byte angegeben
byte Zahl = dataFile.read();
Serial.print(Zahl);
}
Serial.print("\n");
dataFile.close();
delay(1000);
}
Nachdem alle einzelnen Codes getestet wurden und funktionieren, habe ich einen neuen Code geschrieben, der alle in ein Programm zusammenschließt.
Als Erstes habe ich alle Bibliotheken in den Code eingefügt und bestimmt, welche Kommunikations-Pins von den beiden Sensoren und dem SD-Kartenmodul genutzt werden.
Im setup() wird die Baudrate für die serielle Kommunikationsrate am Softserial festgelegt und die Bibliotheken werden aktiviert.
In der loop() habe ich dann den Hauptteil geschrieben und die Codes aneinandergereiht. Als Erstes habe ich im Code das SD-Kartenmodul eine Datei anlegen lassen („datalog.txt“). Das SD-Kartenmodul fragt den GPS-Sensor nur ab, wenn der Schocksensor ausgelöst wird und diese Daten werden dann in einer Tabelle gespeichert. Sie besteht aus den Längen- und Breitengraden, den Schockwert, sowie den Zeitpunkt an dem die Daten ermittelt wurden.
Dann habe ich den Code optimiert und habe noch zwei SOS-Signale per ESP-LED auf dem ESP als Absicherung eingebunden. Dadurch kann ich optisch sehen, dass der Code funktioniert oder kann sehen wo der Fehler aufgetreten ist.
Da sowohl die Aufnahme der Schockwerte als auch die GPS-Werte sowie das Abspeichern jetzt funktioniert, gehe ich in die Testphase über. Dazu mehr in meinem nächsten Blogbeitrag.
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <SD.h> //include SD module library
#include <SPI.h>
#define chipSelect 4 // GPIO15 Ändern für Testfahrt
TinyGPS gps;
// SoftwareSerial(rxPin, txPin, inverse_logic)
//0 2 fur esp8266
SoftwareSerial ss(2, 0);
int pin = 5;
unsigned long chars;
unsigned short sentences, failed;
float flat, flon;
unsigned long age;
String filename = "datalog.txt";
void setup()
ss.begin(9600);
}
pinMode(pin, INPUT);
}
pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output
/*Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();*/
// Open serial communications and wait for port to open:
//Serial.begin(9600);
// wait for Serial Monitor to connect. Needed for native USB port boards only:
while (!SD.begin(chipSelect)) {
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED on (Note that LOW is the voltage level
delay(500);
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
delay(500); // Wait for a half second
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED on (Note that LOW is the voltage level
delay(500);
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
delay(500); // Wait for a half second
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED on (Note that LOW is the voltage level
delay(1000); // Wait for one seconds (to demonstrate the active low LED)
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note
delay(2000);
/*Serial.println("initialization failed. Things to check:");
Serial.println("1. is a card inserted?");
Serial.println("2. is your wiring correct?");
Serial.println("3. did you change the chipSelect pin to match your shield or module?");
Serial.println("Note: press reset button on the board and reopen this Serial Monitor after fixing your issue!");*/
void loop(){
int var=digitalRead(pin);
if (var>0){
bool newData = false;
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (ss.available())
{
char c = ss.read();
//Serial.write(c); // uncomment this line if you want to see the GPS data flowing
if (gps.encode(c)){ // Did a new valid sentence come in?
newData = true;
}
}
}
if (newData){
gps.f_get_position(&flat, &flon, &age);
flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat;
flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon;
//Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
//Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
// Serial.println();
}
gps.stats(&chars, &sentences, &failed);
/*Serial.print(" CHARS=");
Serial.print(chars);
Serial.print(" SENTENCES=");
Serial.print(sentences);
Serial.print(" CSUM ERR=");
Serial.println(failed);*/
if (chars == 0){
//Serial.println("** No characters received from GPS: check wiring **");
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED on (Note that LOW is the voltage level
delay(500);
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
delay(500); // Wait for a half second
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED on (Note that LOW is the voltage level
delay(500);
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
delay(500); // Wait for a half second
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED on (Note that LOW is the voltage level
delay(500);
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
delay(500); // Wait for a half second
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off by making the voltage HIGH
delay(1000); // Wait for one seconds (to demonstrate the active low LED)
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note
delay(2000);
}
File dataFile = SD.open(filename, FILE_WRITE);
// Es wird Hy in die datei geschrieben.
char buffer[50];
sprintf(buffer, "%.6f %.6f %ld %i %i", flat, flon, age, failed, var);
dataFile.println (buffer);
dataFile.close();
}
//delay(1000);
}
}