Forum: Mikrocontroller und Digitale Elektronik Einstellung einer Uhr per Potentiometer


von Chris (Gast)


Lesenswert?

Hallo zusammen,

bin momentan dabei mir meine eigene Kaffeemaschine zu bauen, bin mit dem 
Code schon sehr weit, jedoch fehlt mir eine Grundlegende Funktion, 
undzwar das zeitgesteuerte starten des Brühvorgangs. Dies möchte ich 
gerne über ein Poti regeln, sprich Stunde und Minute im 24H-System 
verstellen. Da ich leider noch nicht so viel Erfahrung im programmieren 
habe und im Internet nix vergleichbares gefunden haben frage ich nun 
hier. Ich würde es mit Map Befehlen machen und dadurch das ganze von 
0-1023 mehrmals unterteilen aber gibts da nix kürzeres, einfacheres und 
besseres?
Will das man die Minuten in den Stunden einstellt, also von z.b. 0-100 
H00 M0-59 und in diesem bereich dann aber zusätzlich die Minuten, und 
dann von 100-200 H01 M00-59 (Werte nur um auszudrücken was ich meine)

Hoffe ich konnte mein Problem halbwegs verständlich ausdrücken.

Gruß
Chris

: Verschoben durch User
von MaWin (Gast)


Lesenswert?

Chris schrieb:
> Werte nur um auszudrücken was ich meine

Irgendwie verstehe ich nicht was du meinst.

 Ein Poti von 0 bis 270 Grad drehen gibt Werte von 0 bis 1023 und daraus 
kann man 24 Stunden machen, von 0 bis 42 die erste, von 43 bis 84 die 
zweite, u.s.w.

Für einzelne Minuten reicht es also nicht, aber 5-Minuten Raster sollte 
ja auch ausreichen.
Von 0 bis 4 also 0:00 , 5 bis 8 0:05 , von 9 bis 13 0:10 u.s.w.

Kommt die interne Ugr dann bei der eingestellten Uhrzeit an, startet der 
Brühvorgang.

von Marc H. (marchorby)


Lesenswert?

Nimm einen Encoder, der ist ohne Anschlag. Zudem kannst du gemütlich die 
Incr und Decr einstellen sowie ggf. mit der Drehgeschwindigkeit 
multipliziert.

von Christoph S. (chris26s)


Lesenswert?

So jetzt mit richtigen acc.

ja 5min Raster reicht auch vollkommen aus. Ich meine das wenn ich jetzt 
das Poti exakt zur Hälfte gedreht hab das dann 12:00 rauskommen und wenn 
ich es dann ein gaaaanz kleines Stück weiter dreh 12:05 z.b. kommt. Und 
aus irgendeinem Grund fällt mir dazu keine Möglichkeit ein das zu 
programmieren. Ich müsste ja im Grunde den Bereich 1023 in 24H zerlegen, 
und dann jede einzelne Stunde nochmal durch 12 damit ich in mein 5min 
Raster komme. Nur wie programmiere ich das, die 24H mit Map Befehl gehn 
noch nur wie geht's weiter? Ich muss doch dann erst die vollen H zählen, 
und den verbleibenden Rest als min oder wie würdet ihr das machen ?
Gruß
Chris

von Max D. (max_d)


Lesenswert?

Es gibt eine Standard-Funktion die beim Teilen sowohl Ergebnis als auch 
Rest liefert.
1
div_t div (int numerator, int denominator)

€dit: Je nachdem wie "teuer" Divisionen auf deinem System sind kannst du 
auch deine Zielzeit zwischenspeichern und nur bei einer Änderung am Poti 
neu teilen.

: Bearbeitet durch User
von Harald W. (wilhelms)


Lesenswert?

Chris schrieb:

> das zeitgesteuerte starten. Dies möchte ich gerne über ein Poti regeln,

Machs wie alle: Nimm, wie bereits vorgeschlagen, einen Drehencder.
Dafür gibts auch massenhaft Codebeispiele im Netz sowie hier im
Tutorial. Ein Poti ist für diesen Zweck einfach zu ungenau.

