Forum: Mikrocontroller und Digitale Elektronik LED Uhr mit RTC braucht Taster


von Sas (Gast)


Lesenswert?

Hallo,
ich soll eine LED Uhr bauen nach diesem 
(https://www.adlerweb.info/blog/2017/03/12/bitbastelei-234-ws2812b-neopixel-uhr/ 
) Vorbild. Nun möchte mein Ausbilder gerne noch eine manuelle 
Zeitstellung durch einen Taster reinbringen. An und für sich auch noch 
okay. Ich bin jedoch komplett damit überfordert, dass zuerst die 5er 
LED's die rot leuchten weiß leuchten sollen. Zudem, dass ich nun doch 2 
Taster einbringen soll. Einer soll die Minuten einstellen, der andere 
die Stunden.
Die Minuten sollen die ersten 10 Minuten nachdem man den Taster gedrückt 
hält langsam ablaufen, danach sollen die Minuten schneller laufen.
Außerdem benutze ich zur Zeit noch den DS1307, der DS3132 ist jedoch 
bestellt (Eigentlich nur eine Sache der Genauigkeit).
Vielen Dank fürs helfen.
Sas
1
/**
2
 * NeoClock
3
 * 
4
 * Clock using 60 WS2812B/Neopixel LEDs and DS3231 RTC
5
 * 
6
 * Libraries needed:
7
 *   * Adafruit NeoPixel (Library Manager) - Phil Burgess / Paint Your Dragon for Adafruit Industries - LGPL3
8
 *   * Rtc by Makuna (Library Manager) - Michael C. Miller
9
 *   * Arduino Timezone Library (https://github.com/JChristensen/Timezone) - Jack Christensen - CC-BY-SA
10
 *   * Time Library (https://github.com/PaulStoffregen/Time) - Paul Stoffregen, Michael Margolis - LGPL2.1
11
 */
12
13
#include <Adafruit_NeoPixel.h>
14
#ifdef __AVR__
15
  #include <avr/power.h>
16
#endif
17
18
#if defined(ESP8266)
19
#include <pgmspace.h>
20
#else
21
#include <avr/pgmspace.h>
22
#endif
23
24
#include <SoftwareWire.h>  // must be included here so that Arduino library object file references work
25
#include <RtcDS1307.h>
26
27
#include <TimeLib.h>        //http://www.arduino.cc/playground/Code/Time
28
#include <Timezone.h>    //https://github.com/JChristensen/Timezone
29
30
#include <EEPROM.h>
31
32
//Central European Time (Frankfurt, Paris)
33
TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120};     //Central European Summer Time
34
TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60};       //Central European Standard Time
35
Timezone CE(CEST, CET);
36
37
TimeChangeRule *tcr;        //pointer to the time change rule, use to get the TZ abbrev
38
time_t utc;
39
40
SoftwareWire myWire(8, 9);
41
RtcDS1307<SoftwareWire> Rtc(myWire);
42
43
#define PIN 6 
44
#define Taster 2
45
46
unsigned long lastMillis = millis();
47
byte dimmer = 0x88;
48
byte hmark = 5;
49
50
byte ohour=0;
51
byte ominute=0;
52
byte osecond=0;
53
54
boolean fader=true;
55
56
int minutes=0;
57
int tasterstatus=0;
58
59
60
61
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
62
63
void setup() {
64
  pinMode(Taster, INPUT);
65
  Serial.begin(9600);
66
  
67
  strip.begin();
68
  strip.show(); // Initialize all pixels to 'off'
69
70
  Rtc.Begin();
71
  Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low); 
72
73
74
  if (!Rtc.GetIsRunning())
75
  {
76
      Serial.println("RTC was not actively running, starting now");
77
      Rtc.SetIsRunning(true);
78
  }
79
80
  if (!Rtc.IsDateTimeValid()) 
81
  {
82
      // Common Cuases:
83
      //    1) the battery on the device is low or even missing and the power line was disconnected
84
      Serial.println("RTC lost confidence in the DateTime!");
85
  }
86
  
87
88
  byte eechk = EEPROM.read(0);
89
  if(eechk == 0xAA) { //Assume this is our config and not a fresh chip
90
    dimmer = EEPROM.read(1);
91
    hmark = EEPROM.read(2);
92
    fader = EEPROM.read(3);
93
  }timeSync();
