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
  Debug mit Telnet ESP8266 (und ESP32 ungetestet)) Tommy56 7 4.395 07.09.2019 14:11
Letzter Beitrag: ardu_arne
  ESP32-CAM Projekt MINICAM Maico 11 1.530 22.08.2019 22:03
Letzter Beitrag: Maico
  ESP32 - Schreibzyklen im RTC RAM Hoffmakl 5 514 22.08.2019 21:07
Letzter Beitrag: Tommy56
  ESP32 mit MAX7219 --> Programmlogik, ich verstehe es nicht... tho.schmidt 4 688 10.08.2019 16:43
Letzter Beitrag: Fips
  ESP32 MQTT Ausfall nach 201 Minuten Jan Hirt 9 1.587 06.08.2019 18:31
Letzter Beitrag: Tommy56
  ESP32 Hostname für die Anzeige im Router ändern Tommy Rakete 4 1.192 17.07.2019 21:42
Letzter Beitrag: Tommy56
  ESP32 Devboard mit Laderegler? markusw129 4 945 14.07.2019 17:33
Letzter Beitrag: Tommy56
  ESP32 Analog Wert am Spannungsteiler ungenau vs Arduino Analog Wert Nick2245 1 714 16.06.2019 09:01
Letzter Beitrag: Fips
  ESP32: U8x8 und SoftwareSerial gleichzeitig markusw129 2 703 15.06.2019 12:06
Letzter Beitrag: markusw129
  ESP32 Webserver download mehrerer Dateien Eisvogel 1 442 11.06.2019 10:42
Letzter Beitrag: Tommy56

Gehe zu:


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