Hallo zusammen,
leider habe ich ein riesiges Problem mit Arduino. Aus irgendwelchen Gründen kann ich keinen Sketch mehr auf mein Board (senseBox; ARM Cortex-M0+ Prozessor aus der SAM D21 Familie von Microchip) hochladen. Zunächst hatte alles reibungslos funktioniert. Den Sketch hatte ich auch in dieser Weise schon auf meinem Board ohne Probleme laufen. Ich habe bereits etliche Male Arduino vollständig deinstalliert (auch alle Ordner/Konfigurationen mitgelöscht), meinen Mac mehrfach neu gestartet sowie verschiedene USB-Kabel ausprobiert, leider ohne Erfolg. Ich hänge mal meinen Sketch und die aktuellen Fehlermeldungen an. Wenn mir damit jemand helfen könnte, wäre ich unendlich dankbar.
Im Voraus schon einmal vielen lieben Dank!!
Fehler beim Hochladen des Sketchs:
Der Sketch verwendet 65212 Bytes (24%) des Programmspeicherplatzes. Das Maximum sind 262144 Bytes.
Globale Variablen verwenden 7640 Bytes des dynamischen Speichers.
Erzwinge Reset durch öffnen/schließen mit 1200 bps auf dem Port /dev/cu.usbmodem101
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
PORTS {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } / {/dev/cu.usbmodem101, /dev/cu.wlan-debug, /dev/tty.usbmodem101, /dev/tty.wlan-debug, } => {}
Uploading using selected port: /dev/cu.usbmodem101
/Users/USERNAME/Library/Arduino15/packages/arduino/tools/bossac/1.7.0-arduino3/bossac -i -d --port=cu.usbmodem101 -U true -i -e -w -v /var/folders/dj/mfcb5zcs6hg_bp36xw87lsc80000gn/T/arduino_build_424472/Programmcode_Mexico.ino.bin -R
No device found on cu.usbmodem101
Set binary mode
Beim Hochladen des Sketches ist ein Fehler aufgetreten
Send auto-baud
Set binary mode
Fehler beim Kompilieren des Sketchs:
/Users/USERNAME/Desktop/Sketch_International/Programmcode_Mexico/Programmcode_Mexico.ino: In function 'void submitValues()':
/Users/USERNAME/Desktop/Sketch_International/Programmcode_Mexico/Programmcode_Mexico.ino:175:14: warning: unused variable 'c' [-Wunused-variable]
char c = client.read();
^
In file included from /Users/USERNAME/Library/Arduino15/packages/arduino/hardware/samd/1.8.14/cores/arduino/api/String.h:33:0,
from /Users/USERNAME/Library/Arduino15/packages/arduino/hardware/samd/1.8.14/cores/arduino/api/IPAddress.h:24,
from /Users/USERNAME/Library/Arduino15/packages/arduino/hardware/samd/1.8.14/cores/arduino/api/ArduinoAPI.h:30,
from /Users/USERNAME/Library/Arduino15/packages/arduino/hardware/samd/1.8.14/cores/arduino/Arduino.h:23,
from sketch/Programmcode_Mexico.ino.cpp:1:
/Users/USERNAME/Library/Arduino15/packages/arduino/hardware/samd/1.8.14/cores/arduino/api/deprecated-avr-comp/avr/pgmspace.h:65:35: warning: 'char* strcpy(char*, const char*)' writing 25 bytes into a region of size 24 overflows the destination [-Wstringop-overflow=]
#define strcpy_P(dest, src) strcpy((dest), (src))
~~~~~~^~~~~~~~~~~~~~~
/Users/USERNAME/Desktop/Sketch_International/Programmcode_Mexico/Programmcode_Mexico.ino:145:3: note: in expansion of macro 'strcpy_P'
strcpy_P(_server, server);
^~~~~~~~
Mein Sketch:
#include <senseBoxIO.h> // Bibliothek für Microcontroller der senseBox (ARM Cortex-M0+ Prozessor, SAM D21 von Microchip)
#include <SPI.h> // Bibliothek für die SPI-Kommunikation
#include <Wire.h> // Bibliothek für die I2C-Kommunikation
#include <Adafruit_GFX.h> // Grafikbibliothek für Displays (http://librarymanager/All#Adafruit_GFX_Library)
#include <Adafruit_SSD1306.h> // Bibliothek für SSD1306 OLED-Displays (http://librarymanager/All#Adafruit_SSD1306)
#include <WiFi101.h> // Bibliothek für die WiFi101-Kommunikation
#include <Adafruit_HDC1000.h> // Bibliothek für den HDC1000-Temperatur- und Feuchtigkeitssensor (http://librarymanager/All#Adafruit_HDC1000_Library)
#include <SdsDustSensor.h> // Bibliothek für den Feinstaubsensor
#include <VEML6070.h> // Bibliothek für den Lux-/UV-Sensor
//Zusammenfassung der Bitmap-Array
#include "Bibliothek_Bitmap.h" //Bitmaps in eigene Datei ausgelagert, um Code übersichtlicher zu halten
//Variablen: WLAN
char ssid[] = "TEST"; //Netzwerkname (SSID)
char pass[] = "TEST!"; //Netzwerkpasswort
int status = WL_IDLE_STATUS; //Status der WLAN-Verbindung wird in Variable "status" gespeichert
//Variablen: Senden der Messdaten
const long intervalInterval = 12000;
long time_startInterval = 0;
long time_actualInterval = 0;
//Variablen: Display initialisierung
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_HDC1000 hdc = Adafruit_HDC1000();
//Variablen: Sensor IDs / senseBox ID / Serveradresse: OpenSenseMap
const char SENSOR_IDD57[] PROGMEM = "KEY";
const char SENSOR_IDD58[] PROGMEM = "KEY";
const char SENSOR_IDD5C[] PROGMEM = "KEY";
const char SENSOR_IDD5B[] PROGMEM = "KEY";
const char SENSOR_IDD5D[] PROGMEM = "KEY";
const char SENSOR_IDD5A[] PROGMEM = "KEY";
static const uint8_t NUM_SENSORS = 6;
const char SENSEBOX_ID [] PROGMEM = "KEY";
const char server [] PROGMEM ="WEB";
//Variablen: Struktur der Messdaten
typedef struct measurement {
const char *sensorId;
float value;
} measurement;
char buffer[750]; //Zwischenspeicherung der Messdaten
measurement measurements[NUM_SENSORS]; //Sammlung von Messungen
uint8_t num_measurements = 0; //Anzahl der Messungen
const int lengthMultiplikator = 35; //Maximale Länge
//Struktur zur Darstellung der Messdaten auf dem Display - Spezifizierung der Funktion "printOnDisplay"
void printOnDisplay(String title1, String measurement1, String unit1, String title2, String measurement2, String unit2) {
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.println(title1);
display.setCursor(0, 10);
display.setTextSize(2);
display.print(measurement1);
display.print(" ");
display.setTextSize(1);
display.println(unit1);
display.setCursor(0, 30);
display.setTextSize(1);
display.println(title2);
display.setCursor(0, 40);
display.setTextSize(2);
display.print(measurement2);
display.print(" ");
display.setTextSize(1);
display.println(unit2);
}
////Initialisierung von Sensoren
//Feinstaub-Sensor
SdsDustSensor sds(Serial1); //Initialisiert Sensor an Serial1 (Anschluss)
float getPmData(int type) {
PmResult pm = sds.queryPm(); //Abrufen Feinstaubwerte aus Sensor und Abspeichern als Variable
if (pm.isOk()) {
if (type == 25) { //wenn Messwerten PM2.5 entsprechen
return pm.pm25;
} else if (type == 10) { //wenn Messwerten PM10 entsprechen
return pm.pm10;
}
}
return 0; //wenn weder PM2.5 oder PM10
}
//Lux- bzw. UV-Sensor
VEML6070 veml;
//Schallpegel
float getSoundValue() {
float v = analogRead(1) * (3.3 / 1024.0); //misst Spannung an Pin1 und konventiert diesen Wert in eine Spannung zwischen 0 - 3,3V
float decibel = v * 50; //skaliert Wert um Schallpegel-Schätzung zu erhalten
return decibel; //gibt berechneten Schallpegel aus
}
//Initialisierung des WLAN-Client
WiFiClient client;
////Übertragen der Daten an KARTE
//Defintion der Funktion "addMeasurements"
void addMeasurement(const char *sensorId, float value) { //fügt eine neue Messung zum Array measurements hinzu
measurements[num_measurements].sensorId = sensorId; //sensorId miteinbeziehen
measurements[num_measurements].value = value; //Messwert miteinbeziehen
num_measurements++; //wenn eine Messung hinzugefügt wird, wird Wert "num_measurements" um +1 erhöht!
}
///Vorbereiten des Client
void writeMeasurementsToClient() { //Überträgt die gespeicherten Messungen an den Client
// Iteration durch das measurements-Array
for (uint8_t i = 0; i < num_measurements; i++) {
sprintf_P(buffer, PSTR("%s,%9.2f\n"), measurements[i].sensorId,
measurements[i].value);
// Sende den Buffer (zwischengespeicherte Messwerte) an den Client
client.print(buffer);
}
//Setze num_measurements bzw. zwischengespeicherte Messwerte zurück
num_measurements = 0; //Notiz: Variable vom Typ "uint8_t"
}
// Wenn die Verbindung erfolgreich ist, werden die Messungen gesendet und auf eine Antwort des Servers gewartet.
// Bei Verbindungsfehlern wird das System zurückgesetzt.
void submitValues() {
//Notiz: "!=" bedeutet: wenn WiFi.status (WLAN Status) nicht gleich WL_Connected (WLAN verbunden) ist, dann in 1 und 5 Sekunden erneuten Verbindungsaufbau starten
if (WiFi.status() != WL_CONNECTED) {
WiFi.disconnect();
delay(1000); // Warte 1 Sekunde
WiFi.begin(ssid, pass);
delay(5000); // Warte 5 Sekunden
}
// Schließe bestehende Verbindung zum Client
if (client.connected()) {
client.stop();
delay(1000);
}
bool connected = false;
char _server[strlen_P(server)];
strcpy_P(_server, server);
// Versuche, eine Verbindung zum Server herzustellen (mehrmals)
for (uint8_t timeout = 2; timeout != 0; timeout--) {
Serial.println(F("connecting..."));
connected = client.connect(_server, 80); //HTTP-Port 80
if (connected == true) {
//Darstellung der HTTP POST-Anfrage
sprintf_P(buffer,
PSTR("POST /boxes/%s/data HTTP/1.1\nAuthorization: f3b4a009ca86857126b55af500d5612d3218c9c0be2f313e4de00d6c8620086f\nHost: %s\nContent-Type: "
"text/csv\nConnection: close\nContent-Length: %i\n\n"),
SENSEBOX_ID, server, num_measurements * lengthMultiplikator);
// Sende die HTTP POST-Anfrage
client.print(buffer);
// Sende die Messungen
writeMeasurementsToClient();
// Sende eine leere Zeile, um die Anfrage zu beenden
client.println();
uint16_t timeout = 0;
// Warte auf eine Antwort vom Server
while (timeout <= 5000) {
delay(10);
timeout = timeout + 10;
if (client.available()) {
break;
}
}
// Verarbeite die empfangenen Daten (falls vorhanden)
while (client.available()) {
char c = client.read();
// Wenn die Verbindung unterbrochen wird, stoppe den Client
if (!client.connected()) {
client.stop();
break;
}
}
// Setze num_measurements zurück
num_measurements = 0;
break;
}
delay(1000);
}
// Bei erfolgloser Verbindung, warte und starte das System neu
if (connected == false) {
delay(5000);
noInterrupts();
NVIC_SystemReset();
while (1)
;
}
}
void setup() {
// Starte den seriellen Monitor mit 9600 Baud (Baudrate = Übertragungsrate; 9600 Signalwechsel pro Sekunde)
Serial.begin(9600);
delay(500);
//Anzeige: Humboldt Explorers Logo
display.drawBitmap(0, 0, bitmaphe, 128, 64, WHITE); //Anzeigen eines Bitmap-Array, Position 0, 0 also linke obere Ecke; "bitmaphe" Varibale zu Bitmap-Array; Displaygröße: 128x64 Pixel, Pixelfarbe: weiß)
display.display(); //Anzeigen des Bitmap-Bilds auf dem OLED-Display
delay(5000); // Pause bzw. Anzeigedauer für 5 Sekunden
display.clearDisplay(); //Löscht den Inhalt des Displays nach der Pause
//Anzeige: HE - Warte auf Netzwerkverbindung [...]
display.drawBitmap(0, 0, Warte_Auf_Netzwerk, 128, 64, WHITE);
display.display();
delay(3000); // Pause bzw. Anzeigedauer für 3 Sekunden
display.clearDisplay();
////Aufbau einer Netzwerkverbindung
//Überprüfen ob Wifi-Shield (Hardware) vorhanden ist
if (WiFi.status() == WL_NO_SHIELD) { //wenn kein WiFi-Shield (Hardware) vorhanden ist, stopt das Programm an dieser Stelle und geht in eine Endlosschleife über
while (true); //Endlosschleife
}
//Versuche, WLAN Verbindung herzustellen
while (status != WL_CONNECTED) { //Endlosschleife: Verbindungsbesuche bis WLAN-Verbindung hergestellt wurrde
status = WiFi.begin(ssid, pass); //nutzt die Variablen "ssid" und "pass" (wurden zu Beginn des Programmcodes definiert)
delay(5000);
}
// WLAN erfolgreich verbunden oder nicht
if (WiFi.status() == WL_CONNECTED) { //wenn WLAN-Verbindung hergestellt wurde, folgendes Bitmap-Array auf dem Display anzeigen
display.drawBitmap(0, 0, Verbindung_Hergestellt, 128, 64, WHITE);
display.display();
delay(3000);
display.clearDisplay();
} else { //wenn keine WLAN-Verbindung möglich ist, folgendes Bitmap-Array auf dem Dispaly anzeigen
display.drawBitmap(0, 0, Verbindung_Nicht_Hergestellt, 128, 64, WHITE);
display.display();
delay(3000);
display.clearDisplay();
}
////Initialisierung der Sensoren
//Anzeige: Initialisierung der Sensoren
display.drawBitmap(0, 0, Starte_Messungen, 128, 64, WHITE);
display.display();
delay(3000);
display.clearDisplay();
//Starten der Sensoren - Startzeitpunkt der Messungen
hdc.begin(); //Temperatur-/Luftfeuchtigkeit (HDC1080 Sensor-Modul)
sds.begin(); //Feinstaubsensor (SDS011 Sensor-Modul)
sds.setQueryReportingMode(); //Festlegen des Abfragemodus
veml.begin(); //Lux- bzw. UV-Sensor (VEML6070)
//Zurücksetzen des Displays (sodass "Anzeige: Initalisierung der Sensoren" nicht mehr angezeigt wird
display.clearDisplay();
}
void loop() {
//Speichert den aktuellen Zeitpunkt in der Variable time_startInterval
time_startInterval = millis();
////Anzeigen der Messwerte auf dem OLED-Display
//Temperatur und Luftfeuchtigkeit anzeigen
for (int i = 1; i <= 10; i += 1) { //Messwerte werden 10-mal aktualisiert
//Die Funktion "printOnDisplay" wurde zu Beginn des Programmcodes genauer spezifiziert
printOnDisplay("Temperatur", String(hdc.readTemperature()), "Celsius", "Luftfeuchtigkeit", String(hdc.readHumidity()), "Prozent");
display.display();
}
display.clearDisplay();
delay(2000);
//Feinstaubwerte anzeigen
for (int i = 1; i <= 10; i += 1) { //Messwerte werden 10-mal aktualisiert
printOnDisplay("Feinstaub PM2.5", String(getPmData(25)), "ug/cm3", "Feinstaub PM10", String(getPmData(10)), "ug/cm3");
display.display();
}
display.clearDisplay();
delay(2000);
//Schallpegel und UV-Licht anzeigen
for (int i = 1; i <= 10; i += 1) { //Messwerte werden 10-mal aktualisiert
printOnDisplay("Lautstärke", String(getSoundValue()), "Dezibel", "UV-Licht", String(veml.getUV()), "uW/cm2");
display.display();
}
display.clearDisplay();
delay(2000);
////Überprüft, ob die WLAN-Verbindung weiterhin besteht, bevor die Übertragung der Messwerte erfolgt
//Abfrage des aktuellen WLAN-Status
if (WiFi.status() != WL_CONNECTED) {
// Anzeige auf dem Display, dass die Netzwerkverbindung unterbrochen ist
display.setCursor(0, 0); //Textposition auf OLED-Display
display.setTextSize(1); //Textgröße (möglich: 1 bis 4)
display.setTextColor(WHITE, BLACK); //Textfarbe: weiße Schrift auf schwarzem Hintergrund
display.println("Netzwerkverbindung verloren, versuche erneut zu verbinden..."); //Anzeige auf dem OLED-Display
delay(2000);
display.display();
//"Serial.println": Anzeige im seriellen Monitor (nicht auf dem OLED-Display)
Serial.println("Netzwerkverbindung verloren, versuche erneut zu verbinden...");
WiFi.disconnect();
delay(1000); // Warten, bevor ein neuer Verbindungsversuch gestartet wird
WiFi.begin(ssid, pass); // WLAN-Verbindung erneut aufbauen
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 10) { //maximal 10 Verbindungsversuche
delay(500); // Warten, bevor der WLAN-Status erneut überprüft wird
attempts++; //erhöht den Wert "attempts" um 1 (wenn 10 Versuche gestartet wurden, stoppt die Schleife)
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WLAN-Verbindung erfolgreich wiederhergestellt!");
// Anzeige auf dem OLED-Display, dass die Verbindung erfolgreich wiederhergestellt wurde
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.println("WLAN-Verbindung erfolgreich wiederhergestellt!");
display.display();
delay(2000);
display.clearDisplay();
} else {
Serial.println("Fehler: WLAN-Verbindung konnte nicht wiederhergestellt werden.");
// Anzeige auf dem OLED-Display, dass die Verbindung nicht wiederhergestellt werden konnte
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.println("Fehler: WLAN-Verbindung konnte nicht wiederhergestellt werden.");
display.display();
delay(2000);
display.clearDisplay();
return; // Beenden der loop(), da Programm ohne WLAN-Verbindung nichts fortfahren kann
}
}
////Überprüfen und Senden der Messdaten an KARTE
//Wenn die aktuelle Zeit größer ist als der Startzeitpunkt plus das Intervall (12000ms), aktualisiere die Zeit des letzten Ereignisses
if (time_startInterval > time_actualInterval + intervalInterval) {
time_actualInterval = millis();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.println("Sende Messdaten an KARTE ...");
display.display();
//Festlegen der Messwerte, welche an die KARTE übertragen werden sollen
//"addMeasurement" wurde zu Beginn des Programmcodes definiert
addMeasurement(SENSOR_IDD57, hdc.readTemperature());
addMeasurement(SENSOR_IDD58, hdc.readHumidity());
addMeasurement(SENSOR_IDD5C, getPmData(25));
addMeasurement(SENSOR_IDD5B, getPmData(10));
addMeasurement(SENSOR_IDD5D, getSoundValue());
addMeasurement(SENSOR_IDD5A, veml.getUV());
//Senden der Messdaten an die KARTE - Es erfolgen maximal drei Verbindungsversuche
//legt fest, man bei 0 Versuchen startet (wird durch "attempts++" um +1 nach jedem erfolglosen Verbindungsversuch erhöht; wenn Variable "3" erreicht, wird der Vorang gestoppt und es erfolgen keine Verbindungsversuche mehr)
int attempts = 0;
bool success = false; //boolesche Variable kann hier nur "true" oder "false" annehmen - wird zunächst auf "false" gesetzt
while (attempts < 3 && !success) { //Endlossschleife bis drei Versuche erreicht wurden (bis "int attempts = 3" erreicht wurde)
submitValues();
delay(1000);
if (num_measurements > 0) {
success = true; //wenn die Messdaten erfolgreich übermittelt wurden (submitValues()), dann wird Variable success auf "true" gesetzt
Serial.println("Die Messdaten wurden erfolgreich übermittelt!");
display.setTextColor(WHITE, BLACK);
display.println("Die Messdaten wurden erfolgreich übermittelt!");
display.display();
} else {
attempts++; //erhöht "int attempts = 0" um +1 nach jedem erfolglosen Verbindungsversuch
Serial.println("Fehler: Messdaten konnten nicht gesendet werden. Versuche erneut...");
delay(1000); // Warten, bevor erneut versucht wird
}
}
if (!success) {
Serial.println("Fehler: Messdaten konnten nicht gesendet werden nach mehreren Versuchen.");
// Verbindung erneut überprüfen und ggf. wiederherstellen
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Verbindung verloren, versuche erneut zu verbinden...");
WiFi.disconnect();
delay(1000); //1 Sekunde warten, bevor ein neuer Verbindungsversuch gestartet wird
WiFi.begin(ssid, pass); //WLAN-Verbindung erneut aufbauen
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 10) {
delay(500); //0,5 Sekunde warten, bis der WLAN-Status erneut überprüft wird
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WLAN-Verbindung erfolgreich wiederhergestellt!");
// Anzeige auf dem Display, dass die Verbindung erfolgreich wiederhergestellt wurde
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.println("WLAN-Verbindung wiederhergestellt!");
display.display();
delay(2000);
display.clearDisplay();
} else {
Serial.println("Fehler: WLAN-Verbindung konnte nicht wiederhergestellt werden.");
// Anzeige auf dem Display, dass die Verbindung nicht wiederhergestellt werden konnte
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.println("Fehler: WLAN-Verbindung konnte nicht wiederhergestellt werden.");
display.display();
delay(2000);
display.clearDisplay();
}
}
}
// Display leeren und 2 Sekunden Pause vor dem nächsten Durchlauf
display.clearDisplay();
delay(2000);
}
}