94
95
}
96
97
void calcTime(void) {
98
  utc = now();
99
  CE.toLocal(utc, &tcr);
100
  ohour = hour(utc);
101
  ominute = minute(utc);
102
  if(osecond != second(utc)) {
103
    osecond = second(utc);
104
    lastMillis = millis();
105
106
    if(ominute == 0 && osecond == 0) {
107
      //Every hour
108
      timeSync();
109
    }
110
  }
111
}
112
113
void addPixelColor(byte pixel, byte color, byte brightness) {
114
  color *= 8;
115
  uint32_t acolor = brightness;
116
  acolor <<= color;
117
  uint32_t ocolor = strip.getPixelColor(pixel);
118
  ocolor |= acolor;
119
  strip.setPixelColor(pixel, ocolor);
120
}
121
122
void drawClock(byte h, byte m, byte s) {  
123
  strip.clear();
124
  
125
  addPixelColor(m, 1, dimmer);
126
127
  if(hmark > 0) {
128
    for(byte i = 0; i<12; i++) {
129
      addPixelColor((5*i), 2, hmark);
130
    }
131
  }
132
133
  h %= 12;
134
  h *= 5;
135
  h += (m/12);
136
  addPixelColor(h, 0, dimmer);
137
  // 0x RR GG BB
138
139
  if(fader) {
140
    byte dim_s1 = dimmer;
141
    byte dim_s2 = 0;
142
    byte px_s2 = s+1;
143
    if(px_s2 >= 60) px_s2 = 0;
144
    unsigned long curMillis = millis()-lastMillis;
145
    if(curMillis < 250) {
146
      dim_s2 = 0;
147
      dim_s1 = dimmer;
148
    }else{
149
      dim_s2 = map(curMillis, 250, 1000, 0, dimmer);
150
      dim_s1 = dimmer - map(curMillis, 250, 1000, 0, dimmer);
151
    }
152
    
153
    addPixelColor(s, 0, dim_s1);
154
    addPixelColor(px_s2, 0, dim_s2);
155
  }else{
156
    addPixelColor(s, 0, dimmer);
157
  }
158
  
159
  strip.show();
160
}
161
162
byte rounds = 0;
163
164
void Zeiteinstellung(){
165
  do {tasterstatus = analogRead(Taster) ;
166
    if (tasterstatus >= 1000){
167
  }
168
    {  
169
      minutes= ++minutes; 
170
      Serial.write("a");
171
    }} 
172
while (analogRead(Taster)>=1000);
173
174
  }
175
176
  
177
void loop() {
178
 
179
  calcTime();
180
181
  if(rounds++ > 100) {
182
    Serial.print(ohour);
183
    Serial.print(":");
184
    Serial.print(ominute);
185
    Serial.print(":");
186
    Serial.println(osecond);
187
    rounds = 0;
188
 }
189
  
190
  drawClock(ohour,ominute,osecond);
191
192
  delay(10);
193
  
194
  chkSer();
195
}
196
197
void timeSync(void) {
198
  RtcDateTime dt = Rtc.GetDateTime();
199
  setTime(dt.Hour(),dt.Minute(),dt.Second(),dt.Day(),dt.Month(),dt.Year());
200
    
201
  Serial.print("Synced to: ");
202
  Serial.print(dt.Year());
203
  Serial.print("-");
204
  Serial.print(dt.Month());
205
  Serial.print("-");
206
  Serial.print(dt.Day());
207
  Serial.print("-");
208
  Serial.print(dt.Hour());
209
  Serial.print("-");
210
  Serial.print(dt.Minute());
211
  Serial.print("-");
212
  Serial.println(dt.Second());
213
}
214
215
void timeSave(void) {
216
  utc = now();
217
  
218
  RtcDateTime store = RtcDateTime(year(), month(utc), day(utc), hour(utc), minute(utc), second(utc));
219
  Rtc.SetDateTime(store);
220
221
  Serial.print("Synced to: ");
222
  Serial.print(year(utc));
223
  Serial.print("-");
224
  Serial.print(month(utc));
225
  Serial.print("-");
226
  Serial.print(day(utc));
227
  Serial.print("-");
228
  Serial.print(hour(utc));
229
  Serial.print("-");
230
  Serial.print(minute(utc));
231
  Serial.print("-");
232
  Serial.println(second(utc));
233
  
234
}
235
236
void setBrightness(byte brightness) {
237
  dimmer = brightness;
238
}
239
240
void chkSer(void) {
241
  unsigned int iy;
242
  byte im,id,iH,iM,iS;
243
  
244
  if(!Serial.available()) return;
245
246
  switch(Serial.read()) {
247
    case 'a':
248
      iy = Serial.parseInt();
249
      im = Serial.parseInt();
250
      id = Serial.parseInt();
251
      iH = Serial.parseInt();
252
      iM = minutes;
253
      iS = Serial.parseInt();
254
      setTime(iH,iM,iS,id,im,iy);
255
      Serial.println(F("Minutes changed"));
256
      break;
257
    case 'b':
258
      setBrightness(Serial.parseInt());
259
      Serial.print(F("Brightness changed to: "));
260
      Serial.println(dimmer);
261
      EEPROM.put(0, 0xAA);
262
      EEPROM.put(1, dimmer);
263
      break;
264
    case 't':
265
      iy = Serial.parseInt();
266
      im = Serial.parseInt();
267
      id = Serial.parseInt();
268
      iH = Serial.parseInt();
269
      iM = Serial.parseInt();
270
      iS = Serial.parseInt();
271
      setTime(iH,iM,iS,id,im,iy);
272
      Serial.println(F("System time changed"));
273
      break;
274
    case 'f':
275
      fader = false;
276
      EEPROM.put(0, 0xAA);
277
      EEPROM.put(3, 0);
278
      Serial.println(F("Fader off"));
279
      break;
280
    case 'F':
281
      fader = true;
282
      EEPROM.put(0, 0xAA);
283
      EEPROM.put(3, 1);
284
      Serial.println(F("Fader on"));
285
      break;
286
    case 'm':
287
      hmark = Serial.parseInt();
288
      EEPROM.put(0, 0xAA);
289
      EEPROM.put(2, hmark);
290
      Serial.println(F("HMark changed"));
291
      break;
292
    case 's':
293
      timeSync();
294
      Serial.println(F("Synced RTC to System"));
295
      break;
296
    case 'S':
297
      timeSave();
298
      Serial.println(F("Synced System to RTC"));
299
      break;
300
    default:
301
      Serial.println('?');
302
  }
303
}
Hier der bisherige ummodelierte Sketch.

