Go Down

Topic: Zeitsteuerung Vorwahlzeit (Read 766 times) previous topic - next topic

clown

Moin zusammen,

ich möchte gerne über 3 Taster eine Art Zeitschaltuhr programmieren. Warum?
Wir haben in der Firma 3D-Drucker und würden die gerne länger als bis zum Feierabend drucken lassen. Deshalb meinte mein Ausbilder, dass man sowas mal programmieren müsste. Er hat auch schon ein Programm geschrieben, dass aber nicht so gut läuft.

Ich habe nun folgendes vor:

über Taster 1 sollen der Stundenzähler um 1 Stunde hochgezählt werden
über Taster 2 sollen die Minuten jeweils um 1 hochgezählt werden.
und über Taster 3 sollen jeweils ne halbe Stunde minus gezählt werden.

Wenn ich das recht verstanden habe, dann muss ich zuerst einmal deklarieren, wie lange eine Sekunde ist (Timer1.initialize(1000000)) (evtl. habt ihr ja andere Vorschläge welche Library ich nehmen kann. Wenn ja, gerne sagen).

Nun Taster 1 und 2 sagen, dass wenn = HIGH jeweils um 1 Hochzählen. Soweit so gut. Bloß muss ich dem int 'm' (für Minute) und dem int 'h' sagen, wie lang eine Minute bzw. Sekunde ist.


Könnt ihr mir da weiterhelfen? Bzw. Vorschläge, andere herangehensweise oder Links... Bin jetzt nicht der Profi-Programmierer.
Ich stell mal mein Sketch rein, was ich bisher habe...


Code: [Select]

// ** Vorwahl-Timer mit Restzeitanzeige auf dem LCD - Display **
/*
 
   Vorwahltimer mit Timer - Interrupt.
   Verbleibende Zeit in Sekunden
   auf LCD - Display (2x16 Zeilen)
   Librarie = LiquidCrystal_I2C_1602
   I2C -- SCL Datenleitung auf Analog-PIN 5
   I2C -- SDA Datenleitung auf Analog-PIN 4
   Taster 1 ----- 3600 Sekunden plus (1 Sunde)
   Taster 2 ----- 60 Sekunden plus (1 Minute)
   Taster 3 ----- 1800 Sekunden minus (1/2 Stunde)
*/

#include <TimerOne.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

int led = 5; // Relaisansteuerung
int tast1 = 10;
int tast2 = 11;
int tast3 = 12;

int h = 0;
int m = 0;
int s = 0;

LiquidCrystal_I2C lcd(0x27, 16, 2);


void setup() {
 pinMode (tast1, INPUT);
 pinMode (tast2, INPUT);
 pinMode (tast3, INPUT);
 pinMode (led; OUTPUT);

  lcd.begin();
  lcd.backlight();
  lcd.clear();
  lcd.home();

}

void loop() {
  // put your main code here, to run repeatedly:

}

Klaus_ww

Hi Du Clown  :smiley-mr-green:

Quote
würden die gerne länger als bis zum Feierabend drucken lassen
ist mir grundsätzlich einleuchtend, der Rest nicht.

Lasst die Dinger doch einfach laufen, also den Saft nicht abdrehen und schon ist's gut.
Oder hab ich was missverstanden?
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

clown

#2
Jan 18, 2018, 08:42 am Last Edit: Jan 18, 2018, 08:53 am by clown
@ Klaus_ww

Recht hast du. Aber es gilt: Was Chef sagt, dass wird gemacht  :)
Ich habe auch schon überlegt, dass man das einfach mit einer ganz normalen Zeitschaltuhr steuern könnte. Er meinte, dass er das gerne so machen würde. Grund: Der PC zeigt an, wie lange der Drucker für das Teil braucht und damit man nicht lange rechnen muss, kann man dann einfach mit dieser Zeitsteuerung die verbleibende Zeit einstellen und dann mit einem Relais abschalten...

Mir fällt gerade ein... theoretisch könnte man es auch mit einer for-Schleife versuchen, oder?

for (m = 60, m == 0; m--)

postmaster-ino

Hi

Du kannst auch (ACHTUNG, nicht ganz ernst gemeint) den µC die ganze Zeit warten lassen.
Der Befehl delay(Millisekundenanzahl); hält den µC so lange an, bis diese Anzahl an Millisekunden abgelaufen ist.
In der Zeit macht der µC NICHTS, außer sinnlos im Kreis rennen und warten, daß die Zeit um ist.

Das machst Du schon Mal nicht (was soll denn der Ausbilder denken ...)

Der Arduino gibt Dir eine Variable in die Hand, Die jede Millisekunde um 1 erhöht wird - millis();
Diese startet beim Spannung anlegen bei Null und zählt stur hoch, nach 47,x Tagen läuft die Variable über und beginnt wieder bei Null.
Wenn Ihr also länger als 47 Tage drucken wollt, muß das Programm (auch Das mit dem reinem delay();) etwas komplizierter werden.
Sonst reicht Das fast schon so.

