#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
grove-oled-sh1107