Liebe Arduinoisten,
ich bitte Euch noch einmal um Hilfe.
Zuerst möchte ich mich bei <michael_x> und <my_x_y_project> für die Antworten bedanken.
Mein jetziges Programm gewinnt die Zeit nach einer anderen Methode, den umständlichen Algorhthmus habe ich
verworfen. Mein derzeit gültiges Programm ist <Forum-Uhr-1.ino>.
Beim alten Programm war es so:
Wenn ich nach den Vorschlägen die Addition, z.B.einer Stunde, in umrechne und die zu den bisherigen
dazu zähle, dann “flutschen” so lange Stunden in die Berechnung, wie ich den Taster
drücke. Dito ist es bei den Minuten.
Lange Rede kurzer Sinn, ich kann keine einzelne Stunde oder Minute addieren oder subtrahieren.
Deshalb habe ich es mit einer anderen Zeitauswertung versucht. Jetzt zähle ich die Sekunden und leite daraus
die Minuten und Stunden ab. Aber:
ich habe den gleichen Effekt! Auch hier die Stunden oder Minuten solange in die Anzeige, wie ich den
Taster drücke.
Meine Frage an Euch ist: wie schaffe ich es, EINE Minute oder Stunde bei EINEM Tastendruck einstellen zu können?
Ich habe noch eine weitere Frage:
In meinem Programm mache ich in Zeile 112 die Erhöhung der Stunde um Eins mit dem üblichen Ausdruck
<hour++;> In dieser Form bemängelt der Compiler die Schreibweise:
< operation on ‘hour’ may be undefined [-Wsequence-point] > und die Erhöhung der Stunde klappt nicht.Aber die
Minuten bearbeite ich mit der gleichen Routine, und dort geht es (und es gibt keine Fehlermeldung).
Wenn ich dagegen schreibe <hour=hour+1;> , dann akzeptiert der Compiler diese Anweisung und es funktioniert.
Welches <C+±Geheimnis> steckt hinter dieser Merkwürdigkeit?
Ich habe Arduino 1.8.8 im Einsatz.
Ich wünsche Euch allen einen entspannten Feiertag.
Herzliche Grüße
bolsak.
/* Forum-Uhr-1.ino
nach topic=350791: <ArduinoClock>
Gewinnung der Zeit aus den Netz-Pulsen
Anzeige mit einem MAX7219 + 15 LED'n
Darstellen der Zeit mit 13 LED'n im BCD-Format
2 Sekunden-LED zeigen an, dass die Uhr "läuft".
*/
byte SekLEDo; // Sekunden-LED oben
byte SekLEDu; // dito unten
const byte LinePin = 14; // vom Optokoppler
const byte SwitchPin = 15; // Taster zum Einstellen
const byte Bell = 9; // für einen Gong/Lautsprecher
#include <LedControl.h>
#include <binary.h>
LedControl lc = LedControl(11, 12, 10, 1);
static uint8_t second, minute, hour; // CatchPulse
uint32_t FlankUp = 0; uint32_t FlankDown = 0;
uint32_t PreviousFlankUp;
uint32_t Tic;
bool up = false;
uint16_t SetTime; // Zeiteinstellung
bool PinState, LastPinState;
uint32_t PinDebounceTime;
void setup() {
Serial.begin(115200);
Serial.println(" ============================================= ");
Serial.println(" ======== Forum-Uhr-1.ino ==================== ");
Serial.println(" =========================== 20.5.20 ========= ");
pinMode(LinePin, INPUT);
pinMode(SwitchPin, INPUT);
pinMode(Bell, OUTPUT);
lc.shutdown(0, false); // Anzeige ein!
lc.setIntensity(0, 12);
lc.clearDisplay(0);
lc.setScanLimit(0, 1); // für 2 Reihen der Matrix
}
//==========================================================
void CatchPulse() { // nach topic = 285146
uint16_t Pulse = digitalRead(LinePin);
if (Pulse)
{ if (!up)
{
up = true;
}
}
else {
if (up) {
up = true;
if (up == true) {
Tic ++;
}
if (Tic % 50 == 0) {
second++;
}
if (second > 59) {
minute++;
second = 0;
}
if (minute > 59) {
hour++;
minute = 0;
}
if (hour > 24) {
hour = 0;
Tic = 0;
}
PreviousFlankUp = FlankUp;
up = false;
}
}
} // Ende CatchPulse
void loop() {
CatchPulse();
lc.clearDisplay(0);
SetTime = analogRead(SwitchPin); // für 3 Taster
uint32_t PinDebounceTime = 50;
bool PinState = false; // Entprellen
bool LastPinState = false;
// analoge Taster-Werte:
// hour+ = 600-610, min- = 835-844, min+ = 930-936
// ================================== Zeit einstellen ======================
if (SetTime > 100 ) { // Taste gedrückt???
PinState = true;
if (PinState != LastPinState ) {
if (millis() - PinDebounceTime)
{
if (SetTime > 605 && SetTime < 612 )
{
hour = hour+1; // Stunden+
}
if ((SetTime > 835) && (SetTime < 845) && (minute != 0))
{
minute--; // Minuten-
}
if ((SetTime > 930) && (SetTime < 940))
{
minute++ ; // Minuten+
}
LastPinState = PinState;
PinDebounceTime = millis();
PinState = false; // Status=false;
}
}
} // Ende Einstellen
// ===================================== Sekunden-Blinken mit 0,5 Hz
if (second % 2 == 0) {
lc.setLed(0, 1, 5, true); lc.setLed(0, 1, 6, false); // LED oben
}
else
{
lc.setLed(0, 1, 5, false); lc.setLed(0, 1, 6, true); // LED unten
}
// ==================================================================
Serial.print(" Forum-Uhr: ");
if (hour < 10) {
Serial.print('0');
}
Serial.print(hour); Serial.print(":");
if (minute < 10) {
Serial.print('0');
}
Serial.print(minute); Serial.print(":");
if (second < 10) {
Serial.print('0');
}
Serial.print(second);
Serial.print(" ST = "); Serial.print(SetTime);
Serial.print(" Durchlauf "); Serial.print(Tic);
Serial.println();
}