INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP32: Core Panik!
08.09.2019, 21:58 (Dieser Beitrag wurde zuletzt bearbeitet: 08.09.2019 22:23 von achim81.)
Beitrag #1
Question ESP32: Core Panik!
Hallo!

Ich hänge mit meinem ESP32 fest. Ich möchte Daten eines Beschleunigungssensors sammeln und in einer Datei (mit Zeitstempel als Dateiname) abspeichern. Plus Gepiepse und Geleuchte (kein Problem). So weit, so gut...

• Die NTP-Zeit über WLAN zu lesen und dann eine Datei auf der SD-Karte mit dem Zeitstempel als Dateiname abzuspeichern funktioniert als getrenntes Sketch einwandfrei.
• Auch das Sketch mit dem Beschleunigungssensor funktioniert, wenn ich einen fixen Dateinamen verwende. Die Daten werden in die Datei geschrieben, wie ich es will.

Bloß beide Sketches zusammen in einem funktionieren nicht. Das Programm läuft bis zum Aufruf von "calibration" und hängt sich dann auf (also wenn der Dateiname geschrieben werden soll). Verschiedene Fehlermeldungen kommen im seriellen Monitor von "IllegalInstruction" bis "LoadProhibited". Kann mir bitte jemand weiterhelfen?

Nachfolgend der Code...er ist ziemlich lang Dodgy

Code:
// libraries
#include <mySD.h>
#include <EasyBuzzer.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
#include <time.h>
#include <WiFi.h>

// SD card pins
#define MOSI 23
#define MISO 19
#define SCK 18
#define CS 5

// identify the sensor
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

// variables
// leds
const int ledBluePin = 17;
const int ledYellowPin = 16;
const int ledGreenPin = 4;
// buzzer
const int buzzerPin = 2;
// Wifi credentials
const char* ssid       = "Jacks WLAN 2.4 GHz";
const char* password   = "81012900";
const char* ntpServer = "de.pool.ntp.org";
const long  gmtOffset_sec = 3600;
const int   daylightOffset_sec = 3600;
int second;
String minute;
String hour;
String day;
String month;
int year;
int weekday;
long current;
struct tm timeinfo;
// touch sensor pins and threshold values
#define touch_pin_number 15
const int VALUE_THRESHOLD = 30;
int TOUCH_SENSOR_VALUE;
// WiFiUDP ntpUDP;
// NTPClient timeClient(ntpUDP);
int runtime;

String f;
const char* filename;

File root;

void setup() {
  Serial.begin(115200);
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");

  // Print local IP address
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }

  second = timeinfo.tm_sec;
  minute = timeinfo.tm_min;
  hour = timeinfo.tm_hour;
  day = timeinfo.tm_mday;
  month = timeinfo.tm_mon + 1;
  year = timeinfo.tm_year + 1900;
  weekday = timeinfo.tm_wday + 1;

  String f = month + day + hour + minute + ".txt";
  char filename[f.length()];
  f.toCharArray(filename, f.length() + 1); //convert String into char array

  // Initialise the ADXL345 sensor
  if (!accel.begin())
  {
    /* There was a problem detecting the ADXL345 ... check your connections */
    Serial.println("No ADXL345 detected!");
    while (1);
  }

  // buzzer
  EasyBuzzer.setPin(buzzerPin);

  // define ledpins as set on OUTPUT mode
  pinMode (ledGreenPin, OUTPUT);
  pinMode (ledYellowPin, OUTPUT);
  pinMode (ledBluePin, OUTPUT);

  Serial.print("Initializing SD card...");
  /* initialize SD library with SPI pins */
  if (!SD.begin(CS, MOSI, MISO, SCK)) {
    Serial.println("initialization failed!");
    errorled();
    return;
  }
  Serial.println("initialization done.");
  readyRoutine();
}

void readyRoutine() {
  digitalWrite (ledGreenPin, HIGH);
  TOUCH_SENSOR_VALUE = touchRead(touch_pin_number);
  Serial.println(TOUCH_SENSOR_VALUE);
  if (TOUCH_SENSOR_VALUE < VALUE_THRESHOLD)
  {
    EasyBuzzer.beep(1800, 1);
    delay(500);
    EasyBuzzer.stopBeep();
    digitalWrite (ledGreenPin, LOW);
    calibration();
  }
  else
    readyRoutine();
}