von Wasserblau (Gast)


Lesenswert?

Im Moment versuchst Du mit Stunden und Minuten zu rechnen. Wenn Du die 
Zeit mit einem Potentiometer Minutengenau einstellen möchtest, dann 
musst Du auch in dieser Genauigkeit rechnen, also nur mit Minuten 
anstatt mit Stunden.

Tein Tag hat 24 Stunden, also 24*60 = 1440 Minuten.

Wenn das Potentiometer auf 341 eingestellt ist, rechnest Du die Uhrzeit 
so aus:

341 * ( 1440 Minuten / 1023 ) = 480 Minuten

480 Minuten / 60 = 8 Stunden, die dann für 08:00 Uhr stehen

von Wasserblau (Gast)


Lesenswert?

...ok, man könnte auch durch die 1024 Schritte teilen, in die sich das 
Potentiometer einteilen lässt (0 bis 1024) ;-)

von Christoph S. (chris26s)


Lesenswert?

Ja Genauigkeit bzw. Raster is wurscht Hauptsache ned größer als 5min. Ja 
so hab ich auch schon überlegt aber wie mach ich das der Wert der Stunde 
um eins erhöht wird wenn mehr als 59 min sind, nicht das mir dann 
angezeigt wird 12.71. Mit encoder wäre auch eine Idee allerdings hab ich 
die Potis hier und wöllte es erstmal gerne damit probieren

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christoph S. schrieb:
> Ja so hab ich auch schon überlegt aber wie mach ich das der Wert der
> Stunde um eins erhöht wird wenn mehr als 59 min sind, nicht das mir dann
> angezeigt wird 12.71.

Ganz einfach: Vergiss' die Stunden, rechne in Minuten, und bilde die 
Stunden erst zum Schluss.

Ein Tag hat 1440 Minuten, wenn Du mit fünf Minuten Auflösung 
zurechtkommst, sind das also 288 Schritte.

Dein ADC liefert einen Wert zwischen 0 und 1023; wenn Du nicht den 
vollen Wertebereich ausnutzt, kannst Du z.B. einen Wert von 0 bis 863 
leicht auf die 288 Schritte abbilden (durch 3 teilen).

Und aus diesem Minutenwert kannst Du nun sehr einfach den zugehörigen 
Stundenwert bestimmen.

Nehmen wir mal an, Dein bestimmter Schrittwert liegt bei 123.

Eine Stunde hat zwölfmal 5 Minuten, also sind das 10.25 Stunden - 10 
Stunden 15 Minuten.

von Wolfgang (Gast)


Lesenswert?

Christoph S. schrieb:
> ... aber wie mach ich das der Wert der Stunde um eins erhöht wird
> wenn mehr als 59 min sind, nicht das mir dann angezeigt wird 12.71

Wäre das so schlimm?
0.71 Stunden * 60 Minuten/Stunde = 43 Minuten

Beitrag #5361892 wurde von einem Moderator gelöscht.
von Possetitjel (Gast)


Lesenswert?

Rufus Τ. F. schrieb:

> Ein Tag hat 1440 Minuten, wenn Du mit fünf Minuten
> Auflösung zurechtkommst, sind das also 288 Schritte.

Naja, dann würde ich - auch wenn ich jetzt wieder Schläge
bekommen - mit sechs-Minuten-Schritten (Zehntelstunden)
rechnen; das sind dann zufälligerweise gerade 240
Zehntelstunden je Tag.

von Wolfgang (Gast)


Lesenswert?

Possetitjel schrieb:
> Naja, dann würde ich - auch wenn ich jetzt wieder Schläge
> bekommen - mit sechs-Minuten-Schritten (Zehntelstunden)
> rechnen; das sind dann zufälligerweise gerade 240
> Zehntelstunden je Tag.

Dann doch gleich 1/20 Stunden. Immerhin käme man damit auf eine 
Auflösung von 1/480 Tag.