Taster ... haben das Problem, daß Diese 'prellen' - der Kontakt öffnet und schließt erst ein paar Mal, bevor Dieser wirklich zu bleibt.
Der µC ist schnell genug, daß Er Das sieht und, wenn Du Das so programmierst, bei jedem 0->1 'Stunde + 1' rechnet.
Willst Du nicht: Tasten müssen entprellt werden.
Am simpelsten: man wartet 40ms (wenn's denn sein muß, per delay();)

Wie lässt Du die Umgebung sehen, welche Laufzeit bereits eingestellt ist?
Lese Nichts über ein Display o.Ä.

Vll. auch nicht ganz uninteressant: Wie soll der Arduino den ganzen Kram abschalten?

Möglich: Ja
Sinnvoll: man lernt was ... also jahaaa
Zukunftssicher: naja, das zukünftige Stiftevolk kann den Timer jährlich verbessern ;)

MfG

Klaus_ww

Der Clown hat die Manege verlassen  :(
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

agmue

#5
Jan 19, 2018, 03:29 pm Last Edit: Jan 19, 2018, 11:02 pm by agmue
Der Clown hat die Manege verlassen  :(
Oder nur Mittwoch und Donnerstag Berufsschule und dann Internetzugang.

Liebe Opas mit implantiertem Smartphone für die Herzschrittmacher-App, nur nicht so ungeduldig ;D

Wir reden also über eine einstellbare Ausschaltverzögerung mit Anzeige auf einem LC-Display.

Aber es gilt: Was Chef sagt, dass wird gemacht  :)
Mr. Spock, den Du möglicherweise nicht kennst, wohl aber Dein Chef, würde sagen: "Da ist eine logische Ungenauigkeit enthalten!"

Beispiel: Feierabend steht bevor, Abschaltverzögerung wird auf zwei Stunden gestellt, Drucker arbeitet und legt sich nach eineinhalb Stunden schlafen, nach zwei wird der Saft abgedreht.

Arbeitsbeginn, Drucker soll was tun, hat aber keinen Strom. Und nun?

Mein Vorschlag: Eine Dauerstromtaste, eine Abschaltverzögerungszeittaste. Könnte man auch in einem Umschalter "Ein" und "Abschaltverzögerung" zusammenfassen.

Selbstverständlich hatte der Chef daran gedacht, wollte nur mal testen, ob Du von selbst darauf kommst :)

clown

Also ich habe jetzt doch das Programm vom Ausbilder genommen und dann optimiert... bin zwar noch nicht ganz durch, aber das funkt schon fast...
delays sind eigentlich tabu habe ich gelernt... wieso gibt´s die dann in der Prog.-Spr.? :smiley-roll-blue:

Naja... Danke für eure Hilfe... aber ich hatte keine Berufsschule, sondern am Freitag Urlaub und am WE nicht reingeschaut...  :)

combie

#7
Jan 22, 2018, 12:55 pm Last Edit: Jan 22, 2018, 12:57 pm by combie
Quote
delays sind eigentlich tabu habe ich gelernt...
Dogmen sind immer mit Vorsicht zu genießen.


delay() ist völlig ok.
Manchmal sogar notwendig. Eigentlich alle Sprachen kennen ein delay(), pause(), sleep() usw.
Nur halt nicht in allen Situationen sinnvoll.


Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

uwefed

Delay ist nicht zu verwenden wenn in der Wartezeit etwas gemacht weden soll. Da muß die Wartezeit mittels Millis realisiert werden.

Kleine delay-Zeiten zB zum Entprellen sind (meist) unkritisch.

Grüße Uwe

Theseus

delays sind eigentlich tabu habe ich gelernt... wieso gibt´s die dann in der Prog.-Spr.? :smiley-roll-blue:
Delays sind in der Fehlersuche sehr wertvoll, wenn man einen fehlerhaften Programmteil gezielt so langsam machen kann, dass man den Fehler nachvollziehen kann.
Delays von wenigen Millisekunden helfen manchmal um auf einfache Weise das richtige Timing zu erzeugen ohne das Programm zu sehr zu verlangsamen.

Man muss sich der Wirkung von Delay bewusst sein. Kritisch wird es bei Delay oft, wenn man in den Sekundenbereich kommt, da dann der Controller nicht mehr auf Eingaben und Ereignisse reagieren kann.  

Klaus_ww

Quote
ich habe jetzt doch das Programm vom Ausbilder genommen und dann optimiert.
Super wenn's funktioniert! Und vielleicht möchtes Du es uns auch zeigen?
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Go Up