void calibration() {
  digitalWrite (ledYellowPin, HIGH);
  root = SD.open(filename, FILE_WRITE);
  if (root) {
    root.print(year);
    root.print("-");
    root.print(month);
    root.print("-");
    root.print(day);
    root.println();
    root.print(hour);
    root.print(":");
    root.print(minute);
    root.println();
    root.print("calibration");
    root.println();
    uint32_t period = 5000L;       // 5 secs
    runtime = micros();
    for ( uint32_t tStart = millis();  (millis() - tStart) < period;  ) {
      // read a new sensor event
      root.print(micros() - runtime);
      root.print(" ");
      sensors_event_t event;
      accel.getEvent(&event);
      root.print(event.acceleration.x);
      root.print("00 ");
      root.print(event.acceleration.y);
      root.print("00 ");
      root.print(event.acceleration.z);
      root.print("00 ");
      root.println();
    }
    /* close the file */
    root.close();

    EasyBuzzer.beep(1800, 2);
    delay(500);
    EasyBuzzer.stopBeep();
    delay(500);
    EasyBuzzer.beep(1800, 2);
    delay(500);
    EasyBuzzer.stopBeep();
    digitalWrite (ledYellowPin, LOW);

    collectingData();
  }
  else {
    /* if the file open error, print an error */
    Serial.println("error opening file");
    errorled();
  }
}


void collectingData() {
  digitalWrite (ledBluePin, HIGH);
  root = SD.open(filename, FILE_WRITE);
  if (root) {
    root.print("movement data");
    root.println();
    uint32_t period = 10000L;       // 10 secs
    runtime = micros();
    for ( uint32_t tStart = millis();  (millis() - tStart) < period;  ) {
      // read a new sensor event
      root.print(micros() - runtime);
      root.print(" ");
      sensors_event_t event;
      accel.getEvent(&event);
      root.print(event.acceleration.x);
      root.print("00 ");
      root.print(event.acceleration.y);
      root.print("00 ");
      root.print(event.acceleration.z);
      root.print("00 ");
      root.println();
    }
    /* close the file */
    root.close();

    EasyBuzzer.beep(1800, 3);
    EasyBuzzer.stopBeep();
    digitalWrite (ledBluePin, LOW);
  }
  else {
    /* if the file open error, print an error */
    Serial.println("error opening file");
  }

}

void errorled() {
  uint32_t period = 5000L;       // 5 secs
  runtime = micros();
  for ( uint32_t tStart = millis();  (millis() - tStart) < period;  ) {
    digitalWrite (ledGreenPin, HIGH);
    digitalWrite (ledYellowPin, HIGH);
    digitalWrite (ledBluePin, HIGH);
    delay(200);
    digitalWrite (ledGreenPin, LOW);
    digitalWrite (ledYellowPin, LOW);
    digitalWrite (ledBluePin, LOW);
    delay(200);
  }
  setup();
}