von MaWin (Gast)


Lesenswert?

Christoph S. schrieb:
> Und aus irgendeinem Grund fällt mir dazu keine Möglichkeit ein das zu
> programmieren. I

Versuche es mit einer Division.

von Christoph S. (chris26s)


Lesenswert?

ich hab in der Schule aufgepasst schrieb im Beitrag #5361892:
> Christoph S. schrieb:
>> aber wie mach ich das der Wert der Stunde
>> um eins erhöht wird wenn mehr als 59 min sind, nicht das mir dann
>> angezeigt wird 12.71.
> Dann musst Du halt wie in der Schule gelernt rechnen - oder hast Du die
> Schule noch nicht abgeschlossen?
>
>> die Potis hier und wöllte es erstmal gerne damit probieren
> Im Deutschunterricht auch Fensterplatz gehabt, ja?
> (ich wöllte glaub auch dass Deutsch meine Muttersprache wörde...)

Hach diese Leute die nicht lesen können sind mir die liebsten und 
anscheind gehörst du diesen an, sonst hättest du gelesen das ich nicht 
weiß wie man es im programm umsetzt.

Sry du Model wenn man auf dem Smartphone schnell schreibt dann passiert 
sowas halt mal. Und dann kommen halt ab und zu so leute wie Du welche 
mit ihrem Leben anscheinend so unzufrieden sind, dass sie sich durch das 
grundlose rummeckern ablenken müsssen, aber hey, mach ich gerne für Dich 
:)

So jetzt zurück zum Thema:

@mawin meinst du das "div_t div (int numerator, int denominator)"?

klar man könnte jetzt 25 mal map machen und dann wäre es geregelt aber 
wird doch dann sau lang

von Wasserblau (Gast)


Lesenswert?

Wenn Du 12,71 Uhr ausgerechnet hast, dann runde die Zahl auf eine ganze 
Zahl ab, also auf 12.

Dann rechnest Du 12,71 - 12 = 0,71

Zum Schluss noch die 0,71 * 60 = 43 Minuten

Alternativ könntest Du von der 12,71 in einer Schleife auch solange 1,0 
abziehen, bis die Zahl kleiner 1,0 ist, ungefähr so (in Pseudocode):

while zahl > 1,0:
  zahl = zahl - 1,0
end while

von Christoph S. (chris26s)


Lesenswert?

Ja genau das hab ich schon versucht nur wie runde ich beim Arduino ab, 
das ist das problem für mich.

von Christoph S. (chris26s)


Lesenswert?

soooo guy,

habs geschafft.

const int Drehregler =1;
float Stunde=00.00;
float Stunde2=00.0;
float Minute=00;
float Drehreglerwert=0;
void setup() {
  pinMode(Drehregler, INPUT);
  Serial.begin(38400);// put your setup code here, to run once:

}

void loop() {
 {

 }// put your main code here, to run repeatedly:
  Drehreglerwert=analogRead(Drehregler);
    Drehreglerwert=map(Drehreglerwert, 0,1023,0,1440);
    Stunde=Drehreglerwert/60;
    Stunde2=map(Drehreglerwert, 0,1440,0,24);


    Minute=((Stunde-Stunde2)*60);

    Serial.print("Stunde2: ");
    Serial.print(Stunde2);
    Serial.print(" Stunde1: ");
    Serial.print(Stunde);
    Serial.print("  Minute: ");
    Serial.print(Minute);
    Serial.println();


}

Angezeigt wird am ende nur die Stunde2 also der gerundete Wert, Stunde1 
war zu ums zu kontrollieren ob es klappt, werde aber doch bei 
Gelegenheit auf encorder umstellen aber wieder was gelernt. Besten Dank

von Manfred (Gast)


Lesenswert?

Christoph S. schrieb:
> Hach diese Leute die nicht lesen können sind mir die liebsten und
> anscheind gehörst du diesen an, sonst hättest du gelesen das ich nicht
> weiß wie man es im programm umsetzt.
>
> Sry du Model wenn man auf dem Smartphone schnell schreibt dann passiert
> sowas halt mal. Und dann kommen halt ab und zu so leute wie Du