(Mod: C-Formatierung eingefügt)

: Verschoben durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bitte das nächste Mal C-Code in [ c ] ... [ /c ] (ohne Leerzeichen 
innerhalb der eckigen Klammern) einfassen. Ich habe das mal für Dich 
gemacht.

Bei längeren Code-Teilen (wie dem obigen) empfiehlt es sich, die Datei 
als Attachment hochzuladen.

von m.n. (Gast)


Lesenswert?

Sas schrieb:
> Hier der bisherige ummodelierte Sketch.

Der stammt doch nicht von Dir, sondern ist zusammengeklickt?
Sollen wir jetzt die vielen Leerzeilen durch funktionierenden Code 
ersetzen?

Ein wenig mehr Eigenleistung ist schon notwendig. Es fehlt zunächst 
einmal ein Konzept, was und wie Du es machen willst.

von m.n. (Gast)


Lesenswert?

Frank M. schrieb:
> Ich habe das mal für Dich gemacht.

Verschieben in das richtige Forum wäre auch noch gut.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

m.n. schrieb:
> Verschieben in das richtige Forum wäre auch noch gut.

Danke für den Hinweis. Habe ich jetzt nachgeholt.

von Peter D. (peda)


Lesenswert?

Sas schrieb:
> Nun möchte mein Ausbilder gerne noch eine manuelle
> Zeitstellung durch einen Taster reinbringen.

Und hat der überhaupt nur einen blassen Schimmer, wie das Programm 
funktioniert?
In meinen Augen ist das für einen Anfänger völlig ungeeignet. Ist quasi 
wie eine 737 MAX fliegen zu wollen aber nicht mal Fahrrad fahren können.
Mit so einem riesen Brocken anfangen zu wollen, ist definitv der falsche 
Weg. Vergiß es.

Wozu ist denn das Analogread für Tasten gut?
Wertest Du den Hub der Taste aus oder wie?
Ich steig jedenfalls auch nicht durch das Programm durch.

Sich bis zum Ende durchscrollen zu wollen, hat eh keiner Lust. Du mußt 
schon den Anhang benutzen für solche riesen Programme.

von Sas (Gast)


Angehängte Dateien:

Lesenswert?

Entschuldigung, ich mache hier zum ersten Mal einen Beitrag.
Zudem habe ich gestern meine Ausbildung abgeschlossen und sollte in der 
Lage dazu sein. Jedoch ist Arduino nicht mein Lieblingsgebiet.

Ja der Sketch ist größtenteils von dem Link der beigelegt ist. Ich habe 
nur versucht einen Taster mit dazu einzubauen.
Zuerst habe ich eine void Zeiteinstellung versucht einzubauen, der 
erkennt wann der Taster gedrückt ist und soll die Variable minutes 
hochsetzen.

          void Zeiteinstellung(){

                do {tasterstatus = analogRead(Taster) ;

                if (tasterstatus >= 1000){
                minutes= ++minutes;
                Serial.write("a");
                                  }}
                 while (analogRead(Taster)>=1000);

                  }


Auch in einer do while Schleife, da die Minuten solange der Taster 
gedrückt ist nach oben laufen sollen.

Dann ist unten beim switch case eine Funktion a die mit dem void 
Zeiteinstellung aufgerufen werden soll.

Der analogRead ist dafür da, dass die ganze Taster Sache entprellt wird.

Ich habe auch absolut keine Ahnung wie ich das ganze als C-Formatierung 
hier hochladen kann.

         case 'a':

      iy = Serial.parseInt();

      im = Serial.parseInt();

      id = Serial.parseInt();

      iH = Serial.parseInt();

      iM = minutes;

      iS = Serial.parseInt();

      setTime(iH,iM,iS,id,im,iy);

      Serial.println(F("Minutes changed"));

      break;


und zwar diese hier, habe mittlerweile eingesehen, dass es so absolut 
nicht funktionieren kann, ich weiß es aber auch grad nicht besser wie 
ich sonst meine Minuten da in diesen Sketch reinschreiben kann.

Anbei der ganze Sketch noch einmal als Arduino Datei.
Ich hoffe trotz meine Fehler hier noch kompetente Lösungsvorschläge zu 
bekommen.

von Falk B. (falk)


Lesenswert?

Sas schrieb:

> Zuerst habe ich eine void Zeiteinstellung versucht einzubauen, der
> erkennt wann der Taster gedrückt ist und soll die Variable minutes
> hochsetzen.

Deine Formatierung des Quelltextes ist grausam, das ist sehr schlecht 
lesbar. Erst recht in der Datei im Anhang.

> Auch in einer do while Schleife, da die Minuten solange der Taster
> gedrückt ist nach oben laufen sollen.

