Hallo zusammen,
als Neuling habe ich das Problem, dass sich mein Nano immer mal wieder aufhängt.
Kurze Beschreibung des Projekts:
- Arduino Nano V3 von AZ Delivery
- Über I2C ein DS3231 RTC-Modul, einen BM280 und ein 1,3 Zoll OLED mir SSH1106 angeschlossen.
- Arduino wird über USB mit Strom versorgt, der Rest hat eine eigene Versorgung
Was will ich machen (erste Ausbaustufe, hinterher soll noch mehr kommen)
- Datum und Kalenderwoche auf das OLED ausgeben
- x Sekunden warten
- Temperatur und Feuchtigkeit ausgeben
- wieder x Sekunden warten
- Sekunden und Druck auf OLED ausgeben
- wieder x Sekunden - von vorne anfangen
Wenn ich die letzte Ausgabe von Druck und Sekunden weglasse, dann läuft der Sketch mehrere Tage durch. Sobald ich aber die Sekunden einfüge, macht er 10 .... 50 Durchgänge und stürzt ab. Wenn ich den Druck auch noch dazu gebe, dann startet er gar nicht erst.
Den Code habe ich mir zusammen kopiert aus diversen Beispielen.
Hier mein Code:
#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_BME280.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <Fonts/arial7pt7b.h>
//#include <AccelStepper.h>
// OLED
#define i2c_Address 0x3c //initialize OLED with the I2C addr 0x3C
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BME280 bme;
RTC_DS3231 rtc;
//int wk;
uint16_t OLED_Delay;
uint32_t Unix;
float real_temp;
char wochentage[7][12] = { "7", "1", "2", "3", "4", "5", "6" }; // Wochentag für KW / Beginnend mit Sonntag=7
void setup() {
Serial.begin(9600);
while (!Serial); // time to get serial running
unsigned status;
status = bme.begin(0x76);
if (!rtc.begin()) {
Serial.println("Finde keine RTC");
while (true); }
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Zeit vom Compiler
//rtc.adjust(DateTime(2027, 12, 31, 23, 59, 50)); // J, M, T, Std, Min, Sek
DateTime jetzt = rtc.now();
display.begin(i2c_Address, true);
display.display();
//delay(500); // Adafrui-Logo für 0.5sek anzeigen
display.clearDisplay();
display.display();
}
void loop() {
showValues();
}
void showValues() {
OLED_Delay = 1000;
DateTime jetzt = rtc.now();
char buf1[] = "DD.MM.YYYY"; //Formatierung vom Datum und der Zeit
real_temp = (rtc.getTemperature() + bme.readTemperature()) / 2; //Mittelwert aus BME- und RTC-Temperatur berechnen
display.clearDisplay();
display.setFont(&arial7pt7b);
display.setTextColor(SH110X_WHITE);
display.setCursor(18, 30);
display.print("Temp: ");
display.print(real_temp, 1);
display.setCursor(92, 30);
display.print(" C");
display.drawCircle(93, 23, 2, SH110X_WHITE);
display.setCursor(23, 45);
display.print("Humi: ");
display.print(bme.readHumidity(), 1);
display.print("%");
display.drawRect(10, 10, 105, 46, SH110X_WHITE);
display.display();
delay(OLED_Delay);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(27, 30);
display.print(jetzt.toString(buf1));
display.setCursor(36, 45);
display.print("KW ");
if (KW(jetzt.year(), jetzt.month(), jetzt.day())<10) display.print("0");
display.print(KW(jetzt.year(), jetzt.month(), jetzt.day()));
display.print(".");
display.print(wochentage[jetzt.dayOfTheWeek()]);
display.drawRect(10, 10, 105, 46, SH110X_WHITE);
display.display();
/*
delay(OLED_Delay);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(27, 30);
display.print("Sek.: ");
display.print(jetzt.second());
display.setCursor(23, 45);
display.print("Pres: ");
//display.print(bme.readPressure() / 100.0F);
display.print("hPa");
display.drawRect(10, 10, 105, 46, SH110X_WHITE);
display.display();
*/
delay(OLED_Delay);
}
// Kopiert von https://forum.arduino.cc/t/berechnung-der-wochennummer/458661/6
/* DIN/ISO Kalenderwoche berechnen */
long JD(int y,int m,int d)
{ //calculate and return Julian Day Number from calendar date
long jd= ( 1461L * ( y + 4800 + ( m - 14 ) / 12 ) ) / 4 +
( 367 * ( m - 2 - 12 * ( ( m - 14 ) / 12 ) ) ) / 12 -
( 3 * ( ( y + 4900 + ( m - 14 ) / 12 ) / 100 ) ) / 4 +
d - 32075;
return jd;
}
byte isoWeekDay(long J)
// Parameter ist die Julianische Tagesnummer
// Rückgabewert ist europäischer ISO Wochentag mit Mon=1, Tue=2,Sat=6, Sun=7
{return J%7+1;}
long kw1JD(int year)
{// liefert die Julianische Tagesnummer der ersten KW des Jahres
long result=JD(year,1,4); //vierter Januar gehört immer zur 1.KW
byte weekday=isoWeekDay(result); // Wochentag nach ISO
return result-weekday+1;
}
int KW(int Year,byte Month, byte Day)
{
long kwJD=JD(Year,Month,Day);
if(Month==12 && kwJD>=kw1JD(Year+1)) return 1; // im Dezember bereits erste Woche des Folgejahres
else if(Month==1 && kwJD<kw1JD(Year)) return KW(Year-1,12,31); //im Januar noch letzte KW des Vorjahrs
else return 1+(kwJD-kw1JD(Year))/7; // Normalfall
}
Kann mir bitte jemand helfen und mir sagen, wo mein Fehler liegt? Ich stehe vollkommen auf dem Schlauch.
DANKE!