rauchfreie Tage Counter mit Reset Knopf

Hallo zusammen,
ich habe mir ein Arduino Uno zugelegt, um ein bisschen zu basteln.
Und folgende Idee, welche ich umsetzten möchte:

Ich habe ein 4 Zahlen 7 Segmente Display. Dieses Display soll jeden Tag um ein Wert steigen um 24:00 Uhr.
Sodass ich z.B. von morgen 15.11.2018 ausgehe als Tag 0. Am 16.11.2018 soll um 24 Uhr das Dispaly die Zahl 1 anzeigen, am 17.11 die Zahl 2 etc..
Zusätzlich soll ein "Knopf" zum drücken dran sein, um das ganze zu resetten.
Also wenn z.B. am 06.09.2018 der Wert 1 ist und ich den Knopf drücke, soll wieder 0 da stehen und von vorne angefangen werden.

Sinn des Ganzen ist:

ich möchte ein rauchfrei seit ... Schild erstellen und verschenken.

Ich habe mir ein Tutorial auf YT angesehn, wegen der "Bepinnung".

Beim Display bin ich von unten links ausgegangen, 1 2 3 4 5 6 ; dann oben rechts nach links 7,8,9,10,11,12

Arduinopin: Display:
2 11
3 7
4 4
5 2
6 1
7 10
8 5
9 2
10 3
11 8
12 6

Ich habe folgende Komponenten:

Arduino Uno
Segment Display: KW4-12041CLA
RTC: DS3231SN
Verwendete Libs: ADAFRUIT RTC LIB

Mein Problem:

Das ganze läuft nicht so wie ich mir das vorgestellt habe...

folgendes wird mir im serielen Monitor angezeigt:

2018/9/30 (Sunday) 21:7:35
since midnight 1/1/1970 = 1538341655s = 17804d
now + 7d + 30s: 2018/10/8 9:37:41

ich habe jetz hier das :

#include "SevSeg.h"
SevSeg sevseg; 

void setup(){
byte numDigits = 4;
byte digitPins[] = {9, 10, 11, 12};
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8};
bool resistorsOnSegments = true;

byte hardwareConfig = COMMON_CATHODE; 
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
}

void loop(){

sevseg.setNumber(1);

sevseg.refreshDisplay(); 
}

allerdings wird mir wenn ich in sevseg eine 1 eingebe an digit 1 und 4 eine 1 angezeigt? wieso ist das so?

Das Display allein bekomme ich zum Laufen ... Testzahlen usw. den RTC mit der LIB auch, mir wird dort das hier angezeigt:2018/9/30 (Sunday) 21:7:35
since midnight 1/1/1970 = 1538341655s = 17804d
now + 7d + 30s: 2018/10/8 9:37:41

Wenn ich jetz zb bei folgendem "code" die zahlen unten eingebe

#include "SevSeg.h"
SevSeg sevseg; 

void setup(){
byte numDigits = 4;
byte digitPins[] = {9, 10, 11, 12};
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8};
bool resistorsOnSegments = true;

byte hardwareConfig = COMMON_CATHODE; 
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
}