Hast du eine Ahnung, wie schnell das geht? So ein kleiner 
Mikrocontroller zählt etwas schneller als eine Eieruhr.

> Dann ist unten beim switch case eine Funktion a die mit dem void
> Zeiteinstellung aufgerufen werden soll.
>
> Der analogRead ist dafür da, dass die ganze Taster Sache entprellt wird.

Nö.

> Ich habe auch absolut keine Ahnung wie ich das ganze als C-Formatierung
> hier hochladen kann.

Es reicht eine gescheit formatierte Datei im Anhang. Möglichst ohne 
Tabulatoren, nur mit Leerzeichen.

> Anbei der ganze Sketch noch einmal als Arduino Datei.

Nö, das ist eine sehr kurze Datei.

von Sas (Gast)


Lesenswert?

Falk B. schrieb:
> Deine Formatierung des Quelltextes ist grausam, das ist sehr schlecht
> lesbar. Erst recht in der Datei im Anhang.

Vielen Dank, ich weiß immer noch nicht, wie man es besser macht.

Falk B. schrieb:
> Hast du eine Ahnung, wie schnell das geht? So ein kleiner
> Mikrocontroller zählt etwas schneller als eine Eieruhr.

Nein, sonst wäre ich nicht hier.

Falk B. schrieb:
> Nö.

Vielen Dank, dann erklären sie es uns doch bitte.

Falk B. schrieb:
> Es reicht eine gescheit formatierte Datei im Anhang. Möglichst ohne
> Tabulatoren, nur mit Leerzeichen.

Ich habe das ganze doch selber nur kopiert außer die Sache mit dem 
Taster.

Ihr Beitrag war leider nicht im geringsten hilfreich für mich. Nächstes 
Mal erklären sie doch bitte was sie meinen oder wie es besser geht. 
Vielen Dank.

von Sas (Gast)


Lesenswert?

Peter D. schrieb:
> In meinen Augen ist das für einen Anfänger völlig ungeeignet. Ist quasi
> wie eine 737 MAX fliegen zu wollen aber nicht mal Fahrrad fahren können.
> Mit so einem riesen Brocken anfangen zu wollen, ist definitv der falsche
> Weg. Vergiß es.

Wie gesagt es ist nun mal mein Auftrag und es soll irgendwann fertig, 
würde ich es bereits können würde ich hier nicht ins Forum schreiben. 
Deshalb anstatt anzubringen, dass dies der falsche Weg wäre und ich es 
lassen solle (was nicht möglich ist) würde ich mich persönlich sehr über 
Lösungsvorschläge freuen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sas schrieb:
> Vielen Dank, dann erklären sie es uns doch bitte.

Siehe Artikel Entprellung. Mit AnalogRead hat das mal gar nichts zu 
tun - außer, Du benutzt eventuell an den Tastern jeweils einen Tiefpass 
(R/C-Kombi, siehe auch https://elektro.turanis.de/html/prj059/index.html 
). Dazu hast Du aber nichts geschrieben. Und selbst mit einem Tiefpass 
am Taster braucht man keine analogen Werte zu lesen, digitale Werte 0 
und 1 reichen hier vollkommen aus. Irgendwann "kippt" der digitale 
Eingang ganz von allein - siehe auch Schmitt-Trigger.

Taster sind erstmal digital, denn sie kennen nur zwei Zustände: Low oder 
High.

: Bearbeitet durch Moderator
von Sas (Gast)


Lesenswert?

Okay, gehen wir mal davon aus, dass ich den analogRead toll finde weil 
ich beim letzten Projekt nur noch analoge Pins frei hatte und deshalb 
mich damit halbwegs auskenne.
Nun hatte ich ja das Problem, dass mein Taster auch gerne schon mal 
einen Wert von 500 annimmt beim Prellen. Nun habe ich das so gelöst, 
dass er dies erstmal nicht erkennt, weil der Arduino ja erst etwas macht 
ab einem Wert von 1024. Damit weiteres Prellen vermieden wird habe ich 
diese Abfrage zweimal hintereinander geschaltet. Einmal in der while 
Schleife und danach noch einmal in der If Schleife.
Ich hoffe sie wissen nun was ich meine.

von Keller (Gast)


Lesenswert?

Wenn man schon Arduino benützt, dann
sollte man wissen, dass es 1000000
Beispiele auf YouTube gibt.
Darunter findest Du auch eine „fertige“ Lösung für Dich.

von Sas (Gast)


Lesenswert?

Keller schrieb:
> Wenn man schon Arduino benützt, dann
> sollte man wissen, dass es 1000000
> Beispiele auf YouTube gibt.
> Darunter findest Du auch eine „fertige“ Lösung für Dich.

Soweit war ich auch bereits ich bekomme es aber nicht hin dies in den 
vorhandenen Sketch für die Uhr einzusetzen.

von Falk B. (falk)


Lesenswert?

Sas schrieb:
> Okay, gehen wir mal davon aus, dass ich den analogRead toll finde weil
> ich beim letzten Projekt nur noch analoge Pins frei hatte und deshalb
> mich damit halbwegs auskenne.

Nicht wirklich. Du kopierst nur Zeug, das du kaum verstehst. Die 
analogen Pins kann man beim Arduino auch als digitale Eingänge 
konfigurieren und nutzen.

