Anfängerfragen

Hallo Community

Hab mich jetzt mal unter die Bastler begeben und mit dem Arduino UNO angefangen.
Bin jetzt seit Freitag fleißig dabei Arduino besser zu verstehen und ein Projekt umzusetzen.

Mein Projekt soll ein Wecker sein der Morgens zu einer eingestellten Zeit klingelt und auf dem Display eine Matheaufgabe anzeigt.
Erst wenn diese gelöst ist, gibt der Wecker ruhe.
Ein Clock Modul habe ich zwar, will aber zuerst versuchen eine Uhr mit millis() umzusetzen und die Uhrzeit will ich mit Taster stellen können.
So weit hat auch alles, wenn auch sehr chaotisch, geklappt.
Nun habe ich das Problem dass:

  1. Manchmal wird das Display nicht gelöscht wenn eine Minute um ist. Hab dann überbleibsel auf dem Display.
  2. Wenn ich jetzt die Variable "st" (Stunde) mit dem Taster um 1 erhöhen will,

Beispiel:
if (tasterstatus1 == HIGH)
{
st ++
}

spinnt das Display komplett.

  1. Was gibt es für Tipps um übersichtlicher zu coden.
    Ich weiß selber dass das echt unschön aussieht aber einen Leitfaden o.ä. hab ich nicht gefunden :-/

Hier mal mein Sketch:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int stunden = 0;
int minuten = 0;
int mil = 0;
unsigned long sek = 0;
int set = 0;
int akt = 0;
int st = 0;
int tag = 0;
int taster1 = 8;
int taster2 = 9;
int taster3 = 10;
int tasterstatus1 = 0;
int tasterstatus2 = 0;
int tasterstatus3 = 0;



void setup() 
{
Serial.begin (9600);
lcd.begin(16, 2);
pinMode (taster1, INPUT);
pinMode (taster2, INPUT);
pinMode (taster3, INPUT);

}

void loop() 
{

lcd.setCursor(5, 0);
lcd.print("D");
lcd.setCursor(8, 0);
lcd.print("H");
lcd.setCursor(11, 0);
lcd.print("M");
lcd.setCursor(14, 0);
lcd.print("S");

lcd.setCursor(5, 1);
lcd.print(tag);
lcd.setCursor(7, 1);
lcd.print(":");
lcd.setCursor(8, 1);
lcd.print(st);
lcd.setCursor(10, 1);
lcd.print(":");
lcd.setCursor(11, 1);
lcd.print(minuten);
lcd.setCursor(13, 1);
lcd.print(":");
lcd.setCursor(14, 1);
lcd.print(sek);
lcd.setCursor(0, 1);
lcd.print(tasterstatus1);


mil = millis()/1000;
sek = mil - akt;

tasterstatus1=digitalRead(taster1);
tasterstatus2=digitalRead(taster2);
tasterstatus3=digitalRead(taster3);

if (tasterstatus1==0);
{

}


if (mil == 60)
{
akt = 60;  
}

if (sek == 60)
{
  akt = akt + 60;
}

if (sek > 59)
{
minuten++;
}

if (minuten > 59)
{
st++;
minuten = 0; 
}

if (st > 23)
{
  tag ++;
  st = 0;
}
}
if (minuten > 59)
{
st++;
minuten = 0;
}

sollte wohl eher so aussehen:

if (minuten > 59)
{
st++;
minuten -= 60;
}

In den meisten Fällen sollte das das gleiche Resultat bringen, aber eben nicht in allen.

if (sek > 59)
{
minuten++;
}

Sollten hier nicht auch die Sekunden um 60 reduziert werden?

  1. Manchmal wird das Display nicht gelöscht wenn eine Minute um ist. Hab dann überbleibsel auf dem Display.

Wieso löschst Du es dann nicht?

  1. Wenn ich jetzt die Variable "st" (Stunde) mit dem Taster um 1 erhöhen will,

Beispiel:
if (tasterstatus1 == HIGH)
{
st ++
}

spinnt das Display komplett.

