#include <Arduino.h>
#include <Wire.h>
#include <RTClib.h>
#include <BMx280I2C.h>
//#include <U8x8lib.h>
#include <oled.h>
#include <Wire.h>


RTC_DS3231 rtc;
BMx280I2C bme(0x76);                  // create a BMx280I2C object using the I2C interface with I2C Address 0x76
U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);



uint8_t state = 1;                    // current state (start in last state == default == Datum)
uint32_t previousMillis = 1;              // time management
constexpr uint32_t interval = 1500;   // default periode between steps
float real_temp;                      // Mittelwert aus RTC- und BME-Temp


char wochentage[7][12] = { "7", "1", "2", "3", "4", "5", "6" }; // Wochentag für KW / Beginnend mit Sonntag=7


void setup() 
{
  Serial.begin(115200);
  Wire.begin();
  
  // RTC
  if (!rtc.begin()) 
  {
    Serial.println("Finde keine RTC");
    while (true);  
  }

  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));    // Zeit vom Compiler an RTC senden
  //rtc.adjust(DateTime(2025, 01, 15, 23, 59, 50));    // J, M, T, Std, Min, Sek => RTC-Zeit manuell setzen
  
  DateTime jetzt = rtc.now();

  // BME
  if (!bme.begin())
	{
		Serial.println("Finde keine BME");
		while (true);
	}
  
  bme.resetToDefaults();                                    // reset sensor to default parameters
  bme.writeOversamplingPressure(BMx280MI::OSRS_P_x16);      // set an oversampling setting for pressure measurements
	bme.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);   // set an oversampling setting for temperature measurements
  bme.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);      // set an oversampling setting for humidity measurements.

  // OLED
  u8x8.begin();
  u8x8.setPowerSave(1); 

  Serial.println("Setup");
    
}




void loop()
{
  Serial.println("loop");

  OLED();
 
}



void OLED()
{
  DateTime jetzt = rtc.now();
  char buf1[] = "DD.MM.YYYY";     //Formatierung vom Datum

  bme.measure();
  bme.hasValue();
  real_temp = (rtc.getTemperature() + bme.getTemperature()) / 2;  //Mittelwert aus BME- und RTC-Temperatur berechnen
  
  u8x8.setFont(u8x8_font_7x14_1x2_f);

  Serial.println("OLED");
    
  switch (state) 
  {
    Serial.println(state);
    case 0:                // Kalenderwoche            // wenn wir in Schritt 0 sind
      if (millis() - previousMillis >= interval)       // und das Intervall abgelaufen ist
      {     
        previousMillis += interval;                    // merken wir uns die Zeit
        state++;                                       // drehen den Status weiter

        //u8x8.clear();    
        Serial.println("case 0");                              // und führen ab hier eine Aktion aus
        u8x8.drawString(4,4,"KW ");
        
        if (KW(jetzt.year(), jetzt.month(), jetzt.day())<10)    // wenn die KW 1-Stellig ist eine führende "0" einfügen
        {
          u8x8.drawString(7,4,"0");
          u8x8.setCursor(8,4);
        }
        else
        {
          u8x8.setCursor(7,4);
        }
        
        u8x8.print(KW(jetzt.year(), jetzt.month(), jetzt.day()));
        u8x8.drawString(9,4,".");
        u8x8.drawString(10,4,wochentage[jetzt.dayOfTheWeek()]);
      }
    break;
    
    case 1 :                             // Temperatur
      if (millis() - previousMillis >= interval) 
      {
        previousMillis += interval;
        state++;

        //u8x8.clear();
        Serial.println("case 1");
        u8x8.setCursor(4,4);
        u8x8.print(real_temp, 1);
        u8x8.drawString(8,4," \260C");    // \260 ist das °-Zeichen
      }
    break;
          
    case 2 :                             // Luftfeuchte
      if (millis() - previousMillis >= interval) 
      {
        previousMillis += interval;
        state++;

        //u8x8.clear();
        Serial.println("case 2");
        u8x8.setCursor(4,4);
        u8x8.print(bme.getHumidity(), 1);
        u8x8.drawString(8,4," RH");
      }
    break;

    case 3 :                             // Druck
      if (millis() - previousMillis >= interval) 
      {
        previousMillis += interval;
        state++;

        u8x8.clear();
        Serial.println("case 3");
        if (bme.getPressure()<100000)   // Wenn der Druck in hPA dreistellig ist (kleiner 1000)
        {
          u8x8.setCursor(4,4);
        }
        else
        {
          u8x8.setCursor(3,4);
        }
        
        u8x8.print(bme.getPressure() / 100.0F, 0);
        u8x8.drawString(7,4," hPa");
      }
    break;

    default :                             // Datum
      if (millis() - previousMillis >= interval) 
      {
        previousMillis += interval;
        state = 0;

        //u8x8.clear();
        Serial.println("case default");
        u8x8.drawString(3,4,jetzt.toString(buf1));  
      }
    break;

  }
}
Loading
grove-oled-sh1107