> Nun hatte ich ja das Problem, dass mein Taster auch gerne schon mal
> einen Wert von 500 annimmt beim Prellen. Nun habe ich das so gelöst,
> dass er dies erstmal nicht erkennt, weil der Arduino ja erst etwas macht
> ab einem Wert von 1024.

Nö, in deinem Quelltext steht ja 1000. 1024 kann analogRead() nie 
liefern, das geht nur bis 1023 (10 Bit AD-Wandler).

> Damit weiteres Prellen vermieden wird habe ich
> diese Abfrage zweimal hintereinander geschaltet. Einmal in der while
> Schleife und danach noch einmal in der If Schleife.
> Ich hoffe sie wissen nun was ich meine.

Ja. Es ist er übliche Versuch von Anfängern.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sas schrieb:
> Okay, gehen wir mal davon aus, dass ich den analogRead toll finde weil
> ich beim letzten Projekt nur noch analoge Pins frei hatte und deshalb
> mich damit halbwegs auskenne.

Dass bei Arduino jeder Analog-Pin auch als Digital-Pin verwendet werden 
kann, wusstest Du offenbar noch nicht. Wenn Du AnalogRead weiterhin 
nutzen willst, dann solltest Du auch einen Tiefpass am Taster verwenden. 
Dein "expirisch" gewonnener Wert von 1000 ist nämlich reines Glückspiel.

Hast Du die Texte hinter den 3 Links, die ich Dir hier aufgeschrieben 
habe, überhaupt gelesen? Offenbar nicht. Nach der Schnelle Deiner 
Antwortzeit zu urteilen willst Du offenbar gar nichts lernen und 
verstehen, sondern Deinen Lesern lediglich eine schnelle Lösung 
abringen.

Damit ist aber Dein Ausbildungsziel verfehlt. Hilfe zur Selbsthilfe ist 
hier angesagt, den Rest musst Du Dir erarbeiten. Das ist die Intention 
Deiner Ausbildung.

Ich schreibe Dir ein letztes Mal einen von den drei Links hin:

https://elektro.turanis.de/html/prj059/index.html

Da steht sogar ein Arduino-Beispiel, wie mans macht.

Dann zu Deiner INO-Datei, die Du hier angehängt hast: Da steht nur was 
von Pixeln drin, die man mit einer WS2812 realisiert - nullkommanix zu 
Tastern.

Alles gute weiterhin zu Deiner Ausbildung, ich bin hier raus.

: Bearbeitet durch Moderator
von Sas (Gast)


Lesenswert?

Falk B. schrieb:
> ö, in deinem Quelltext steht ja 1000. 1024 kann analogRead() nie
> liefern, das geht nur bis 1023 (10 Bit AD-Wandler).

Ja, da hab ich mich grad wohl versehen beim schreiben.

Falk B. schrieb:
> Ja. Es ist er übliche Versuch von Anfängern.

Ja und trotzdem hat mir bisher kein einziger Profi geholfen etwas 
vernünftiges auf die Beine zu stellen sondern nur in irgendeiner Form 
etwas kommentiert was mich in keiner Weise weiterbringt.

von Sas (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Alles gute weiterhin zu Deiner Ausbildung, ich bin hier raus.

Vielen Dank aber leider ist das Problem ein anderes. Meine Taster 
funktionieren an und für sich und sie lesen auch korrekt aus. Mein 
einziges Problem ist es vernünftig einzubinden in Verbindung mit der 
Zeit. An und für sich hat das nichts mit dem Taster zu tun sondern eher 
wie ich vernünftig meinen Sketch hier einbauen kann, sodass es auch 
funktioniert. Denn mein void Zeiteinstellung ist glaube ich an der 
falschen Stelle im void loop und ich weiß auch nicht wie ich meine neu 
eingestellte Variable minutes mit in den Sketch einbinde, sodass ich die 
Zeit auch im RTC speichere.

Es tut mir leid, ja die Ino Datei war die falsche. Ich versuche noch 
einmal die richtige Anzuhängen.

Und vielen Dank, aber diese ist seit gestern vorbei.

von Sas (Gast)


Angehängte Dateien:

Lesenswert?

Hier nun der wirklich richtige. Die Dateien klingen zu Ähnlich

von Falk B. (falk)


Lesenswert?

Sas schrieb:
> Falk B. schrieb:
>> Deine Formatierung des Quelltextes ist grausam, das ist sehr schlecht
>> lesbar. Erst recht in der Datei im Anhang.
>
> Vielen Dank, ich weiß immer noch nicht, wie man es besser macht.

So wie es in deinem Link aussieht, mit sauberen Einrückungen der 
Klammerebenen.

Strukturierte Programmierung auf Mikrocontrollern

> Vielen Dank, dann erklären sie es uns doch bitte.

1.) Deine Funktion Zeiteinstellung wird nirgends aufgerufen
2.) Einen Taster muss man sinnvollerweise entprellen