Da Du uns Die zugrunde liegende Schaltung nicht verraten hast, gehe ich einfach mal von den normalen Anfängerfehlern aus. Taster 1 verbindet den Eingang also einfach mit 5V, wenn er gedrückt wird. Somit ist der Eingang im Fall, dass Taster 1 nicht gedrückt ist, floating, hat also keinen definierten Zustand, kann also wild von LOW auf HIGH und umgekehrt springen. Selbst wenn Du einen sog. Pull-Down-Widerstand nach Masse instaliiert hast, wird der Taster wahrscheinlich prellen, also während des Drückens und Loslassens ganz schnell ein paar Mal den Zustand wechseln. Der Taster muss also entprellt werden:

Schon mal danke.

Das Display spinnt aber auch wenn die Taste nicht gedrückt wird und sogar wenn sie erst garnicht angeschlossen ist zählt "st" wie blöde hoch.
Ich mein, ich messe ja den wert "Tasterstatus1" aus und der ist Null wenn der Taster nicht gedrückt wird.
Sogar wenn ich das:

if (tasterstatus1==987654321);
{
st++;
}

eintippe zählt "st" hoch.

Egal was ich mache, der "tasterstatus1" (und auch 2 und 3) hat in der if funktion jeden zustand. :-/.

OK ok, hab den Fehler...
Die IF funktion niemals mit einem Semikolon beenden -.-"

BennoB87:
Die IF funktion niemals mit einem Semikolon beenden -.-"

Gut dass du es selbst gemerkt hast :slight_smile:

Aber das ist keine Funktion

Zu dem Tastenproblem, hast du einen pulldown widerstand verwendet?
Ein unbelegter/offener Port kann einen undefinierten Zustand annehmen deshalb spinnt das dann rum.

BennoB87:
Ich weiß selber dass das echt unschön aussieht aber einen Leitfaden o.ä. hab ich nicht gefunden :-/

Hier mal mein Sketch:

So viel von einem Wecker ist an dem Sketch noch nicht zu sehen.
Ich sehe da erstmal nur, dass Du als Anzeige ein 1602 Textdisplay verwenden möchtest, und drei Tastschalter zur Bedienung.

Was hältst Du davon, falls Du noch dran bist an Deinem Projekt:

Meiner Meinung nach benötigt ein "Wecker"! zwei Einstellmöglichkeiten: Uhrzeit und Weckzeit, und für beides jeweils Stunden und Minuten.

Ich würde einen der drei Taster für eine "Select" Funktion verwenden, um zwischen vier Einstellmöglichkeiten umschalten zu können:

  1. Uhrzeit Stunden
  2. Uhrzeit Minuten
  3. Weckzeit Stunden
  4. Weckzeit Minuten
    Die anderen beiden Taster bekommen die Funktionen "plus" und "minus", um den Einstellwert jeweils zu erhöhen oder zu erniedrigen.

Wenn Du rein auf das interne Timing des Mikrocontrollers setzt und auf eine RTC verzichtest, mußt Du bereits in 8 Stunden mit einer erheblichen Gangabweichung von bis zu 0,8% rechnen, weil moderne Arduino-Boards (Stichwort "R3") ihre Taktung heutezutage meist mit recht ungenauen "keramischen Resonatoren" und nicht mit den genauen "Schwingquarzen" realisieren.

Kurze Rechnung: 8 Stunden sind 28800 Sekunden, davon 0,8% sind bis zu 230 Sekunden Gangabweichung.

Also wenn Du Deinen Wecker abends auf die richtige Uhrzeit einstellst, dann würde es Dich nicht stören, wenn 8 Stunden später beim Wecken die Zeit schon fast vier Minuten falsch geht, oder?

Wenn es Dich stört und Du Deinen Wecker unbedingt mit millis() laufen lassen möchtest, aber die Gangabweichung soll kleiner sein, dann hast Du entweder eine eingeschränkte Board-Auswahl, oder Du brauchst eine RTC für Dein Projekt.

Was meinst Du, Gangabweichung über Nacht ist OK?