De 'klok' is half af.
Eén klok-omwenteling duurt echter ca. 104 seconden terwijl ik de delays op 1.000 heb gezet.
Reken eigenlijk voor het eerst aan geneste loops maar volgens mij zit dat zo, (graag correctie indien niet) :
4 + (4 x 4) + (4 x 4 x 4) = 84.
Omdat iedere loop vanwege de if-statements per keer 1 seconde meekrijgt zou één volledige klok-omwenteling dus 84 seconden moeten duren. Heb in het C++ programma van de vorige post nog een counter geplaatst en die kwam uit op 84 loops. Op de afbeelding is echter te zien dat de Simulide op gem. ca. 80% Real Speed draait dus dan zou het redelijk kloppen.
80% x 104 = 83.2
Ps\Edit :
Dit is bij nader inzien waarschijnlijk niet goed berekend.
Als de werkelijke snelheid 84 moet zijn en de virtuele arduino draait op 80% dan is de berekening volgens mij 120% x werkelijke snelheid, oftewel 1.2 x 84 = 100.8 seconden (+ andere verliezen wordt het dan ca. 104 seconden).
Ik neem tenminste aan dat het daar aan ligt, ik heb er geen echte arduino op tafel naast gezet.
Het is uiteindelijk een looplicht geworden, zoals ik al aankondigde, want voor een volledige klok met 60+60+12 ledjes , of nog lastiger met rgb's , wordt me iets te ingewikkeld.
De tijd op de afbeelding is trouwens ...
uren...minuten..seconden
(6-9) : (15-30) : (30-45) , niet erg handig als je op de klok wijst en zegt dat het schafttijd is
De volgende stap , waar ik eind volgende week mee wil beginnen, is bovenstaand te verdubbelen, dus geen extra chip maar een extra uno. Kost toch niks en de broeikas laat me koud.
Dit omdat ik niet eerder twee micro's heb gekoppeld waarvan de ene verder gaat met het programma van de andere, zal nog 'even' puzzelen worden en zal hopelijk niet te hoog gegrepen zijn. Tips naar voorbeelden daarvan zijn alvast welkom.
Hieronder de halve klok code, getest, gaat goed en ©kitao
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
| // Er zijn 3 seconden leds, 3 minuten leds en 3 uren leds
// Elke led moet een bereik van 15 seconden, 15 minuten of 3 uren voorstellen
// Drie leds op een rijtje in de uitstand betekent dat de 'wijzer' tussen de 60 en 15 staat.
// De blinde vlek in deze 'klok' is dus 3 uur.
int t = 1000; // Verander hiermee de Delays in één keer.
int S15 = 4; int S30 = 5; int S45 = 6; // De seconden leds
int M15 = 7; int M30 = 8; int M45 = 9; // De minuten leds
int U15 = 10; int U30 = 11; int U45 = 12; // De uren leds
void setup() { // initialize the digital pins as an output.
pinMode(S15, OUTPUT) ; pinMode(S30, OUTPUT); pinMode(S45, OUTPUT);
pinMode(M15, OUTPUT) ; pinMode(M30, OUTPUT); pinMode(M45, OUTPUT);
pinMode(U15, OUTPUT) ; pinMode(U30, OUTPUT); pinMode(U45, OUTPUT);
}
void loop() {
for (int u = 1; u < 5; u++) { // lus voor UREN
if (u == 1){
digitalWrite(U15, LOW); // alle leds uit
digitalWrite(U30, LOW); // positie 1
digitalWrite(U45, LOW); // bereik 60-15
delay(t); } // wait for t seconds
if (u == 2){
digitalWrite(U15, HIGH); // zet led U15 aan, bereik 15-30
delay(t); } // wait for t seconds
if (u == 3){
digitalWrite(U30, HIGH); // zet led U30 aan, bereik 30-45
delay(t); } // wait for t seconds
if (u == 4){
digitalWrite(U45, HIGH); // zet led U45 aan, bereik 45-60
delay(t); } // wait for t seconds
for (int m = 1; m < 5; m++) { // geneste lus voor MINUTEN
if (m == 1){
digitalWrite(M15, LOW); // alle leds uit
digitalWrite(M30, LOW); // positie 1
digitalWrite(M45, LOW); // bereik 60-15
delay(t); } // wait for t seconds
if (m == 2){
digitalWrite(M15, HIGH); // zet led M15 aan, bereik 15-30
delay(t); } // wait for t seconds
if (m == 3){
digitalWrite(M30, HIGH); // zet led M30 aan, bereik 30-45
delay(t); } // wait for t seconds
if (m == 4){
digitalWrite(M45, HIGH); // zet led M45 aan, bereik 45-60
delay(t); } // wait for t seconds
for (int s = 1; s < 5; s++) { // geneste lus voor SECONDEN
if (s == 1){
digitalWrite(S15, LOW); // alle leds uit
digitalWrite(S30, LOW); // positie 1
digitalWrite(S45, LOW); // bereik 60-15
delay(t); } // wait for t seconds
if (s == 2){
digitalWrite(S15, HIGH); // zet led S15 aan, bereik 15-30
delay(t); } // wait for t seconds
if (s == 3){
digitalWrite(S30, HIGH); // zet led S30 aan, bereik 30-45
delay(t); } // wait for t seconds
if (s == 4){
digitalWrite(S45, HIGH); // zet led S45 aan, bereik 45-60
delay(t); } } } } // wait for t seconds
} |
Over mijn half (?) gestelde vraag in de vorige post over een delay in C++, die heb ik inmiddels gevonden, er zijn diverse methoden maar sommigen lijken nogal verouderd. Na wat rondgekeken te hebben lijkt mij chrono het meest gebruikt :
https://stackoverflow.com...68/sleep-for-milliseconds
std::this_thread::sleep_for(std::chrono::milliseconds(x));
Ps2\
Een halve klok erbij kopieëren zie ik toch van af.
Dan wordt het namelijk schakelen tussen 3 seconden op uno1 en 3 seconden op uno2 en 3 minuten op uno1 en etc. etc. en lijkt me te ingewikkeld om te programmeren.
Nieuw plan van aanpak wordt 6 sec.leds en 6 min.leds op uno 1 en 12 uur.leds op uno2.
Daarmee wordt de blinde vlek dan 10 of 9 minuten ipv 3 uur en is naar ik verwacht makkelijker door te schakelen tussen de twee micro's.
Ook zal het waarschijnlijk een switch case verhaal worden waarbij er minder geschreven delays hoeven te worden opgenomen in de code.
.
[
Voor 6% gewijzigd door
kitao op 09-03-2019 17:35
. Reden: Ps\Edit + Ps2\ ]