Etwa so. Die Funktion Zeiteinstellung wird in loop() periodisch 
aufgerufen. Die Funktion selber kann man HIER relativ einfach gestalten 
und ggf. sogar das Entprellen weglassen, weil sie nur im 100ms Raster 
aufgerufen wird (im Original sind es 10ms, die sind aber bei einer Uhr, 
die nur 1s Auflösung hat, sinnlos). Ist nicht das schönste Beispiel, 
reicht hier aber. Auch die anderen Funktionen calcTime und drawClock 
müssen nur dann aufgerufen werden, wenn wirklich was neues angezeigt 
werden soll.

Dein Taster muss an das richtige Pin gegen GND angeschlossen sein.
1
// in setup() einfügen
2
pinMode(Taster, INPUT_PULLUP);
3
4
void Zeiteinstellung(void) {
5
  if ( !digitalRead(Taster) ) {
6
    ominute++;
7
    Serial.write("m+");
8
  }
9
}
10
11
void loop() {
12
  if(++rounds > 9) {
13
    Serial.print(ohour);
14
    Serial.print(":");
15
    Serial.print(ominute);
16
    Serial.print(":");
17
    Serial.println(osecond);
18
    rounds = 0;
19
    calcTime();
20
    drawClock(ohour,ominute,osecond);
21
  } 
22
  chkSer();
23
  Zeiteinstellung();
24
  delay(100);
25
}

von Sas (Gast)


Lesenswert?

Falk B. schrieb:
> So wie es in deinem Link aussieht, mit sauberen Einrückungen der
> Klammerebenen.

Okay, vielen Dank das kann ich dann ja das nächste Mal versuchen.

Falk B. schrieb:
> 1.) Deine Funktion Zeiteinstellung wird nirgends aufgerufen

Das war, weil ich mir nicht sicher war, wo diese im Loop hin muss, da 
ich bereits 1-2 Sachen probiert hatte die nicht funktionierten.

Falk B. schrieb:
> Die Funktion selber kann man HIER relativ einfach gestalten
> und ggf. sogar das Entprellen weglassen, weil sie nur im 100ms Raster
> aufgerufen wird (im Original sind es 10ms, die sind aber bei einer Uhr,
> die nur 1s Auflösung hat, sinnlos)

Okay, das war mir so auch nicht ganz bewusst, aber nun macht das ganze 
schon ein wenig Sinn.

Falk B. schrieb:
> // in setup() einfügen
> pinMode(Taster, INPUT_PULLUP);

Vielen Dank, ich werde es so nun einmal ausprobieren.

von Sas (Gast)


Lesenswert?

Falk B. schrieb:
> Dein Taster muss an das richtige Pin gegen GND angeschlossen sein.

Vielen Dank, hiermit funktioniert es nun, ich habe es nur noch einmal in 
den RTC schreiben lassen, wie hier.
1
void Zeiteinstellung(void) {
2
    unsigned int iy;
3
  byte im,id,iH,iM,iS;
4
  if ( !digitalRead(Taster) ) {
5
    ominute++;
6
    
7
   setTime(ohour,ominute,osecond,id,im,iy);
8
    Serial.println(F("System time changed"));
9
    Serial.write("m+");
10
  }
11
  delay(10);
12
}
13
  
14
void loop() {
15
  if(++rounds > 9) {
16
    Serial.print(ohour);
17
    Serial.print(":");
18
    Serial.print(ominute);
19
    Serial.print(":");
20
    Serial.println(osecond);
21
    rounds = 0;
22
    calcTime();
23
    drawClock(ohour,ominute,osecond);
24
  } 
25
  chkSer();
26
  Zeiteinstellung();
27
  delay(100);
28
}

von Falk B. (falk)


Lesenswert?

Sas schrieb:
> Vielen Dank, hiermit funktioniert es nun, ich habe es nur noch einmal in
> den RTC schreiben lassen, wie hier.

Das delay(10) braucht dort keiner. Aber wie gesagt, diese 
minimalistische Abfrage funktioniert nur dann, wenn die definiert mit 
niedriger Frequenz aufgerufen wird, hier 10 Hz. Wenn man es richtig 
machen will, muss man eine Entprellung machen, diese sinnvollerweise 
in einem periodischen Timer-Interrupt. Aber das ist ein Kapitel 
für Fortgeschrittene.

von Sascha W. (sascha-w)


Lesenswert?

Falk B. schrieb:
> Sas schrieb:
>> Vielen Dank, hiermit funktioniert es nun, ich habe es nur noch einmal in
>> den RTC schreiben lassen, wie hier.
>
> Das delay(10) braucht dort keiner.
Und macht die Uhr 10% langsamer - wenn die delay(100) als Zeitbasis 
genommen werden.

Sascha

von Falk B. (falk)


Lesenswert?

Sascha W. schrieb:
> Und macht die Uhr 10% langsamer - wenn die delay(100) als Zeitbasis
> genommen werden.

Werden sie nicht, die Zeit wird ca. 1 mal Pro Sekunde aus der RTC 
ausgelesen. Hmm, jetzt wo ich drüber nachdenke, sollte/muss man

    calcTime();
    drawClock(ohour,ominute,osecond);

doch außerhalb der if() Bedingung platzieren, sonst springt die Uhr ggf. 
2s Schritte.

von Joachim B. (jar)


Lesenswert?

Sas schrieb:
> Zudem habe ich gestern meine Ausbildung abgeschlossen und sollte in der
> Lage dazu sein.