Das sind genau der richtige Tonfall und Schreibstil, wenn man Hilfe 
erwartet. Zum Thema "Poti an µC" könnte ich beitragen, aber so nicht!

von Harald W. (wilhelms)


Lesenswert?

MaWin schrieb:

> Versuche es mit einer Division.

Ich hab nur teilen gelernt. Geht das auch?

von Jacko (Gast)


Lesenswert?

Das würde ganz hübsch funktionieren, wenn Potentiometer sich
ruckelfrei genau einstellen ließen...

- Im wahren Leben hüpft der Einstellwert immer über den
  Wunschwert hinaus! Egal, ob beim Hoch-, oder wieder beim
  Runterdrehen. Eine echte Frustquelle!

Drehencoder? Mit Billigprodukten und mieser SW-Bibliothek
ist die Fummelei fast so übel, wie beim Poti...
Es geht aber auch fix und feinfühlig mit der Lösung für die
Zeit-/Weckzeit-Einstellung (uralter guter!) Digital-Wecker:

Eine Tast-Wippe (ON-0-ON-Taster) liefert die Richtung. Je
länger man drückt, desto schneller wird die Zeit hoch-, oder
runtergezählt. Zum Abschluss tippt man sich an die genaue
Minute.

Aufwand:
ADC-Eingang, ON-0-ON-Taster, 2 Widerstände und (!) einige
schlaue Zeilen Software...

(+)--+--------+
     |        |
     |       | | R1
     |       | |
 up  o        |
     ---o-----+--------- ADC-In
 dn  o        |
     |       | | R2
     |       | |
     |        |
(0)--+--------+     (R1 = R2)

Da braucht man auch nicht Runden:
ADC-Wert < 256 = Down
ADC-Wert > 768 = Up
ADC dazwischen = Nix zu tun

Digital geht es auch (ohne Widerstände):
2 Eingänge mit internen PullUps, ON-0-ON-Taster und einige
schlaue Zeilen Software...

(In-1)--+
        |
        |
        |
    up  o
        ---o-----| Masse
    dn  o
        |
        |
        |
(In-2)--+

In-1 = In-2: Nix zu tun
In-1 = 0:    Up
In-2 = 0:    Down

von Chris (Gast)


Lesenswert?

@Manfred, ist immer Aktion, Reaktion ?

Ich Habs gestern mal ausprobiert und das klappt eigentlich relativ gut, 
klar is ned optimal aber momentan reicht es

von Test (Gast)


Lesenswert?

MaWin schrieb:
> Ein Poti von 0 bis 270 Grad drehen gibt Werte von 0 bis 1023

Bitte nicht immer solche pauschalen, falschen, nicht zu Ende gedachten 
Antworten geben.
In der Fragestellung des TE ( 1. Post ) war keine Angabe zum abtastenden 
System.

Ein Poti von Null bis 270 Grad drehen gibt bei mir zuhause immernoch 
UNENDLICH viele Werte.

------
 mfG

von Harald W. (wilhelms)


Lesenswert?

Test schrieb:

> Ein Poti von Null bis 270 Grad drehen gibt bei mir zuhause immernoch
> UNENDLICH viele Werte.

Falsch.

von Test (Gast)


Lesenswert?

nö. nix falsch.

Is genau so wie ich es sagte, ..

Ein Poti ( analog ) gibt immernoch einen analogen Wert aus.

Da kann auch der werte Herr
---------------------------------------------
Autor: Harald Wilhelms (wilhelms)
Datum: 24.03.2018 02:56
Test schrieb:

> Ein Poti von Null bis 270 Grad drehen gibt bei mir zuhause immernoch
> UNENDLICH viele Werte.

Falsch.
----------------------------------------------

nichts dran ändern.

von MaWin (Gast)


Lesenswert?

