aufgrund einer Anregung aus dem Thread von Albert, schönen Dank schon einmal im Voraus, habe ich mich mal an PicoC und der Problematik bei abweichenden Müllabfuhrterminen versucht.
PicoC kannte ich so noch nicht, und das letzte mal mit C habe ich in der 10. Klasse programmiert. Also seht mir bitte meine amateurhaften Versuche nach ;-)
Formelbaustein:
Das Skript ist so geschrieben, dass man einmal jährlich zu Weihnachten alle Termine einträgt. Ist eigentlich selbsterklärend, wenn man ins Skript schaut.
// Müllabfuhr für loxforum.com by Sebastian
//AI1: Minuten Aktualisierung
//AQ1: Stunden bis Restmüllabholung
//AQ2: Stunden bis Biomüllabholung
//AQ3: Stunden bis Altpapierabholung
//AQ4: Stunden bis Leichtstoffabholung
float sleeptime, now, restleft, bioleft, papierleft, leichtleft;
int rest[30], bio[30], papier[30], leicht[30]; //Arrays. Falls es mehr Termine sind, einfach die Klammerwerte erhöhen
int lenrest, lenbio, lenpapier, lenleicht, i, k, year, hourrest, hourbio, hourpapier, hourleicht, minuterest, minutebio, minutepapier, minuteleicht, remtimerest, remtimebio, remtimepapier, remtimeleicht;
year = 2016; //Jahr, für den der Müllkalender gilt
hourrest = 6; //Stunde, an der die Müllabfuhr üblicherweise kommt (Restmüll)
hourbio = 6; //Stunde, an der die Müllabfuhr üblicherweise kommt (Biomüll)
hourpapier = 6; //Stunde, an der die Müllabfuhr üblicherweise kommt (Altpapier)
hourleicht = 6; //Stunde, an der die Müllabfuhr üblicherweise kommt (Leichtstoff)
minuterest = 0; //Minute, an der die Müllabfuhr üblicherweise kommt ;-)
minutebio = 0; //Minute, an der die Müllabfuhr üblicherweise kommt ;-)
minutepapier = 0; //Minute, an der die Müllabfuhr üblicherweise kommt ;-)
minuteleicht = 0; //Minute, an der die Müllabfuhr üblicherweise kommt ;-)
remtimerest = 12; //Stunden vor der Abholung bzgl. Erinnerung. IM STATUSBAUSTEIN ANPASSEN (oder umgekehrt)!
remtimebio = 12; //Stunden vor der Abholung bzgl. Erinnerung. IM STATUSBAUSTEIN ANPASSEN (oder umgekehrt)!
remtimepapier = 12; //Stunden vor der Abholung bzgl. Erinnerung. IM STATUSBAUSTEIN ANPASSEN (oder umgekehrt)!
remtimeleicht = 12; //Stunden vor der Abholung bzgl. Erinnerung. IM STATUSBAUSTEIN ANPASSEN (oder umgekehrt)!
while(TRUE)
{
sleeptime = 60*getinput(0); //Aktualisierungszeit in Sekunden
now = getcurrenttime(); //aktuelle Zeit in Sekunden (seit 01.01.2009 0:00)
//Daten der Restmüllabholung
rest[0] = gettimeval(year-1, 12, 17, hourrest, minuterest, 0, 1); //Letzter Abfuhrtermin des alten Jahres
rest[1] = gettimeval(year, 1, 14, hourrest, minuterest, 0, 1); //ab hier für das neue Jahr (Variable "year")
rest[2] = gettimeval(year, 2, 11, hourrest, minuterest, 0, 1);
rest[3] = gettimeval(year, 3, 10, hourrest, minuterest, 0, 1);
rest[4] = gettimeval(year, 4, 7, hourrest, minuterest, 0, 1);
rest[5] = gettimeval(year, 5, 6, hourrest, minuterest, 0, 1);
rest[6] = gettimeval(year, 6, 2, hourrest, minuterest, 0, 1);
rest[7] = gettimeval(year, 6, 30, hourrest, minuterest, 0, 1);
rest[8] = gettimeval(year, 7, 28, hourrest, minuterest, 0, 1);
rest[9] = gettimeval(year, 8, 25, hourrest, minuterest, 0, 1);
rest[10] = gettimeval(year, 9, 22, hourrest, minuterest, 0, 1);
rest[11] = gettimeval(year, 10, 20, hourrest, minuterest, 0, 1);
rest[12] = gettimeval(year, 11, 17, hourrest, minuterest, 0, 1);
rest[13] = gettimeval(year, 12, 15, hourrest, minuterest, 0, 1);
//Schleife Zählen der vorh. Arrayelemente beim Restmüll
lenrest=0;
for(k=0; k<(sizeof(rest)/sizeof(int)); k++) {
if(rest[k] > 0) {
lenrest++;
}
}
//Daten der Biomüllabholung
bio[0] = gettimeval(year-1, 12, 23, hourbio, minutebio, 0, 1); //Letzter Abfuhrtermin des alten Jahres
bio[1] = gettimeval(year, 1, 7, hourbio, minutebio, 0, 1); //ab hier für das neue Jahr (Variable "year")
bio[2] = gettimeval(year, 1, 21, hourbio, minutebio, 0, 1);
bio[3] = gettimeval(year, 2, 4, hourbio, minutebio, 0, 1);
bio[4] = gettimeval(year, 2, 18, hourbio, minutebio, 0, 1);
bio[5] = gettimeval(year, 3, 3, hourbio, minutebio, 0, 1);
bio[6] = gettimeval(year, 3, 17, hourbio, minutebio, 0, 1);
bio[7] = gettimeval(year, 4, 1, hourbio, minutebio, 0, 1);
bio[8] = gettimeval(year, 4, 14, hourbio, minutebio, 0, 1);
bio[9] = gettimeval(year, 4, 28, hourbio, minutebio, 0, 1);
bio[10] = gettimeval(year, 5, 12, hourbio, minutebio, 0, 1);
bio[11] = gettimeval(year, 5, 27, hourbio, minutebio, 0, 1);
bio[12] = gettimeval(year, 6, 9, hourbio, minutebio, 0, 1);
bio[13] = gettimeval(year, 6, 23, hourbio, minutebio, 0, 1);
bio[14] = gettimeval(year, 7, 7, hourbio, minutebio, 0, 1);
bio[15] = gettimeval(year, 7, 21, hourbio, minutebio, 0, 1);
bio[16] = gettimeval(year, 8, 4, hourbio, minutebio, 0, 1);
bio[17] = gettimeval(year, 8, 18, hourbio, minutebio, 0, 1);
bio[18] = gettimeval(year, 9, 1, hourbio, minutebio, 0, 1);
bio[19] = gettimeval(year, 9, 15, hourbio, minutebio, 0, 1);
bio[20] = gettimeval(year, 9, 29, hourbio, minutebio, 0, 1);
bio[21] = gettimeval(year, 10, 13, hourbio, minutebio, 0, 1);
bio[22] = gettimeval(year, 10, 27, hourbio, minutebio, 0, 1);
bio[23] = gettimeval(year, 11, 10, hourbio, minutebio, 0, 1);
bio[24] = gettimeval(year, 11, 24, hourbio, minutebio, 0, 1);
bio[25] = gettimeval(year, 12, 8, hourbio, minutebio, 0, 1);
bio[26] = gettimeval(year, 12, 22, hourbio, minutebio, 0, 1);
//Schleife Zählen der vorh. Arrayelemente beim Biomüll
lenbio=0;
for(k=0; k<(sizeof(bio)/sizeof(int)); k++) {
if(bio[k] > 0) {
lenbio++;
}
}
//Daten der Papiermüllabholung
papier[0] = gettimeval(year-1, 12, 31, hourpapier, minutepapier, 0, 1); //Letzter Abfuhrtermin des alten Jahres
papier[1] = gettimeval(year, 1, 28, hourpapier, minutepapier, 0, 1); //ab hier für das neue Jahr (Variable "year")
papier[2] = gettimeval(year, 2, 25, hourpapier, minutepapier, 0, 1);
papier[3] = gettimeval(year, 3, 23, hourpapier, minutepapier, 0, 1);
papier[4] = gettimeval(year, 4, 21, hourpapier, minutepapier, 0, 1);
papier[5] = gettimeval(year, 5, 20, hourpapier, minutepapier, 0, 1);
papier[6] = gettimeval(year, 6, 16, hourpapier, minutepapier, 0, 1);
papier[7] = gettimeval(year, 7, 14, hourpapier, minutepapier, 0, 1);
papier[8] = gettimeval(year, 8, 11, hourpapier, minutepapier, 0, 1);
papier[9] = gettimeval(year, 9, 8, hourpapier, minutepapier, 0, 1);
papier[10] = gettimeval(year, 10, 7, hourpapier, minutepapier, 0, 1);
papier[11] = gettimeval(year, 11, 4, hourpapier, minutepapier, 0, 1);
papier[12] = gettimeval(year, 12, 1, hourpapier, minutepapier, 0, 1);
papier[13] = gettimeval(year, 12, 30, hourpapier, minutepapier, 0, 1);
//Schleife Zählen der vorh. Arrayelemente beim Papiermüll
lenpapier=0;
for(k=0; k<(sizeof(papier)/sizeof(int)); k++) {
if(papier[k] > 0) {
lenpapier++;
}
}
//Daten der Leichtstoffabholung
leicht[0] = gettimeval(year-1, 12, 30, hourleicht, minuteleicht, 0, 1); //Letzter Abfuhrtermin des alten Jahres
leicht[1] = gettimeval(year, 1, 27, hourleicht, minuteleicht, 0, 1); //ab hier für das neue Jahr (Variable "year")
leicht[2] = gettimeval(year, 2, 24, hourleicht, minuteleicht, 0, 1);
leicht[3] = gettimeval(year, 3, 22, hourleicht, minuteleicht, 0, 1);
leicht[4] = gettimeval(year, 4, 20, hourleicht, minuteleicht, 0, 1);
leicht[5] = gettimeval(year, 5, 19, hourleicht, minuteleicht, 0, 1);
leicht[6] = gettimeval(year, 6, 15, hourleicht, minuteleicht, 0, 1);
leicht[7] = gettimeval(year, 7, 13, hourleicht, minuteleicht, 0, 1);
leicht[8] = gettimeval(year, 8, 10, hourleicht, minuteleicht, 0, 1);
leicht[9] = gettimeval(year, 9, 7, hourleicht, minuteleicht, 0, 1);
leicht[10] = gettimeval(year, 10, 6, hourleicht, minuteleicht, 0, 1);
leicht[11] = gettimeval(year, 11, 3, hourleicht, minuteleicht, 0, 1);
leicht[12] = gettimeval(year, 11, 30, hourleicht, minuteleicht, 0, 1);
leicht[13] = gettimeval(year, 12, 29, hourleicht, minuteleicht, 0, 1);
//Schleife Zählen der vorh. Arrayelemente beim Leichtstoffmüll
lenleicht=0;
for(k=0; k<(sizeof(leicht)/sizeof(int)); k++) {
if(leicht[k] > 0) {
lenleicht++;
}
}
//Schleife Restmüll
for(i=0; i<lenrest; i++) {
restleft = (rest[i]-now)/3600;
if(restleft >= 0) {
setoutput(0,restleft);
i = lenrest-1;
}
}
//Schleife Biomüll
for(i=0; i<lenbio; i++) {
bioleft = (bio[i]-now)/3600;
if(bioleft >= 0) {
setoutput(1,bioleft);
i = lenbio-1;
}
}
//Schleife Papiermüll
for(i=0; i<lenpapier; i++) {
papierleft = (papier[i]-now)/3600;
if(papierleft >= 0) {
setoutput(2,papierleft);
i = lenpapier-1;
}
}
//Schleife Leichtstoff
for(i=0; i<lenleicht; i++) {
leichtleft = (leicht[i]-now)/3600;
if(leichtleft >= 0) {
setoutput(3,leichtleft);
i = lenleicht-1;
}
}
//Schleife zur Überprüfung, ob die Erinnerungsuhrzeit ansteht (innerhalb 1 Stunde), wenn ja: Sleeptime verringern.
if((restleft<(remtimerest+1) && restleft>=(remtimerest)) ||
(bioleft<(remtimebio+1) && bioleft>=(remtimebio)) ||
(papierleft<(remtimepapier+1) && papierleft>=(remtimepapier)) ||
(leichtleft<(remtimeleicht+1) && leichtleft>=(remtimeleicht))) {
sleeptime = 120;
}
sleeps(sleeptime); //Sleep-Wert in Sekunden, um die CPU zu schonen..
}
Man hat die Möglichkeit, sowohl die Reststunden als auch die Resttage anzuzeigen.
Statusbaustein:
Ich wollte es so, dass der Status jeweils 12 Stunden vor Abholung gesetzt wird. Das passt auch dazu, zu welchem Zeitpunkt wir abends die Tonnen rausstellen.
Differenzschwellwertschalter:
Schalten jeweils nur die Benachrichtigungen ein, die auch dazu passen.
Symbole:
Habe ich mir von Albert geborgt, reichen für meine Zwecke mehr als aus! Danke nochmals!
Dann viel Spaß damit!
Anregungen/Verbesserungen sind natürlich erwünscht!
Gruß Sebastian
EDIT 25.12.2015:
Frohe Weihnachten!
- Das Programm lief nur bei Miniserverupdate, behoben durch While(true)
- Sleeptime mit Schieber hinzugefügt, um die CPU zu schonen
- Statusbaustein angepasst
- Benachrichtigungsbausteine: Zeit auf 12 Stunden hochgesetzt
- Config-Datei angehängt
- Screenshots erneuert
EDIT 26.12.2015:
- Statusbaustein angepasst.
EDIT 27.12.2015:
- Schleifen zur autom. Erkennung der Arrayinhalte eingefügt.
EDIT 06.01.2016;
- Sleeptimeanpassung bei 1 Stunde vor Erinnerungszeit bis zur Erinnerungszeit (um die Erinnerungszeit relativ genau zu erhalten, für Benachrichtigungen)
EDIT 07.01.2016:
- Aus einer Abholzeit mach 4, auf vielfachen Wunsch einer einzelnen Person ;-)
EDIT 30.07.2016
- Fehler im Code behoben
Kommentar