na denn hau rein

> Jedoch ist Arduino nicht mein Lieblingsgebiet.

dann programmiere den in pure C und lasse Arduino links liegen, so ein 
Arduino ist auch nur ein µC.

> Zuerst habe ich eine void Zeiteinstellung versucht einzubauen, der
> erkennt wann der Taster gedrückt ist und soll die Variable minutes
> hochsetzen.

auch das ist möglich denn du musst ja nur von 0:00 Uhr bis 11:59 also 
maximal 719 Minuten hochzählen.
PS. du solltest mal die Timerentprellroutine vom Dannegger einbauen
https://www.mikrocontroller.net/articles/Entprellung

Einfacher gehts ja kaum

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Sas schrieb:
> Das war, weil ich mir nicht sicher war, wo diese im Loop hin muss, da
> ich bereits 1-2 Sachen probiert hatte die nicht funktionierten.

Programmieren ist nicht probieren. Hast Du Deine Ausbildung genauso 
gemacht? Einfach mal probieren, ob hier ein Widerstand, sort ein 
Transistor hinein kommt? So lange probiert, bis mal kein stinkender 
Rauch entweicht?

Du musst schon vor dem Schreiben der Programmzeilen wissen, was dort 
gemacht werden soll. Sonst wird das nie was und Du solltest vielleicht 
einen anderen Beruf erlernen.

Beitrag #6750930 wurde von einem Moderator gelöscht.
von Sas (Gast)


Lesenswert?

Christian H. schrieb:
> Programmieren ist nicht probieren. Hast Du Deine Ausbildung genauso
> gemacht? Einfach mal probieren, ob hier ein Widerstand, sort ein
> Transistor hinein kommt? So lange probiert, bis mal kein stinkender
> Rauch entweicht?
>
> Du musst schon vor dem Schreiben der Programmzeilen wissen, was dort
> gemacht werden soll. Sonst wird das nie was und Du solltest vielleicht
> einen anderen Beruf erlernen.

Vielen Dank. Ich habe hier bei einigen Menschen sehr dass Gefühl, dass 
sie Leute gerne runtermachen, weil man etwas eventuell nicht versteht.

Wenn ich als banales Beispiel nicht weiß, wie ich ein Loch bohren soll, 
dann lasse ich mir dass doch auch vorher zeigen anstatt ratlos dort 
rumzustehen und eventuell stunden damit zu verbringen mir Sachen 
durchzulesen und am Ende immer noch nicht schlauer zu sein.

Dieses Programmieren ist nur ein kleiner Bestandteil meines Berufes und 
scheinbar habe ich es bisher zumindestens so gut gemeistert, dass mir 
kleinere Sketches gelingen.

Joachim B. schrieb:
> dann programmiere den in pure C und lasse Arduino links liegen, so ein
> Arduino ist auch nur ein µC.

Vielen Dank für den Vorschlag, kann man sich mal angucken, aber ich weiß 
nicht, ob ich in diese Spezialisierung meines Berufes hinein möchte.

Joachim B. schrieb:
> PS. du solltest mal die Timerentprellroutine vom Dannegger einbauen
> https://www.mikrocontroller.net/articles/Entprellung

Gucke ich mir gleich ml an und versuche es einzubauen.

Falk B. schrieb:
> doch außerhalb der if() Bedingung platzieren, sonst springt die Uhr ggf.
> 2s Schritte.

Auch das werde ich gleich einmal probieren, vielen Dank für die Mühen 
und Versuche mir zu helfen.

von Stefan F. (Gast)


Lesenswert?

Ich kann jedem Anfänger nur raten, erstmal eigene Programme zu 
schreiben.

Es ist um ein vielfaches schwerer, fremde Programme zu verstehen und zu 
verändern. Sicher sollte man das auch bald tun, um andere 
Programmierstile kennen zu lernen und gute Ideen zu entdecken.

Aber später, du bist dazu noch nicht bereit.

Ich entwickle manchmal neue Software im Team. Die meiste Zeit verbringe 
ich jedoch damit, bis zu 20 Jahre alte Programme von anderen weiter zu 
entwickeln. Ich weiß also, wovon ich rede.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sas schrieb:
> Wenn ich als banales Beispiel nicht weiß, wie ich ein Loch bohren soll,
> dann lasse ich mir dass doch auch vorher zeigen anstatt ratlos dort
> rumzustehen und eventuell stunden damit zu verbringen mir Sachen
> durchzulesen und am Ende immer noch nicht schlauer zu sein.

Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre 
einen Mann zu fischen und du ernährst ihn für sein Leben.

Konfuzius

von Joachim B. (jar)


Lesenswert?

Stefan ⛄ F. schrieb:
> Die meiste Zeit verbringe
> ich jedoch damit, bis zu 20 Jahre alte Programme von anderen weiter zu
> entwickeln.

ein undankbarer Job und oft entdeckt man Fehler die niemand kannte!
Besser ist immer selbst und wissend NEU zu schreiben.
Nur den Chef überzeugen das der alte Code Schrott ist ist schwieriger!
Eigene Erfahrung aus der Industrie.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Joachim B. schrieb:
> oft entdeckt man Fehler die niemand kannte!