Test schrieb:
> Bitte nicht immer solche pauschalen, falschen, nicht zu Ende gedachten
> Antworten geben.
> In der Fragestellung des TE ( 1. Post ) war keine Angabe zum abtastenden
> System.
>
> Ein Poti von Null bis 270 Grad drehen gibt bei mir zuhause immernoch
> UNENDLICH viele Werte.

Bitte nicht im alkoholvernebelten Kopf so einen Stuss schreiben, 
natürlich war das abtastende System bekannt:

" 0-1023 "

von zyxw (Gast)


Lesenswert?

Warum einfach, wenn es kompliziert (mit float) geht.
In diesem Fall muss man gar nicht exakt auf 1440 Minuten kommen, d.h. 
man multipliziert den ADC mit 1,5 und kommt auf maximal 1023x1,5=1534.
m   = adc + adc/2; // genauer: m=adc+adc/2-adc/16-adc/32;
std = m / 60;
min = m % 60; // modulo-Funktion  alternativ:
min = m - std * 60;

Ganz ohne Float und kompliziert.

von Chris (Gast)


Lesenswert?

Test schrieb:
> nö. nix falsch.
>
> Is genau so wie ich es sagte, ..
>
> Ein Poti ( analog ) gibt immernoch einen analogen Wert aus.


Ja nur am analogen Eingang wird das ganze vom arduino von 0(0V) bist 
1023(5V) eingeteilt soweit ich die Theorie verstanden hab. Zyxw danke 
werde deins mal ausprobieren

von Thomas K. (ek13)


Lesenswert?

Chris schrieb:
> Hallo zusammen,
>
> bin momentan dabei mir meine eigene Kaffeemaschine zu bauen, bin mit dem
> Code schon sehr weit, jedoch fehlt mir eine Grundlegende Funktion,
> undzwar das zeitgesteuerte starten des Brühvorgangs. Dies möchte ich
> gerne über ein Poti regeln, sprich Stunde und Minute im 24H-System
...

Wenn deine Idee genial wäre, hätte mein Wecker bestimmt auch ein Poti?

So ein Problem könnte man mit einem Taster lösen.

von Harald W. (wilhelms)


Lesenswert?

Test schrieb:

> Ein Poti ( analog ) gibt immernoch einen analogen Wert aus.

> Falsch.
> ----------------------------------------------
>
> nichts dran ändern.

Bei einem Kohlepoti springt der Schleifer immer von einem
Kohlekörnchen zum nächsten. Die Auflösung mag hoch sein,
ist aber nicht unendlich. Für höhere Auflösung verwendet
man Cermet-Potis. Abgesehen davon gehört schon etwas Übung
dazu, Potis auf Bruchteile von Grad genau einzustellen.

von Philipp K. (philipp_k59)


Lesenswert?

Thomas K. schrieb:
> So ein Problem könnte man mit einem Taster lösen.

Meine Meinung, war so einfach das ich mir den Kommentar verkniffen habe.

Entweder richtig toll mit Encoder, gut programmiertes mechanisch 360° 
Poti oder halt einen Taster..

die ersten 10 Sekunden 1Minute pro Halbe Sekunde und dann 10 Minuten die 
Sekunde in 1er Schritten und wieder von vorn.

: Bearbeitet durch User
von Thomas K. (ek13)


Angehängte Dateien:

Lesenswert?

Harald W. schrieb:
> Test schrieb:
>...Abgesehen davon gehört schon etwas Übung
> dazu, Potis auf Bruchteile von Grad genau einzustellen.

Oder man nehme ein 10- Gang Poti?

von Harald W. (wilhelms)


Lesenswert?

Thomas K. schrieb:

> Oder man nehme ein 10- Gang Poti?

Davon hat der TE aber nichts gesagt (was nicht unbedingt etwas
heissen muss). Ausserdem ist ein gutes Zehngangpoti deutlich
teurer als ein guter Drehencoder. Der µC, den man zur Aus-
wertung braucht, ist ja wohl sowieso vorhanden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.