Januar 2024

Noch mehr Codes!

Im letzten Dezember-Blogbeitrag habe ich mich näher mit der GPS-Antenne beschäftigt und den Code für den GPS-Sensor veröffentlicht. In diesem Blogbeitrag werde ich mehrere Codes veröffentlichen und auf das SD-Kartenmodul näher eingehen.

Zuerst habe ich die Platine nach dem Plan aus dem letzten Blogeintrag neu gelötet. Danach habe ich mich um den Code des Schock-Sensors gekümmert, der dann später in den abschließenden Code eingefügt wird. Der Schock-Sensor-Code ist ein einfacher Auslese-Code (digitalRead).

Schock-Sensor-Code:

int pin = 5;

void setup() {

  Serial.begin(9600);

  pinMode(pin, INPUT);

}

void loop() {

  Serial.println(digitalRead(pin));

}

Der Code legt in der ersten Phase eine Datei an („datalog.txt“), in dem die Messdaten gespeichert werden sollen. Im untenstehenden Code wird beispielsweise das Word „Hi“ sekundenweise auf die SD-Karte geschrieben. Diese Datei wird anschließend geschlossen. Das SD-Kartenmodul wird über die 3,3 Volt-Versorgung betrieben, da das SD-Kartenmodul am 5V-Pin nicht keine Verbindung besitzt (Abbildung 1 SD-Kartenmodul Verbindungen).

SD-Kartenmodul-Code:

#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.

Zusammenschluss aller Codes:

#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);

}

}