Ja. Solange man dafür gut bezahlt wird und es kann - why not?

von Falk B. (falk)


Lesenswert?

Joachim B. schrieb:
> ein undankbarer Job und oft entdeckt man Fehler die niemand kannte!
> Besser ist immer selbst und wissend NEU zu schreiben.

Nö. Denn dann hast du auch gute Chancen, neue Fehler zu machen. Erst 
recht, wenn die Software umfangreicher und komplexer ist. Und das ist 
selbst schon relativ kleinen Projekten mit einem Dutzend Quelldateien 
der Fall. Und neue Software muss auch umfassend getestet werden. Der 
Aufwand wird gern und oft unterschätzt.

> Nur den Chef überzeugen das der alte Code Schrott ist ist schwieriger!
> Eigene Erfahrung aus der Industrie.

Hmm, nie wirklich was gelernt? Die Entscheidung, ob komplett neu 
schreiben oder "nur" Fehler ausbessern ist alles andere als einfach. 
Meistens wird man wohl oder übel die alte Software pflegen.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich kann jedem Anfänger nur raten, erstmal eigene Programme zu
> schreiben.

Ja, aber . . .

> Es ist um ein vielfaches schwerer, fremde Programme zu verstehen und zu
> verändern. Sicher sollte man das auch bald tun, um andere
> Programmierstile kennen zu lernen und gute Ideen zu entdecken.

AHA! Man muss sogar andere Programme lesen, um Konzepte und Strukturen 
zu verstehen. Natürlich müssen die vom Niveau her passen. In Lehrbüchern 
stehen ja auch Beispiele, an denen man sich als Anfänger orientieren 
muss. Der Linux-Kernel ist sicher nicht die erste Anlaufstelle ;-)

> Aber später, du bist dazu noch nicht bereit.

Sehe ich nicht so. Er muss erstmal sehen, wie andere Leute sowas machen. 
Das fängt schon bei der Quelltextformatierung an, von Arrays etc. ganz 
zu schweigen.

von Sas (Gast)


Lesenswert?

Falk B. schrieb:
> Sehe ich nicht so. Er muss erstmal sehen, wie andere Leute sowas machen.
> Das fängt schon bei der Quelltextformatierung an, von Arrays etc. ganz
> zu schweigen.

Das stimmt schon, aber ich bin ehrlich, hätte ich mich noch mehr mit der 
Materie auseinandergesetzt hätte ich es eventuell irgendwann auch 
alleine geschafft. Jedoch wie gesagt möchte ich mich wahrscheinlich in 
andere Richtungen spezialisieren und lebe nicht für das Programmieren.
Ich bewundere Leute, die so etwas beherrschen, denn alleine durch das 
kleine Wissen was ich nun habe verstehe ich, wie komplex dies alles ist.

Und um einmal kurz zu korrigieren *Sie

von Stefan F. (Gast)


Lesenswert?

Sas schrieb:
> Jedoch wie gesagt möchte ich mich wahrscheinlich in
> andere Richtungen spezialisieren und lebe nicht für das Programmieren.

Dann solltest du nicht programmieren. Dieser "Job" füllt einen voll aus, 
wenn man es halbwegs ordentlich machen will. Wer das nicht will, lässt 
andere programmieren.

von Lasse.S (Gast)


Lesenswert?

Sas schrieb:
> Jedoch wie gesagt möchte ich mich wahrscheinlich in
> andere Richtungen spezialisieren und lebe nicht für das Programmieren

Dann lass es - für die Menschheit ist's wohl besser

von Falk B. (falk)


Lesenswert?

Sas schrieb:
> Und um einmal kurz zu korrigieren *Sie

Spielt das in Zeiten des Gender Mainstreaming, wo man sich sein 
Geschlecht jederzeit neu auswählen kann, noch eine Rolle?

Außerdem meinte ich mit "Er" den Fragesteller*In ;-)

Sind wir nicht alle ein bisschen Bluna?

von Joachim B. (jar)


Lesenswert?

Falk B. schrieb:
> Meistens wird man wohl oder übel die alte Software pflegen.

ja und ich brauchte 3 Wochen um den Chef zu überzeugen, denn die alte SW 
an einer alten Prüfmusterbaugruppe zeigte immer gut nach dem Startknopf 
drücken, z.B. bei der high Impedanzmessung, ein R mit R<Grenzwert 
parallel zum Prüfling brachte auch GUT als Ergebnis.
O-Ton vom Chef -> "da wurden über 100k Baugruppen drüber getestet und 
verkauft"

Erst danach durfte ich den Code neu schreiben und testen und sparte noch 
15 Prüfsekunden bei größerer Prüftiefe!

Falk B. schrieb:
> Und neue Software muss auch umfassend getestet werden. Der
> Aufwand wird gern und oft unterschätzt.

nicht nur Software, auch Hardware nach Layoutänderung, da wurde gerne 
mal abgekürzt, Cheffe meinte alle Prüfstufen müssen nicht neu gemacht 
werden und als dann 10k gefertigte Baugruppen nicht funktionierten lag 
es am geänderten Layout!

Wir hatten schon Spitzenentscheider

: Bearbeitet durch User
Beitrag #6751857 wurde von einem Moderator gelöscht.
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.