void loop() {
  EasyBuzzer.update();
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.09.2019, 22:07
Beitrag #2
RE: ESP32: Core Panik!
Stelle Deinen Sketch bitte in Codetags. So ist er auch auf portablen Geräten lesbar.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.09.2019, 22:23
Beitrag #3
RE: ESP32: Core Panik!
(08.09.2019 22:07)Tommy56 schrieb:  Stelle Deinen Sketch bitte in Codetags. So ist er auch auf portablen Geräten lesbar.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Erledigt, dankeschön!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2019, 06:07
Beitrag #4
RE: ESP32: Core Panik!
Code:
void setup() {
  ........
  String f = month + day + hour + minute + ".txt";
  char filename[f.length()];
  f.toCharArray(filename, f.length() + 1); //convert String into char array
  ..........
}

Was denkst du, wird hier getan?



Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2019, 06:11
Beitrag #5
RE: ESP32: Core Panik!
(09.09.2019 06:07)Fips schrieb:  
Code:
void setup() {
  ........
  String f = month + day + hour + minute + ".txt";
  char filename[f.length()];
  f.toCharArray(filename, f.length() + 1); //convert String into char array
  ..........
}

Was denkst du, wird hier getan?



Gruß Fips

Ähm - ein String in ein Char umgewandelt? mySD.h verlangt nach einem char als Dateiname...isoliert in einem anderen Sketch funkioniert dieser Trick einwandfrei!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2019, 06:13 (Dieser Beitrag wurde zuletzt bearbeitet: 09.09.2019 08:37 von Fips.)
Beitrag #6
RE: ESP32: Core Panik!
Informiere dich über den Geltungsbereich von Variablen (Scope)!

Gruß Fips

(09.09.2019 06:11)achim81 schrieb:  ...isoliert in einem anderen Sketch funkioniert dieser Trick einwandfrei!

Den Trick finde ich dirty!

Ich habe keine Ahnung von SD-Karte, da ich alle Dateien im Spiffs des Esp32 speichere.

Das erzeugen des Dateinamen dürfte aber gleich sein.

Wenn es unbedingt mit String sein soll kannst du auch direkt auf den internen String-Puffer zugreifen.
Code:
String minute = "11";
String hour = "6";
String day = "3";
String month = "4";
String filename = month + day + hour + minute + ".txt";
Serial.println(filename);   // Ausgabe: 43611.txt
root = SD.open(filename.c_str(), FILE_WRITE);

Funktion c_str()

Besser wäre es, es ohne den Umweg über die String Verkettung zu machen.
Code:
byte minute {11};
byte hour {6};
byte day {3};
byte month {4};
char filename[16];
snprintf(filename, sizeof(filename), "%02d.%02d_%02d:%02d.txt", day, month, hour, minute);
Serial.println(filename);   // Ausgabe: 03.04_06:11.txt
root = SD.open(filename, FILE_WRITE);

snprintf und die Formatierung


Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2019, 11:19
Beitrag #7
RE: ESP32: Core Panik!
(09.09.2019 06:13)Fips schrieb:  Informiere dich über den Geltungsbereich von Variablen (Scope)!

[...]

Wenn es unbedingt mit String sein soll kannst du auch direkt auf den internen String-Puffer zugreifen.

[...]

Besser wäre es, es ohne den Umweg über die String Verkettung zu machen.

[...]

Vielen Dank für deine präzisen Ausführungen, Fips!

Bezüglich scope: Grundsätzlich verstanden, ok ;-)
Aber auch, wenn ich die Definition der Variablen, die Verkettung und die Umwandlung in derselben Funktion durchführe, hängt sich der ESP32 auf...

Bezüglich Verkettung: Ich verstehe dein Beispiel, aber nicht wie ich die Zeit mit ins Spiel bringen kann. Ich benutze als Inhalt der Variablen eben die Zeit und kann den Strings dadurch keine fixen Zahlen zuweisen. Du hast den Variablen aber 11, 6, 3 und 4 zugewiesen. Habe ich da etwas missverstanden?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2019, 11:26
Beitrag #8
RE: ESP32: Core Panik!
Es war ein Beispiel, um keinen kompletten Sketch mit ntp Zeit für die Serielle Ausgabe verwenden zu müssen.

Code:
snprintf(filename, sizeof(filename), "%02d.%02d_%02d:%02d.txt", timeinfo.tm_mday, timeinfo.tm_mon + 1, timeinfo.tm_hour, timeinfo.tm_min);

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP32 Upload ohne Bootknopf ?? wwilhelm 6 222 25.01.2020 19:46
Letzter Beitrag: wwilhelm
  Speicherprobleme auf dem ESP32 biologist 0 99 24.01.2020 11:18
Letzter Beitrag: biologist
  ESP32 Firmware Anfänger Frage 1971 2 247 20.01.2020 12:25
Letzter Beitrag: 1971
  ESP32-WROVER-B OV2640 Starthilfe Falke07 17 528 19.01.2020 18:09
Letzter Beitrag: amithlon
  ESP32 Debugger JTAG shrimps 0 139 17.01.2020 11:43
Letzter Beitrag: shrimps
  ESP32 deepsleep Stromverbraucch Thomas_01 22 795 17.01.2020 08:21
Letzter Beitrag: derdemo
  ESP32 Grundlagen rdangel 5 681 14.01.2020 16:53
Letzter Beitrag: amithlon
  microSD Slot on Esp32 TechnikerHannes 29 1.865 14.01.2020 14:15
Letzter Beitrag: biologist
  Wetterstation ESP32 heli-freak66 3 372 05.01.2020 17:35
Letzter Beitrag: Tommy56
  ESP32 Uhr Cyborman 8 730 01.01.2020 22:43
Letzter Beitrag: Cyborman

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste