kennst du strukturen? Nein? Dann google mal ein wenig zu "struct c++"
gib alle deine Geburtsttage in eine Strutkur,
genauer in ein Array dieser Struktur.
Dann machst dir eine Funktion, die einfach jeden Eintrag durchgeht und die Differenz zwischen "Heute" und nächsten Geburtstag ermittelt. Wenn das Ergebnis besser ist als das vorherige, dann merkst du dir das.
dieser Code ist nicht fertig, aber er soll dir eine Idee geben wie man das machen könnte.
und PS... lies im Forum-HowTo nach, wie man Code wirklich postet.
ungeprüft, nur rein theoretisch:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
RTC_DS3231 rtc; // Es wird eine Objekt rtc aus der Klasse RTC_3231 der RTClib.h erstellt
const int ldrPin = A0;
int aktuellertag;
int MamaGeb = 0323;
int MamaJahr = 1968;
int Ich = 0306;
int IchJahr = 1996;
struct Data {
const byte day;
const byte month;
const uint16_t year;
const char name[10];
};
Data geburtstag[] {
{23, 3, 1968, "Mama"}, // der Erste Eintrag soll der erste Geburtstag im Jahr sein.
{6, 3, 1996, "ich"},
{8, 8, 2014, "Katz"},
{7, 7, 2015, "Hund"},
};
int getIndex(byte day, byte month)
{
int bestIndex = 0;
int bestDiff = 367;
int today = month * 100 + day; // wir brauchen nur irgendwas um den gleichen oder nächstbesten zu finden
for (size_t i = 0; i < sizeof(geburtstag) / sizeof(geburtstag[0]); i++)
{
int actualDays = geburtstag[i].month * 100 + geburtstag[i].day;
if (actualDays > today && actualDays - today <= bestDiff) // Geburtstag in der Zukunft und besser als der jetzt gemerkte...
{
bestDiff = actualDays - today;
bestIndex = i;
}
}
return bestIndex;
}
void output()
{
DateTime now = rtc.now();
int actual = getIndex(now.day(), now.month());
//int actual = 0;
lcd.setCursor(3, 0);
lcd.print(geburtstag[actual].name);
lcd.setCursor(4, 0);
lcd.print(F("Alter: "));
lcd.print(geburtstag[actual].year);
lcd.print("-");
lcd.print(geburtstag[actual].month);
lcd.print("-");
lcd.print(geburtstag[actual].day);
}
void setup()
{
pinMode (ldrPin, INPUT);
while (!Serial);
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Keine Echtzeituhr gefunden! ");
while (1);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(1, 0);
lcd.print("Hallo zusammen");
delay (5000);
lcd.clear();
}
}
void loop() {
DateTime now = rtc.now();
aktuellertag = (now.month() * 100 + now.day());
Serial.print(aktuellertag);
lcd.setCursor(1, 0);
lcd.print(now.hour());
lcd.print("/");
lcd.print(now.minute());
lcd.print("/");
lcd.println(now.second());
lcd.setCursor(2, 0);
lcd.print(now.day());
lcd.print(".");
lcd.print(now.month());
lcd.print(".");
lcd.print(now.year());
lcd.print(".");
if (aktuellertag == MamaGeb) {
lcd.setCursor(3, 0);
lcd.print("Mama hat Geburtstag");
lcd.setCursor(4, 0);
lcd.print("Mama wird heute ");
lcd.print(now.year() - MamaJahr);
}
if (aktuellertag == Ich) {
lcd.setCursor(3, 0);
lcd.print("Alles Gute zum Geburtstag");
lcd.setCursor(4, 0);
lcd.print("Du wirst heute ");
lcd.print(now.year() - IchJahr);
}
}
edit:
und das ist ein laufender Prototyp. Geht.
struct Data {
const byte day;
const byte month;
const uint16_t year;
const char name[10];
};
Data geburtstag[] {
{6, 3, 1996, "ich"}, // der Erste Eintrag soll der erste Geburtstag im Jahr sein.
{23, 3, 1968, "Mama"},
{8, 8, 2014, "Katz"},
{11, 11, 2011, "Maus"},
{7, 7, 2015, "Hund"},
};
int getIndex(byte day, byte month)
{
int bestIndex = 0;
int bestDiff = 367;
int today = month * 100 + day; // wir brauchen nur irgendwas um den gleichen oder nächstbesten zu finden
for (size_t i = 0; i < sizeof(geburtstag) / sizeof(geburtstag[0]); i++)
{
int actualDays = geburtstag[i].month * 100 + geburtstag[i].day;
if (actualDays > today && actualDays - today < bestDiff) // Geburtstag in der Zukunft und besser als der jetzt gemerkte...
{
bestDiff = actualDays - today;
bestIndex = i;
}
}
return bestIndex;
}
void testOutput(int thisDay, int thisMonth)
{
int actual = getIndex(thisDay, thisMonth);
Serial.print(F("Abfrage für "));
Serial.print(thisDay);
Serial.print(".");
Serial.print(thisMonth);
Serial.print(". ");
Serial.print(geburtstag[actual].name);
Serial.print(F(" Alter: "));
Serial.print(geburtstag[actual].year);
Serial.print("-");
Serial.print(geburtstag[actual].month);
Serial.print("-");
Serial.print(geburtstag[actual].day);
Serial.println();
}
void setup()
{
Serial.begin(115200);
int tag = 13;
int monat = 3;
testOutput(tag, monat);
tag = 4;
monat = 4;
testOutput(tag, monat);
tag = 1;
monat = 11;
testOutput(tag, monat);
tag = 12;
monat = 12;
testOutput(tag, monat); // kein Geburtstag mehr in diesem Jahr
}
void loop() {
}
ergibt:
Abfrage für 13.3. Mama Alter: 1968-3-23
Abfrage für 4.4. Hund Alter: 2015-7-7
Abfrage für 1.11. Maus Alter: 2011-11-11
Abfrage für 12.12. ich Alter: 1996-3-6