void loop(){

sevseg.setNumber(1);

sevseg.refreshDisplay();

allerdings wird mir wenn ich in sevseg eine 1 eingebe an digit 1 und 4 eine 1 angezeigt?

Gehe ich so vor das ich im ersten Teil des "Codes" den RTC zum laufen bringe und dauerhaft die Uhrzeit bzw. das Datum abrufe.
Dann sage ich wenn 23.59 bzw. 0.00 Uhr dann sevseg.setNumber = 1 und den Abgleich dann alle 12h? oder wie?

mir fehlt das "denken" dazu ich möchte das gerne verstehen usw.

Das ist der "Code" mit welchem ich geübt habe verschiedene Zahlen auf dem 7Segment Display wiederzugeben, das klappt auch soweit.

Dann habe ich hier das verwendet um den RTC "anzusteuern" (Libary 3231)

Dabei wird mir im Serial Monitor folgendes angezeigt:

2018/10/5 (Friday) 22:56:50
since midnight 1/1/1970 = 1538780210s = 17809d
now + 7d + 30s: 2018/10/13 11:26:56

anschließend habe ich hier das verwendet, da ich dachte ich gleiche etwas ab und sage dann wenn Datum höher als das "start" datum und >23.59 dann Zahl auf Display +1

Hierbei wird mir wenn ich bei SEGSEV.SETNUMBER () eine 1 eingebe an DIGIT 1 und 4 eine 1 angezeigt.

da fängt dann auch mein problem an...

Ich hoffe Ihr könnt mir helfen!

Vielen Dank für Eure Hilfe

Liebe Grüße

Ich finde deine Beschreibung sehr unverständlich.

Du solltest da nochmal in kurzer, verständlicher Fassung wiederholen.

Die von dir verwendeten Module und Libraries hier als Hyperlink (anklickbar) posten.
Bilder, die du uns zeigen möchtest, hier im Forum posten und nicht auf einem externen Server, da werden die demnächst gelöscht und hier ist der Zusammenhang auseinander gerissen.

Welches Problem du mit dem Sketch hast, solltest du auch noch mal besser erklären.
Auch kann ich keinen Unterschied zwischen den beiden erkennen.

Hallo,

vielen Dank für deine Antwort.

Ich wünsche dir zunächst ein gutes neues Jahr !:slight_smile:

Also ich erkläre erstmal was mein Vorhaben ist:

Ich möchte gerne eine Anzeige mittels 7 Segment Displays und RTC erstellen, welches Tage zählt und anschließend auf dem 7 Segment Display anzeigt.
Somit will ich z.B. einen "rauchfrei" Counter erstellen.
D.h. wenn eine Person sich vorgenommen hat am 1.1.2019 : ich höre auf zu rauchen!
Soll auf der Anzeige eine 1 für den ersten Tag anzeigen. Dann um 1.1.2019 um 23.59 um 1 erhöhen, also auf der Segment anzeige auf 2.
Zudem sollte ein Knopf vorhanden sein, falls man doch mal schwach wird und "eine raucht". Dieser Knopf soll das Zählen "resetten" also den Counter auf 0 setzten.Z.B. raucht die Person am 2Tag eine Zigarette. Display zeigt 2 an. Durch den Knopfdruck wird wieder 0 bzw 1. angezeigt.

Folgende Lib habe ich genutzt:

RTC LIB

Vielleicht sollte ich meine bisherigen "Sketches" verwerfen und nochmal mit eurem Know-How von 0 beginnen? Oder was meinst du?

Vielen Dank für deine Hilfe und ich hoffe,dass es nun verständlich ist.

Liebe Grüße

Also von der RTC LIB bekommst du die sekunden seit 1970.. (unixtime)

Wenn man den Knopf drückt, holt man sich die Sekunden (glaube RTC.now(); ) und speicherst diese mit der eeprom Library ins EEProm, von dort aus kann man die im Setup auch wieder laden wenn mal der Strom gefehlt hat.

Die Rechnung ist dann auch ganz einfach:

unsigned long abjetzt= (RTC.now()-(hour()*3600UL+minutes*60+seconds())); (Speichert den aktuellen Tag bei 0Uhr)

int Tage =   (int)((RTC.now()-(hour()*3600UL+minutes()*60+seconds()))-abjetzt)/(24*3600);

die RTC sollte man nicht zu oft abfragen, dann besser die Systemzeit über setsyncProvider setzen lassen und die unixtime extra berechnen.

EDIT: kann man so machen:

bool checked=false;

if(hour()==0&&minute()==0&&seconds()==0&&!checked){
Tage= (int)((RTC.now()-(hour()*3600UL+minutes()*60+seconds()))-abjetzt)/(24*3600);
checked=true;}

if(hour()==0&&minute()==0&&seconds()>0&&checked)
checked=false;

so wird tage einmal am tag aktualisiert und die rtc nur einmal abgefragt.