Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie

  • wwwFan
  • Registratie: januari 2012
  • Laatst online: 18:59
SuperKris schreef op maandag 5 november 2018 @ 22:14:
...
Ik heb ook geprobeerd er een aparte functie van te maken die ik dan aanroep na regel 110, maar het probleem blijft hetzelfde.
...
Dit zou moeten werken. Wel moet je dan de functie die je gemaakt hebt alleen aanroepen als valueButton==HIGH. Anders wordt de functie aangeroepen bij elke wisseling.


C:
1
2
3
4
5
6
// ##### Mysensors code to check doorbell button and sent message ##### 
  if (valueButton != oldValueButton) {                       // Check if the value of the button has changed 
     send(msgDoor.set(valueButton==HIGH ? 1 : 0));           // Transmit the new value
     if( valueButton == HIGH ) belfunctie();
     oldValueButton = valueButton;                           // Change old value so this doenst loop
  }


  • SuperKris
  • Registratie: juni 2010
  • Laatst online: 15:51
wwwFan schreef op dinsdag 6 november 2018 @ 10:13:
[...]

Dit zou moeten werken. Wel moet je dan de functie die je gemaakt hebt alleen aanroepen als valueButton==HIGH. Anders wordt de functie aangeroepen bij elke wisseling.


C:
1
2
3
4
5
6
// ##### Mysensors code to check doorbell button and sent message ##### 
  if (valueButton != oldValueButton) {                       // Check if the value of the button has changed 
     send(msgDoor.set(valueButton==HIGH ? 1 : 0));           // Transmit the new value
     if( valueButton == HIGH ) belfunctie();
     oldValueButton = valueButton;                           // Change old value so this doenst loop
  }

Thanks, dat zal ik nog eens proberen dan. Ik moet de "ringtone" code toch herschrijven wamt de "wait" functie uit de MySensors library houdt de radio misschien wel actief, maar stopt wel de rest van de code.

Eigenlijk ben ik dus op zoek naar een hele simpele en lichte library die de functie van delay/wait vervangt met iets dat alle code door laat lopen. Of werkt dat sowieso niet in een while loop?

Iemand nog tips voor een dergelijke timer library?

  • tsjoender
  • Registratie: april 2005
  • Laatst online: 19:58

  • Joepla
  • Registratie: maart 2005
  • Laatst online: 10:46

Joepla

Geavanceerde micro-elektronica

FuaZe schreef op maandag 5 november 2018 @ 23:26:
[...]
Mijn punt is dat je de apparatuur moet gebruiken die geschikt is voor de functie.

Maar een trend weergeven zoals temperatuurverloop? Dat schrijf je uiteindelijk toch weg naar een SD of via netwerk of naar een PC.
Op zo'n klein scherm is het juist onhandig om die data te analyseren.

Komt nog eens bij dat je Arduino niet heel bijster veel storage heeft, dus het aantal datapunten is dan ook gelimiteerd. (Ja, je kan ook weer een SD kaart toevoegen)

Je hebt voor pi prima touchscreens die je er ook zo op kan duwen.
Maar IMHO is Arduino (de Uno) niet echt een touchscreen ding, het voegt veel overhead toe aan iets wat juist gemaakt is op efficiëntie.
Het mooie van Nextion is dat het betaalbare schermen zijn waar al slimmigheid en opslag in zit en daardoor juist uitermate geschikt voor Arduino's. Maar blijkbaar heb jij een heel ander doel voor ogen dan ik. Hoe dan ook, ik ga er wat ervaring mee opdoen en ben eigenlijk het stadium van leds en 2 regelige LCD's al een tijdje voorbij.
Piepersnijder schreef op dinsdag 6 november 2018 @ 07:36:
[...]
Ik heb een nextion schermpje gebruikt voor het bedienen van een alarmsysteem met arduino.
Grappig! Hoe vind je de programmeeromgeving van Nextion?

Live solarinfo op PVoutput [6,625 kWp]


  • Blomminator
  • Registratie: augustus 2012
  • Niet online
Nou, hele tijd geleden de Arduino Starter Kit gekocht en vond het toen al superleuk.

Gisteren begonnen.

Les 1) "Get to know your tools" ging lekker. Lampje aan/uit via een schakelaar op het board.
Les 2) "SpaceShip Interface" ging ook goed. Eerste regel programmeren, en ik snap dat wel aardig.


Maar ik heb in deze les een extra LED toegevoegd en wil het volgende;

- bij opstart board knipperen alle LED 2 sec;
- standby = groen aan (Rest uit)
- knop indrukken indrukken = Blauw knippert 2 sec, daarna gaat rood knipperen.

Dit lukt niet. Ik vraag mij of, runt het script altijd van top tot teen?
Dus, ik declareer op regel 1
int switchState = 0;
en sluit mijn IF af.

Springt de Arduino dan weer naar regel 1?
Of blijft mijn IF-loop draaien zolang het statement geldig is?
Dus tussen regel 50 en 60 ?

Want nu krijg ik dus elke keer (met ingedrukte knop)
--> blauw knippert --> Rood knippert (eindeloos...)

En blauw mag maar 1 x knipperen.
Heb ook al een INT geprobeerd in de startup en die dan ophogen na voltooiing (knipperen), maar ook die doet het ook niet, wat doet vermoeden dat de gehele code continu wordt nagelopen.


Los daarvan, het zit wel mooi in elkaar en werkt goed. Alleen die weerstandjes prikken is met dikke vingers wel een gepriegel

  • Joepla
  • Registratie: maart 2005
  • Laatst online: 10:46

Joepla

Geavanceerde micro-elektronica

@Blomminator Alles in de loop wordt eindeloos herhaald, tenzij je ergens iets programmeert waardoor de rest van je code niet wordt uitgevoerd. Bv. een while, of een for loop die niet stopt.

Zonder de rest van code te kennen, is het lastig om er iets over te zeggen. Post het ff anders hier.

Live solarinfo op PVoutput [6,625 kWp]


  • Blomminator
  • Registratie: augustus 2012
  • Niet online
Ja, snap ik. Ik ben aardig op weg.
Alles is nu aardig oke.
Echter, spanning op de schakelaar wordt niet gemeten tijdens de Loop. (gok ik)

Hierdoor blijft deze loop of eeuwig lopen, of tot de counter klaar is.
En ik wil dat hij stopt als ik de schakelaar los laat (push switch).


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
67
68
69
70
71
72
73
74
75
int switchState = 0;

void setup() {
  // put your setup code here, to run once:
pinMode(3, OUTPUT);   //green
pinMode(4, OUTPUT);   //red
pinMode(5, OUTPUT);   //red
pinMode(6, OUTPUT);   //blue
pinMode(2, INPUT);    //switch

while 
// opstart sequence
// alle leds laten knipperen. 
 
 (millis() < 1000) {
  delay(75);  
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
  delay(75);
  digitalWrite (3, LOW);
  digitalWrite (4, LOW);
  digitalWrite (5, LOW);
  digitalWrite (6, LOW);
    }  
  }
  
void loop() {
  // put your main code here, to run repeatedly:

switchState = digitalRead(2);
// read switch state 

if (switchState == LOW) {
//knop niet ingedrukt

  digitalWrite (3, HIGH);  // green led ON
  digitalWrite (4, LOW);   // red led off
  digitalWrite (5, LOW);   // red led off
  digitalWrite (6, LOW);   // blue led off
  }
  
  else    //knop wel ingedrukt  
  {
 
   for (int blueCounter = 0; blueCounter <= 4 ; blueCounter++)
// blue led laten knipperen
  {
      digitalWrite (3, LOW);
      digitalWrite (4, LOW);
      digitalWrite (5, LOW);
      digitalWrite (6, HIGH);
      delay (200);
      digitalWrite (6, LOW);
      delay (200);
  }

// DIT IS HET ISSUE ; IK WIL EIGENLIJK 
// for switchState = digitalRead(2);
// if (switchState != LOW) {   ..etc
// maar blijkbaar wordt dit niet gecontroleerd tijdens de loop (want hij komt er niet uit..) 
// nu knippert RED 20 x , maar dat wil ik niet... 

  for (int redCounter = 0; redCounter <= 20 ; redCounter++)
  {
      digitalWrite (4, HIGH);   // LED RED LINKS 
      digitalWrite (5, LOW);    // LED RED RECHTS
      delay(150);
      digitalWrite (4, LOW);    // LED RED LINKS 
      digitalWrite (5, HIGH);   // LED RED RECHTS
      delay(150);
      }
  }
}



ik zoek dus iets als

code:
1
2
3
4
5
6
7
8
9
10
while (switchState != LOW);
{
      digitalWrite (4, HIGH);   // LED RED LINKS 
      digitalWrite (5, LOW);    // LED RED RECHTS
      delay(150);
      digitalWrite (4, LOW);    // LED RED LINKS 
      digitalWrite (5, HIGH);   // LED RED RECHTS
      delay(150);
      }
 }



maar dat mag volgens mij niet...


Edit;
Ik snap wel dat de ELSE wordt gestart , en zolang die daar in zit, het zo blijft.
En als ik eruit ga, dan krijg ik ook meteen weer het blauwe lampje erbij. Dus eigenlijk vermoed ik dat dit niet met een if/else moet. Maar goed..

Blomminator wijzigde deze reactie 07-11-2018 11:10 (4%)


  • Joepla
  • Registratie: maart 2005
  • Laatst online: 10:46

Joepla

Geavanceerde micro-elektronica

@Blomminator Even snel gekeken (ben druk momenteel): als blauw maar 1x mag knipperen, moet je bv. zorgen dat er een variabele is, die weet dat blauw al eens geknippert heeft en voorkomt dat hij blijft knipperen.

Of misschien is dit wel iets voor een zgn. statemachine.

Live solarinfo op PVoutput [6,625 kWp]


  • Blomminator
  • Registratie: augustus 2012
  • Niet online
Nou, ben enkele uren verder met pielen, maar kom er niet uit.
Als ik aan het einde van mn blauwe knippercyclus een var meegeef

code:
1
var blueran = true


bijvoorbeeld, dan krijg ik enkel maar terug dat deze var niet gedeclareerd is.
En als ik buiten de lus wel declareer, dan 'werkt' het wel, maar reset ik de counter steeds.

Dus nee, ik snap t niet...

  • Joepla
  • Registratie: maart 2005
  • Laatst online: 10:46

Joepla

Geavanceerde micro-elektronica

Probeer het eens zo te maken dat de rode led knippert zolang je de schakelaar indrukt. Delay is niet de mooiste functie, maar werkt wel en je moet ergens beginnen. Als dat werkt, bouw je de blauwe led erbij. Kleine stapjes tegelijk.

Live solarinfo op PVoutput [6,625 kWp]


  • Blomminator
  • Registratie: augustus 2012
  • Niet online
Ik heb nu grotendeels wat ik hebben wil... maar 1 ding lijkt niet te pakken. Als ik aan het einde van mijn IF-loop 1 zeg

code:
1
INT BLUE = 1;


en in mijn volgende IF loop vraag

code:
1
if (blue ==1) { doe iets }


dan neemt hij de var niet mee zo lijkt het.
Klopt dit?

Ben er wel achter dat je ze eerst elders (buiten de loop) globaal moet declareren, maar de waarde veranderen + meenemen naar een ander stuk code.. nee.

  • BosGnoom
  • Registratie: februari 2002
  • Laatst online: 10:25
@Blomminator Hou je er rekening mee dat C(++) case sensitive is?

Dus BLUE en blue zijn twee verschillende variabelen. Daarnaast, welke programmeertaal ben je gewend?

code:
1
var blue = true

komt mij ook niet erg C achtig over...

  • Blomminator
  • Registratie: augustus 2012
  • Niet online
Hi,

Ik heb nog nooit geprogrammeerd tot gisteren... Dus geen enkel taal.
Ik heb de Arduino StarterKit gekocht, leek mij leuk. En heb dikke pret zover. Maar het bedenken van wat je wil, en het in 1 x maken is nog een ander verhaal...

Het case sensitive heb ik ontdekt ja.
En het blue = true is niet helemaal wat ik deed.

Ik heb wil aan het einde van mijn IF-loop dat waarde

code:
1
int blueRan = 1;


Dan in de volgende IF-loop check ik of blueRan == 1; is

En, als ik de schakelaar op het board loslaat, moet die weer gereset worden

code:
1
int blueRan = 0;




Andere vragen even;
1)
Kun je in Arduino (het tooltje waarmee ik programmeer en de code naar het board stuur meerdere tabbladen naast elkaar draaien? Want nu zegt deze steeds dat code op tabblad 1 niet goed is, terwijl ik op tabblad 2 zit. Dus het lijkt alsof hij ALLE code checkt, ipv het relevante tabblad. Of is dit meer om je code te groeperen ofzo?

2)
Als je in de Arduino (software pakket dus weer) rechtsboven pijltje --> verwijderen doet. Verwijderen je dan de code van je HD, of sluit je het tabblad? Want ik ben nu volgens mij alles van gisteren kwijt ...

Heb uit het boekje 'Arduino Projects Book' nu net de Love-O-Meter gebouwd. Met een tempSensor en drie LED. Bij 14 graden niets doen, bij 16 1 lampje, bij 18 2 leds en bij 20 of meer alle 3 lampjes! Werkt prima!

  • mcDavid
  • Registratie: april 2008
  • Laatst online: 19:19
1) Het klopt dat'ie ALLE code checkt ja. Je kunt niet de helft van je code compileren en de andere helft niet.
2) verwijderen betekent inderdaad verwijderen, niet sluiten.

Voor zover ik weet is er geen mogelijkheid om tabbladen niet weer te geven.

zcflevo.nl


  • SuperKris
  • Registratie: juni 2010
  • Laatst online: 15:51
Nogmaals, ik ben een behoorlijke noob als het gaat om het schrijven van code. Ik ben nog steeds bezig met onderstaande code. Dit werkt allemaal helemaal niet. Ik snap ook wel waarom niet denk ik. Overigens werken de timers zo wel (denk ik)

Mijn vraag is dan ook meer over de werking van loops. Als de arduino op start, runt hij 1 keer de setupcode, en vervolgens constant loop toch?

Maar stopt een while loop binnen de "void loop" dan ook direct de "void loop" tot de aan de gewenste voorwaarde van die while loop is gedaan? [JA/NEE]

En als ik een eigen functie maak (dus buiten de "void loop") en een while loop daar in stop (in mijn geval "void ringtone") en ik roep deze roep deze aan vanuit mijn "void loop" stopt, stopt mijn "void loop" dan ook totdat aan de conditie in de while loop is gedaan? [JA/NEE]

Of als ik vanuit mijn "void loop" een functie aanroep, stopt "void loop" dan met lopen totdat de aangeroepen functie klaar is? [JA/NEE]

Indien het antwoord op de vorige vraag JA is, is er dan een methode om "void loop" te laten doorlopen terwijl de aangeroepen functie ook loopt?

- Voor mijn project moet de void loop constant lopen.
- Op een bepaald moment wanneer een knop wordt ingedrukt moet er een code gaan lopen die vaak herhaald moet worden
- Dit dus terwijl de code in void loop blijft doorlopen.

Hoe pak ik dit aan? Moet ik een for of while loop vermijden? En moet ik de "ringtone" code dan zonder een for of while loop binnen void loop plaatsen?


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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
/// ##### mysensors setup ######
#define ProjectName "OldPhone" // Name that is vissible in controller
#define ProjectVersion "0,1"          // Version that is vissible in controller
#define MY_DEBUG       // Enable debug prints to serial monitor
#define MY_RADIO_NRF24 // Enable and select radio type attached
#define childIdDoor 1         // child ID number used by mysensors foor doorbell button
#define chuildIdDail_1 101    // child ID number used by mysensors when the number 1 is dailed
#define chuildIdDail_2 102    // child ID number used by mysensors when the number 2 is dailed
#define chuildIdDail_3 103    // child ID number used by mysensors when the number 3 is dailed
#define chuildIdDail_4 104    // child ID number used by mysensors when the number 4 is dailed
#define chuildIdDail_5 105    // child ID number used by mysensors when the number 5 is dailed
#define chuildIdDail_6 106    // child ID number used by mysensors when the number 6 is dailed
#define chuildIdDail_7 107    // child ID number used by mysensors when the number 7 is dailed
#define chuildIdDail_8 108    // child ID number used by mysensors when the number 8 is dailed
#define chuildIdDail_9 109    // child ID number used by mysensors when the number 9 is dailed
#define chuildIdDail_10 110   // child ID number used by mysensors when the number 0 is dailed

// ###### Include libraries #####
#include <SPI.h>              // needed for NRF24
#include <MySensors.h>        // mysensors library
#include <Bounce2.h>          // for debouncing buttons and dail

// ###### I/O pin number setup ######
#define button 3              // input pin activated when doorbell button is pressed
#define edail 8               // input pin activated when dail is used (Enable Dail)
#define pdail 7               // input pin activated with each tick of the dail (Pulse Dial)
#define lbell 4               // output pin to swing bellh hamer left
#define rbell 5               // output Pin to swing bellh hamer right

// ##### Debouncer variables #####
Bounce debouncerButton = Bounce(); // Create button debouncer for doorbell button 
Bounce debouncerEdail = Bounce();  // Create button debouncer for Enable Dail
Bounce debouncerPdail = Bounce();  // Create button debouncer for Pulse Dial 
int valueButton = 0;               // Value 
int oldValueButton = 0;
int valueEdail = 0;
int oldValueEdail = 0;
int valuePdail = 0;
int oldValuePdail = 0;



int dailCount = 0;
int newDailCount = 0;  

unsigned long currentMillis = 0;
unsigned long onPulseMillis = 0;
unsigned long offPulseMillis = 0;
unsigned long ringPauseMillis = 0;
int CoilPowered = 0;
int RingCyclePhase = 0;


int ring = 0;
int ringX = 15;
int onPulse = 20;
int offPulse = 10;
int repeat = 0;
int repeatX = 3;
int ringPause = 2000;

// ##### setup MySensors message containers #####
MyMessage msgDoor(childIdDoor,V_STATUS);         // message container used for doorbell button
MyMessage msgDail_1(chuildIdDail_1,V_STATUS);    // message container used when the number 1 is dailed
MyMessage msgDail_2(chuildIdDail_2,V_STATUS);    // message container used when the number 2 is dailed
MyMessage msgDail_3(chuildIdDail_3,V_STATUS);    // message container used when the number 3 is dailed
MyMessage msgDail_4(chuildIdDail_4,V_STATUS);    // message container used when the number 4 is dailed
MyMessage msgDail_5(chuildIdDail_5,V_STATUS);    // message container used when the number 5 is dailed
MyMessage msgDail_6(chuildIdDail_6,V_STATUS);    // message container used when the number 6 is dailed
MyMessage msgDail_7(chuildIdDail_7,V_STATUS);    // message container used when the number 7 is dailed
MyMessage msgDail_8(chuildIdDail_8,V_STATUS);    // message container used when the number 8 is dailed
MyMessage msgDail_9(chuildIdDail_9,V_STATUS);    // message container used when the number 9 is dailed
MyMessage msgDail_10(chuildIdDail_10,V_STATUS);  // message container used when the number 0 is dailed

void setup()  
{  
//##### I/O pin function setup #####
  pinMode(button,INPUT);    //set the already defined I/O pin as input
  pinMode(edail, INPUT);    //set the already defined I/O pin as input
  pinMode(pdail, INPUT);    //set the already defined I/O pin as input
  pinMode(lbell, OUTPUT);   //set the already defined I/O pin as output
  pinMode(rbell, OUTPUT);   //set the already defined I/O pin as output
 
// ##### Debouncer setup #####
  debouncerButton.attach(button);
  debouncerButton.interval(5);
  debouncerEdail.attach(edail);
  debouncerEdail.interval(5);
  debouncerPdail.attach(pdail);
  debouncerPdail.interval(5);
}

// ##### Function of MySensors that presents all attached sensors to the controller #####
void presentation() { 
  sendSketchInfo(ProjectName, ProjectVersion);   // Send the sketch version information to the gateway and Controller
  present(childIdDoor, S_BINARY);                // Present doorbell button as binary switch
  present(chuildIdDail_1, S_BINARY);             // Present the dailing of number 1 as binary switch
  present(chuildIdDail_2, S_BINARY);             // Present the dailing of number 2 as binary switch
  present(chuildIdDail_3, S_BINARY);             // Present the dailing of number 3 as binary switch
  present(chuildIdDail_4, S_BINARY);             // Present the dailing of number 4 as binary switch
  present(chuildIdDail_5, S_BINARY);             // Present the dailing of number 5 as binary switch
  present(chuildIdDail_6, S_BINARY);             // Present the dailing of number 6 as binary switch
  present(chuildIdDail_7, S_BINARY);             // Present the dailing of number 7 as binary switch
  present(chuildIdDail_8, S_BINARY);             // Present the dailing of number 8 as binary switch
  present(chuildIdDail_9, S_BINARY);             // Present the dailing of number 9 as binary switch
  present(chuildIdDail_10, S_BINARY);            // Present the dailing of number 0 as binary switch
}

void loop() {

  currentMillis = millis();                      // update timer

// ##### debouncer updater ##### 
  debouncerButton.update();                      // Update debouncer for doorbell button
  valueButton = debouncerButton.read();          // Set current value of doorbell button 
  debouncerEdail.update();                       // Update debouncer for enable dail
  valueEdail = debouncerEdail.read();            // Set current value of enable dail
  debouncerPdail.update();                       // Update debouncer for pulse dail 
  valuePdail = debouncerPdail.read();            // Set current value of pulse dail

// ##### Mysensors code to check doorbell button and sent message ##### 
  if (valueButton != oldValueButton) {                       // Check if the value of the button has changed 
     send(msgDoor.set(valueButton==HIGH ? 1 : 0));           // Transmit the new value
     if (valueButton == HIGH ){ 
        ringTone_0(); 
       }
     oldValueButton = valueButton;                           // Change old value so this doenst loop
  }

// ##### Mysensors code to read dail counter and sent message as one individual sensor #####
  switch (newDailCount) {         // Check the current vallue of the completed counter
     case 1:                      // if value is equal to 1 
       send(msgDail_1.set(1));    // Transmit ON message for dail switch 1 
       send(msgDail_1.set(0));    // Transmit OFF message for dail switch 1. Some home automation software prefers this.
       break;                     // end of case
     case 2:                      // if value is equal to 2 
       send(msgDail_2.set(1));    // Transmit ON message for dail switch 2
       send(msgDail_2.set(0));    // Transmit OFF message for dail switch 2. Some home automation software prefers this.
       break;                     // end of case
     case 3:                      // if value is equal to 3 
       send(msgDail_3.set(1));    // Transmit ON message for dail switch 3
       send(msgDail_3.set(0));    // Transmit OFF message for dail switch 3. Some home automation software prefers this.
       break;                     // end of case
     case 4:                      // if value is equal to 4 
       send(msgDail_4.set(1));    // Transmit ON message for dail switch 4 
       send(msgDail_4.set(0));    // Transmit OFF message for dail switch 4. Some home automation software prefers this.
       break;                     // end of case
     case 5:                      // if value is equal to 5 
       send(msgDail_5.set(1));    // Transmit ON message for dail switch 5 
       send(msgDail_5.set(0));    // Transmit OFF message for dail switch 5. Some home automation software prefers this.
       break;                     // end of case
     case 6:                      // if value is equal to 6 
       send(msgDail_6.set(1));    // Transmit ON message for dail switch 6 
       send(msgDail_6.set(0));    // Transmit OFF message for dail switch 6. Some home automation software prefers this.
       break;                     // end of case       
     case 7:                      // if value is equal to 7 
       send(msgDail_7.set(1));    // Transmit ON message for dail switch 7 
       send(msgDail_7.set(0));    // Transmit OFF message for dail switch 7. Some home automation software prefers this.
       break;                     // end of case       
     case 8:                      // if value is equal to 8 
       send(msgDail_8.set(1));    // Transmit ON message for dail switch 8 
       send(msgDail_8.set(0));    // Transmit OFF message for dail switch 8. Some home automation software prefers this.
       break;                     // end of case       
     case 9:                      // if value is equal to 9 
       send(msgDail_9.set(1));    // Transmit ON message for dail switch 9 
       send(msgDail_9.set(0));    // Transmit OFF message for dail switch 9. Some home automation software prefers this.
       break;                     // end of case       
     case 10:                     // if value is equal to 10 
       send(msgDail_10.set(1));    // Transmit ON message for dail switch 10 
       send(msgDail_10.set(0));    // Transmit OFF message for dail switch 10. Some home automation software prefers this.
       break;                     // end of case       
  }
  newDailCount = 0;                // Reset the completed counter so this doesnt loop

  
// ###### Code for checking enable dail and sending state trough serial  ######  
  if (valueEdail != oldValueEdail && valueEdail == HIGH) {          // Check if enable dail has changed AND if its currently its currently activated
     Serial.println("dail is activated...");                        // If so sent message 
     oldValueEdail = valueEdail;}                                   // And change old value so this doenst loop
     else if (valueEdail != oldValueEdail && valueEdail == LOW) {   // Check if enable dail has changed AND if its currently its currently deactivated
     Serial.println("dail is deactivated...");                      // If so sent message
     newDailCount = dailCount;                                      // Write the counted pulses to the New Dail Count
     dailCount = 0;                                                 // Reset the dail count for next dail 
     oldValueEdail = valueEdail;                                    // And change old value so this doenst loop
  }

// ###### Code for checking pusle dail and sending state trough serial ######
  if (valuePdail != oldValuePdail && valueEdail == HIGH) {          // Check if dail pulse has changed AND if currently its currently activated
     if (valuePdail == LOW) {                                       // Only take action when the signal goes from high to low to prevent double count
        dailCount++;                                                 // If the conditions are met increase counter by 1
        Serial.print("Tick! Total ammout of pulses: ");              // Serial print a messagge saying a pulse was detected
        Serial.println (dailCount);                                  // Serial print a the current value of the counter
     }
       oldValuePdail = valuePdail;                                  // Change old value so this doenst loop  
  }
}


void ringTone_0() { 
//     while (repeat < repeatX){                              // start a loop if the number of repeats isnt reached yet (a repeat is the time a bell is ringed pauesed)
//        repeat++;                                           // add 1 count to the "repeat" counter
        while (ring < ringX){                               // start a loop if the number of rings isnt reached yet (a ring is the hammer hitting each bell once)
           currentMillis = millis(); 
           if (CoilPowered == LOW && RingCyclePhase == 0) {                         // only activate coil if the coil is powered down and the ring cycle is complete
              CoilPowered = HIGH;                                                   // enable safety bit that can be checked if coil is powered 
              RingCyclePhase = 1;                                                   // set ring cycle phase to 1 (coil powered to move hammer left)
              digitalWrite(lbell, HIGH);                                            // power coil to swing hammer into left poistion
              onPulseMillis = currentMillis;                                        // set start for timer for the on pulse 
              Serial.println ("left bell high");
           }
           if (currentMillis - onPulseMillis >= onPulse && RingCyclePhase == 1) {   // Check if the set time (onPulse) has passed and the ring cycle is still in phase 1
              digitalWrite(lbell, LOW);                                             // power down coil
              CoilPowered = LOW;                                                    // disable safety bit that can be checked if coil is powered 
              RingCyclePhase = 2;                                                   // set ring cycle phase to 2 (coil powered down after moving hammer left)              
              offPulseMillis = currentMillis;                                       // set start for timer for the off pulse
              Serial.println ("left bell low");
           }
           if (currentMillis - offPulseMillis >= offPulse && RingCyclePhase == 2 && CoilPowered == LOW) {   // check if the set time (offPulse) has passed and the ring cycle is still in phase 2
              CoilPowered = HIGH;                                                   // enable safety bit that can be checked if coil is powered
              RingCyclePhase = 3;                                                   // set ring cycle phase to 3 (coil powered to move hammer right)
              digitalWrite(rbell, HIGH);                                            // power coil to swing hammer into right poistion
              onPulseMillis = currentMillis;                                        // set start for timer for the on pulse 
              Serial.println ("right bell high");
           }
           if (currentMillis - onPulseMillis >= onPulse && RingCyclePhase == 3) {   // check if the set time (onPulse) has passed and the ring cycle is still in phase 3
              digitalWrite(rbell, LOW);                                             // power down coil
              CoilPowered = LOW;                                                    // disable safety bit that can be checked if coil is powered  
              RingCyclePhase = 4;                                                   // set ring cycle phase to 4 (coil powered down after moving hammer left)              
              offPulseMillis = currentMillis;                                       // set start for timer for the off pulse
              Serial.println ("right bell low");
           }
           else if (currentMillis - offPulseMillis >= offPulse && RingCyclePhase == 4) { // check if the set time (offPulse) has passed and the ring cycle is still in phase 4
              RingCyclePhase = 0;                                                   // set ring cycle phase to 0 (ring cycle completed)           
              ring++;                                                               // add 1 count to the "ring" counter    
           }
        }
      wait (ringPause);                   // wait for the amount of ms set for "ringPause"
           if (ring == ringX){              // if the amount of "ring" is the same as the amount set in "ringX"....
              ring = 0;                     // reset the "ring" counter
//              }
//         }
//  if (repeat == repeatX){                   // if the amount of "repeat" is the same as the amount set in "repeatX"....
//     repeat = 0;                            // reset the "repeat" counter
//     } 
//}


  • Joepla
  • Registratie: maart 2005
  • Laatst online: 10:46

Joepla

Geavanceerde micro-elektronica

Voor een project heb ik een blauw 2x16 LCD gebruikt. Staat 24/7 aan en na een maand of 4 is de leesbaarheid drastisch afgenomen. Zowel van de helderheid (blauw) als het contrast (wit) is niet veel meer over. Een ander projectje dat slechts enkele minuten per week ingeschakeld wordt, heeft hetzelfde LCD, maar is nog prima te lezen.

Dacht eerst dat het een kwestie was van voedingsspanning en contrastpotmeter, maar alleen het vervangen van het display was de oplossing. Vraag me af of dit een pechgeval was of dat er gewoon slechte LCD's geleverd worden...

Live solarinfo op PVoutput [6,625 kWp]


  • SuperKris
  • Registratie: juni 2010
  • Laatst online: 15:51
Dit verhaal is inmiddels denk ik duidelijk. Zie hier het voltooide project:
Electronics & Home Automation: Old school phone as doorbell and domoitcs inte...!

Ander vraagje, Is er iemand bekend met deze displays?
https://nl.aliexpress.com...y-Module/32683094040.html



Het gaat mij vooral om hoe ik het I2C adres kan wijzigen. Deze OLED's hebben een SH1106 schip. De overduidelijke jumper die te zien zijn, zijn voor het omwisselen van de VCC en GND pin. Niet voor het adres helaas.

Ik wil het adres kunnen wijzigen omdat ik 2 displays per arduino gebruik.

SuperKris wijzigde deze reactie 19-11-2018 19:08 (15%)


  • farlane
  • Registratie: maart 2000
  • Laatst online: 11:07
Two bit slave addresses (0111100 and 0111101) are reserved for the SH1106. The least significant bit of the slave address is set by connecting the input SA0 to either logic 0(VSS) or 1(VDD1).
Alleen de vraag of je bij dat pinnetje kunt ..... Chinees eh....

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • SuperKris
  • Registratie: juni 2010
  • Laatst online: 15:51
farlane schreef op maandag 19 november 2018 @ 21:16:
[...]


Alleen de vraag of je bij dat pinnetje kunt ..... Chinees eh....
Ja, dat had ik ook al teruggevonden, maar die chip zit achter de display. Ik heb al 1 hoek afgebroken in een poging tot er achter komen. Het is gangbaar bij deze displays dat er een jumper voor het adres zit.

Vermoedelijk zal het aanpassen van het adres ook wel kunnen via 1 van de weerstanden, maar welke he....

  • SnowDude
  • Registratie: januari 2002
  • Laatst online: 12-12 16:49
SuperKris schreef op dinsdag 20 november 2018 @ 10:22:
[...]


Ja, dat had ik ook al teruggevonden, maar die chip zit achter de display. Ik heb al 1 hoek afgebroken in een poging tot er achter komen. Het is gangbaar bij deze displays dat er een jumper voor het adres zit.

Vermoedelijk zal het aanpassen van het adres ook wel kunnen via 1 van de weerstanden, maar welke he....
Ik ga er niet van uit dat je via een van de weerstanden het adres kan wijzigen. Als er adres selectie mogenlijk is dan wordt dat ook door de Chinezen echt wel zichtbaar gemaakt.

Ik denk eerder dat dit een chip-on-board PCB is en dat de adres pins hard-wired zijn.

Voorbeeld van chip-on-board:



All electric components run on smoke. If you let the smoke out, they won't work anymore.


  • SuperKris
  • Registratie: juni 2010
  • Laatst online: 15:51
SnowDude schreef op dinsdag 20 november 2018 @ 10:57:
[...]

Ik ga er niet van uit dat je via een van de weerstanden het adres kan wijzigen. Als er adres selectie mogenlijk is dan wordt dat ook door de Chinezen echt wel zichtbaar gemaakt.

Ik denk eerder dat dit een chip-on-board PCB is en dat de adres pins hard-wired zijn.

Voorbeeld van chip-on-board:

[Afbeelding]

[Afbeelding]
Die kans is natuurlijk groot, maar met een beetje geluk hebben ze een weerstand gebruikt om hem naar voeding of GND te trekken.

  • Springuin
  • Registratie: juli 2002
  • Laatst online: 12-12 12:15
Joepla schreef op zaterdag 17 november 2018 @ 09:41:
Voor een project heb ik een blauw 2x16 LCD gebruikt. Staat 24/7 aan en na een maand of 4 is de leesbaarheid drastisch afgenomen. Zowel van de helderheid (blauw) als het contrast (wit) is niet veel meer over. Een ander projectje dat slechts enkele minuten per week ingeschakeld wordt, heeft hetzelfde LCD, maar is nog prima te lezen.

Dacht eerst dat het een kwestie was van voedingsspanning en contrastpotmeter, maar alleen het vervangen van het display was de oplossing. Vraag me af of dit een pechgeval was of dat er gewoon slechte LCD's geleverd worden...
Leds nemen af in helderheid naarmate de gebruiksduur vordert. In de praktijk zie je dat bij witte en blauwe leds het duidelijkst. Wat achtergrond info: https://www.radio-electro...etime-expectancy-mtbf.php

Ik heb ooit een toetsenbord met blauwe leds gehad: na een paar jaar gebruik waren capslock en scrolllock nog steeds fel en numlock een stuk minder fel.

  • Joepla
  • Registratie: maart 2005
  • Laatst online: 10:46

Joepla

Geavanceerde micro-elektronica

@Springuin Dat de helderheid van LEDs afneemt met de tijd, is bekend. Zoals in jouw link ook staat, is een levensduur van 50.000 tot 100.000 uur te verwachten. In mijn geval hebben we het over minder dan 3000 uur en dat is wat mij verrast. Dat is echt extreem weinig.

Het 2e display is sinds vorige week in bedrijf. Eens kijken hoe lang deze het uithoudt...

Joepla wijzigde deze reactie 20-11-2018 17:05 (14%)

Live solarinfo op PVoutput [6,625 kWp]


  • mcDavid
  • Registratie: april 2008
  • Laatst online: 19:19
50.000 tot 100.000 is volgens mij wel érg veel hoor. Meestal zie je getallen rond de 10.000-20.000 uur.

Wel is bekend dat blauwe led's (en dus ook witte led's) relatief snel degraderen. Hoewel hedendaagse led's (zoals die in oled displays) dat inmiddels redelijk onder controle lijken te hebben, kan het maar zo dat voor zo'n displaytje gewoon de goedkoopste van de goedkoopste led zit.

Daarnaast heb je kans dat ie gewoon dik boven zijn rated werkstroom gezeten heeft. Als je de backlight kunt dimmen zou ik dat zeker aanraden, kan de leeftijd flink verlengen.

zcflevo.nl


  • Joepla
  • Registratie: maart 2005
  • Laatst online: 10:46

Joepla

Geavanceerde micro-elektronica

@mcDavid Ben het met je eens dat 100.000 uur voor een LCD dat minder dan 2 euro kost, niet realistisch is.
Dimmen: ik zou er een weerstandje tussen kunnen plaatsen, of PWM aansturen. Op zich geen gek idee om zo de levensduur wat te verlengen.

Live solarinfo op PVoutput [6,625 kWp]


  • farlane
  • Registratie: maart 2000
  • Laatst online: 11:07
@SuperKris Optie: https://learn.adafruit.co...iplexer-breakout/overview

farlane wijzigde deze reactie 20-11-2018 23:07 (7%)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
Hallo,

sommige zullen mij misschien nog herinneren, ben inmiddels paar jaartjes weg geweest (4) en heb toen alle elek in doos gestopt.
dat was de derde keer in mijn hobby-studie-'carriere'

de doos zit nog steeds dicht maar kwam laatst toch iets leuks tegen wat ik hier wil delen.

namelijk tinkercad

https://www.tinkercad.com/learn/circuits/learning

en samen met deze video-serie is er voor beginners vrijwel geen kosten aan verbonden

https://arduino-lessen.nl/

mijn persoonlijke focus (op dit moment en hopelijk hou ik het vol zonder in de hoek te leggen), is het proberen te leren van c++ met visual studio 2017.

http://www.ronkes.nl/oldprogrammeren/index.html

veel toetsenbord dus en weinig geknoop of geknutsel en stilstand is geen achteruitgang, wat ik eerder heb toegepast komt nog steeds van pas.


iedereen nog de beste wensen voor 2019 :)

  • Goner
  • Registratie: mei 2002
  • Laatst online: 11-12 16:01

Goner

What can I do you for ?

hoi,
niet echt mijn terrein dit, dus wellicht domme vraag.
m'n dochter is bezig met een projectje op een Arduino, met ledlampjes. Vroeg me af wat voor krimpkousjes (?) jullie gebruiken om de 2 pootjes van de led te verbinden met power-kabeltjes ??
en wie verkoopt ze ?

Goner wijzigde deze reactie 14-01-2019 20:48 (4%)

Gigabyte GA-MA770T-UD3 / AMD Phenom II X4 955e / 8GB DDR3-SDRAM / NVIDIA GeForce GTX 750 Ti / Acer K222HQL / Windows 7 Home Premium SP1 (64-bit)


  • Yucon
  • Registratie: december 2000
  • Laatst online: 20:29

Yucon

*broem*

Goner schreef op maandag 14 januari 2019 @ 20:47:
hoi,
niet echt mijn terrein dit, dus wellicht domme vraag.
m'n dochter is bezig met een projectje op een Arduino, met ledlampjes. Vroeg me af wat voor krimpkousjes (?) jullie gebruiken om de 2 pootjes van de led te verbinden met power-kabeltjes ??
en wie verkoopt ze ?
Geen. Maar als, dan gewoon normale. Zou je bij conrad moeten kunnen krijgen.

Voor een led heb je trouwens meestal wel een weerstandje nodig, dus als je de led pootjes wilde isoleren en dan direct op de pinnen wil aansluiten gaat dat niet geweldig goed.

  • mcDavid
  • Registratie: april 2008
  • Laatst online: 19:19
Heb je daar uberhaupt verschillende soorten van? Ik kies altijd gewoon de goedkoopste :P

En bestel ze meestal bij een bezorgchinees op ebay of aliexpress. Maar in een bouwmarkt of zo vind je ze ook wel.

zcflevo.nl


  • farlane
  • Registratie: maart 2000
  • Laatst online: 11:07
Goner schreef op maandag 14 januari 2019 @ 20:47:
hoi,
niet echt mijn terrein dit, dus wellicht domme vraag.
m'n dochter is bezig met een projectje op een Arduino, met ledlampjes. Vroeg me af wat voor krimpkousjes (?) jullie gebruiken om de 2 pootjes van de led te verbinden met power-kabeltjes ??
en wie verkoopt ze ?
Is het voor een "eindprodukt'? Ander zou ik gewoon een breadboard gebruiken, hoef je helemaal geen draadjes te solderen.

En anders https://www.allekabels.nl/kabel_accessoires/krimpkous.html perhaps....

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Goner
  • Registratie: mei 2002
  • Laatst online: 11-12 16:01

Goner

What can I do you for ?

Bedankt voor alle reacties.
Oplossing was inderdaad breadbord en solderen. Krimpkousjes zijn er gewoon niet zo smal. Trouwens een geweldige winkel gevonden voor dit soort spullen, Radio Twenthe in Den Haag.

Op naar volgende uitdaging ; geluid en licht tegelijk aansturen. Maar eens gaan Googelen. Wel grappig, ik heb jaaaaren geprogrammeerd en nu kan ik misschien m'n dochter die een grafische opleiding volgt, helpen ;-)

Gigabyte GA-MA770T-UD3 / AMD Phenom II X4 955e / 8GB DDR3-SDRAM / NVIDIA GeForce GTX 750 Ti / Acer K222HQL / Windows 7 Home Premium SP1 (64-bit)


  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 20:16

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Ik heb een woordklok gemaakt, erg leuk geworden. De basis is dit project: https://bitlair.nl/Projects/word_clock_workshop

De gebruikte firmware is deze: https://github.com/niekpr...lob/master/word-clock.ino

Nu is het zo dat de kleuren statisch ingesteld zijn bij het uploaden. Ik zou graag elk uur een andere kleur willen tonen. Ik ben al wat aan het proberen geweest, maar krijg het niet voor elkaar.

Wat ik heb geprobeerd is om de #define op regel 59-61 te wijzigen in:

C++:
1
2
3
int R_VALUE = 0;
int G_VALUE = 255;
int B_VALUE = 0;



Op regel 278 heb ik dit ertussen gezet:

C++:
1
if (current_hourword==18) R_VALUE = 0, G_VALUE = 0, B_VALUE = 255;



Maar helaas blijven de LEDs groen en gaan ze niet op blauw :-(
De sketch compileert overigens wel zonder fouten verder.

Waar in het script moet ik de code voor het aanpassen van de kleuren zetten? Als ik dat eenmaal weet kom ik er zelf wel uit om elk uur wat anders te tonen vermoed ik.

ThinkPad wijzigde deze reactie 19-01-2019 18:15 (3%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Vuikie
  • Registratie: december 2003
  • Laatst online: 09:46
ThinkPad schreef op zaterdag 19 januari 2019 @ 18:12:
Ik heb een woordklok gemaakt, erg leuk geworden. De basis is dit project: https://bitlair.nl/Projects/word_clock_workshop

De gebruikte firmware is deze: https://github.com/niekpr...lob/master/word-clock.ino

Nu is het zo dat de kleuren statisch ingesteld zijn bij het uploaden. Ik zou graag elk uur een andere kleur willen tonen. Ik ben al wat aan het proberen geweest, maar krijg het niet voor elkaar.

Wat ik heb geprobeerd is om de #define op regel 59-61 te wijzigen in:

C++:
1
2
3
int R_VALUE = 0;
int G_VALUE = 255;
int B_VALUE = 0;



Op regel 278 heb ik dit ertussen gezet:

C++:
1
if (current_hourword==18) R_VALUE = 0, G_VALUE = 0, B_VALUE = 255;



Maar helaas blijven de LEDs groen en gaan ze niet op blauw :-(
De sketch compileert overigens wel zonder fouten verder.

Waar in het script moet ik de code voor het aanpassen van de kleuren zetten? Als ik dat eenmaal weet kom ik er zelf wel uit om elk uur wat anders te tonen vermoed ik.
Hey cool, ik heb ook een woordklok gemaakt, alleen dan met een ESP-01 :Y)



Even terugkomend op jouw'n probleem.

Als ik dit zo lees dan rekenen ze de klok om van 24 naar 12 uur

C++:
1
2
3
4
5
6
7
8
    // calculate target brightnesses:
    int current_hourword = hour();
    if(current_hourword>12) current_hourword = current_hourword - 12; // 12 hour clock, where 12 stays 12 and 13 becomes one
    if(current_hourword==0) current_hourword = 12;            // 0 is also called 12

    int next_hourword = hour()+1;
    if(next_hourword>12) next_hourword = next_hourword - 12;      // 12 hour clock, where 12 stays 12 and 13 becomes one
    if(next_hourword==0) next_hourword = 12;              // 0 is also called 12



Dus current_hourword is op regel 278 altijd minder dan 18 (Zie regel 272):

C++:
1
if (current_hourword==18) R_VALUE = 0, G_VALUE = 0, B_VALUE = 255;


Bovenstaande gaat dus niet werken, probeer het volgende eens:

C++:
1
if (hour()==18) R_VALUE = 0, G_VALUE = 0, B_VALUE = 255;



Of zet jou originele code tussen de huidige regel 271 en 272 in, zodat current_hourword nog niet is omgerekend.

C++:
1
2
3
4
5
6
7
8
9
    // calculate target brightnesses:
    int current_hourword = hour();
    if (current_hourword==18) R_VALUE = 0, G_VALUE = 0, B_VALUE = 255;
    if(current_hourword>12) current_hourword = current_hourword - 12; // 12 hour clock, where 12 stays 12 and 13 becomes one
    if(current_hourword==0) current_hourword = 12;            // 0 is also called 12

    int next_hourword = hour()+1;
    if(next_hourword>12) next_hourword = next_hourword - 12;      // 12 hour clock, where 12 stays 12 and 13 becomes one
    if(next_hourword==0) next_hourword = 12;              // 0 is also called 12

Vuikie wijzigde deze reactie 20-01-2019 12:07 (13%)


  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 20:16

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Vuikie schreef op zondag 20 januari 2019 @ 12:03:
[...]
Bovenstaande gaat dus niet werken, probeer het volgende eens:

C++:
1
if (hour()==18) R_VALUE = 0, G_VALUE = 0, B_VALUE = 255;


[...]
Thanks, dit werkt :)

Heb nu het volgende om de kleur te laten wisselen:

C++:
1
2
    //Change color every hour
    if (minute()==0 && second()==0) R_VALUE = random(0,255), G_VALUE = random(0,255), B_VALUE = random(0,255);


Ik kan alleen geen miliseconden opgeven (de functie milliseconds() kent de IDE niet). Dit zorgt ervoor dat hij heel even door de kleuren wisselt voordat hij op een nieuwe kleur staat. Hoe kan ik dat nog voorkomen? (anders is het te onrustig in m'n ooghoek). Heb geprobeerd om zelf miliseconden te berekenen (second() / 1000) maar dat had geen effect.

ThinkPad wijzigde deze reactie 20-01-2019 16:02 (5%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Rowwan
  • Registratie: november 2000
  • Laatst online: 19:34
Begrijp je ook waarom hij dat doet? Hij blijft de volledige seconde de kleuren wisselen. Je kunt dit oplossen door nog een variabele te gebruiken.


code:
1
2
3
//Change color every hour
    if (minute()==0 && second()==0 && !completed) R_VALUE = random(0,255), G_VALUE = random(0,255), B_VALUE = random(0,255), completed = true;
    if (minute()==0 && second()==1) completed = false;


  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 20:16

ThinkPad

Moderator Duurzame Energie & Domotica

L460

@Rowwan Bedankt, het werkt nu helemaal naar wens :)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • tsjoender
  • Registratie: april 2005
  • Laatst online: 19:58
@ThinkPad Tof project! Heb je de faceplate met de woorden met een lasersnijder gemaakt of heb je gewoon een geprint vel papier gebruikt waar het licht op de onbedrukte delen meer doorschijnt?

  • SToRM666
  • Registratie: juli 2005
  • Laatst online: 11:03
Ondertussen heb ik alweer enkele maanden geen updates meer geplaatst, maar ik heb niet helemaal stil gezeten! :) Ik heb enkele maanden geleden een 3D printer gekocht en heb toen besloten om de behuizing van mijn wake-up light dus ook te 3D printen. Ik heb eerst wat moeten leren werken met Fusion 360, maar dat begint nu al aardig te lukken.

Ik heb gisteren de bodem dan eindelijk afgeprint en hieronder het resultaat. Het ontwerp is nog altijd ongeveer hetzelfde, maar dan vooral beter en netter:


Oud en nieuw naast elkaar, toch wel een kleine upgrade denk ik zo :D


Alles past er perfect in tot nu toe. Ik heb er wel redelijk wat tijd in gestoken met kleine testprints om alles zo goed mogelijk passend te krijgen:



Wat kleine details, zoals een sleuf voor de geheugenkaart, verzonken gaten voor de schroeven en ook alvast iets verzonken rondjes voorzien voor van die rubberen voetjes:


Dit is hetgene wat er nog in moet komen:


Er is nog wel wat werk aan. Het deksel is al redelijk ver klaar, maar ik moet nu nog eerst wat beugeltjes en houders voor onder andere de Arduino ontwerpen en printen.
De wekker gaat uiteindelijk ook in een two-tone geprint worden, dus het deksel krijgt een andere kleur, wat wel erg mooi gaat worden denk ik zo :)

Upates volgen binnenkort!

SToRM666 wijzigde deze reactie 21-01-2019 23:57 (3%)

PSN id: NL_SToRM


  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 20:16

ThinkPad

Moderator Duurzame Energie & Domotica

L460

tsjoender schreef op zondag 20 januari 2019 @ 17:35:
@ThinkPad Tof project! Heb je de faceplate met de woorden met een lasersnijder gemaakt of heb je gewoon een geprint vel papier gebruikt waar het licht op de onbedrukte delen meer doorschijnt?
Lasersnijder heb ik helaas niet in m’n omgeving. Wat ik heb gedaan is de faceplate printen met m’n laserprinter. Om het zwart goed lichtdicht te krijgen heb ik hetzelfde vel er 6x doorheen gehaald. Kost best veel toner denk ik, maar het werkt wel goed.

Het raster heeft mrs. * ThinkPad gemaakt van karton en hotglue :D

ThinkPad wijzigde deze reactie 20-01-2019 20:12 (7%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • tsjoender
  • Registratie: april 2005
  • Laatst online: 19:58
ThinkPad schreef op zondag 20 januari 2019 @ 20:07:
[...]

Lasersnijder heb ik helaas niet in m’n omgeving. Wat ik heb gedaan is de faceplate printen met m’n laserprinter. Om het zwart goed lichtdicht te krijgen heb ik hetzelfde vel er 6x doorheen gehaald. Kost best veel toner denk ik, maar het werkt wel goed.

Het raster heeft mrs. * ThinkPad gemaakt van karton en hotglue :D
Goed idee. Ik heb ook geen lasersnijder tot mijn beschikking, maar een laserprinter wel :) Bij het volgende bezoek aan de Ikea meteen maar zo'n fotolijstje meenemen. Dank voor het delen!

  • SToRM666
  • Registratie: juli 2005
  • Laatst online: 11:03
De beugeltjes voor de binnenkant zijn af, dus het aansluiten van de componenten kan beginnen! :D





Ik ben wel enorm tevreden met het resultaat tot nu toe 8)
Nu nog proberen om alle stroomdraadjes netjes aan te sluiten en weg te werken.

SToRM666 wijzigde deze reactie 24-01-2019 22:42 (9%)

PSN id: NL_SToRM


  • SToRM666
  • Registratie: juli 2005
  • Laatst online: 11:03
Vandaag zo goed als alles terug aangesloten. Vooral het wegwerken van de te lange + en - draden was wat werk, de rest ging wel vlot moet ik zeggen :)







De ledstrip is voor nu nog met de oude bekabeling en de led knop moet ik ook nog even solderen. En dan nog even de lichtsensor op de juiste lengte, maar dan moet ik eerst nog een beugeltje maken waar die in past.

Morgen even de bedrading nalopen en testen of alles nog werkt.

SToRM666 wijzigde deze reactie 26-01-2019 20:25 (12%)

PSN id: NL_SToRM


  • SToRM666
  • Registratie: juli 2005
  • Laatst online: 11:03
Gisteren de eerste test en alles werkte nog :)



Daarna de aansluiting voor de ledstrip en de snooze knop gesoldeerd:



De snooze knop is nu ook vastgezet met een 3D geprinte beugel. De kabels voor de andere knoppen gaan ook aangepast worden. Het tweaken van de software ben ik nu ook mee bezig.

PSN id: NL_SToRM


  • Fore!
  • Registratie: februari 2009
  • Laatst online: 13-12 22:00
Heeft iemand ervaring met het toepassen van flexsensoren? Ik kan er in algemeenheid voldoende over vinden, maar ik wil het als bewegingsdetector misbruiken in traptreden.
Dmv de flexsensoren onder de traptreden kan ik het verschil uitzoeken ( bijvoorbeeld ;) een kat en mens).

Toepassingen van detectie op de trap zie ik alleen terug komen als bewegingsensoren.
Ik lees dat gewicht sensoren ongeschikt zijn om op te staan en stuk kunnen gaan, dus dat lijkt af te vallen.

Of kun je met bewegingsensoren ook de "hoeveelheid" beweging meten? En dan niet zo zeer de afstand gevoeligheid. Of moet ik daar dan toch kleine camera's voor inzetten en het beeld analyseren?(absoluut niet de voorkeur)

Ik zie namelijk online helemaal geen toepassingen van flexsensoren in trappen. Zijn deze daar niet gevoelig genoeg voor om de kromming te meten aan de onderkant kan de trede?

Ik ben overigens beginnende, en dit leek mij een redelijke simpele 2e stap om mee verder te gaan.
Zo 6 treden monitoren, 3 boven en beneden om de richting te bepalen en uit eindelijk deze data gebruiken voor schakelingen in domotica software.

  • vincent_1971
  • Registratie: juni 2004
  • Laatst online: 13-12 18:10
Fore! schreef op dinsdag 29 januari 2019 @ 07:34:
Heeft iemand ervaring met het toepassen van flexsensoren? Ik kan er in algemeenheid voldoende over vinden, maar ik wil het als bewegingsdetector misbruiken in traptreden.
Dmv de flexsensoren onder de traptreden kan ik het verschil uitzoeken ( bijvoorbeeld ;) een kat en mens).

Toepassingen van detectie op de trap zie ik alleen terug komen als bewegingsensoren.
Ik lees dat gewicht sensoren ongeschikt zijn om op te staan en stuk kunnen gaan, dus dat lijkt af te vallen.

Of kun je met bewegingsensoren ook de "hoeveelheid" beweging meten? En dan niet zo zeer de afstand gevoeligheid. Of moet ik daar dan toch kleine camera's voor inzetten en het beeld analyseren?(absoluut niet de voorkeur)

Ik zie namelijk online helemaal geen toepassingen van flexsensoren in trappen. Zijn deze daar niet gevoelig genoeg voor om de kromming te meten aan de onderkant kan de trede?

Ik ben overigens beginnende, en dit leek mij een redelijke simpele 2e stap om mee verder te gaan.
Zo 6 treden monitoren, 3 boven en beneden om de richting te bepalen en uit eindelijk deze data gebruiken voor schakelingen in domotica software.
Zou voor een druk sensor gaan.
B.v.
https://www.sparkfun.com/products/11207

Zou zelf niet voor flexsensor gaan, de kromming van de hoek zal minimaal zijn als een huisdier erop loopt laat staan de weerstandsverandering.

  • SToRM666
  • Registratie: juli 2005
  • Laatst online: 11:03
Fore! schreef op dinsdag 29 januari 2019 @ 07:34:
Heeft iemand ervaring met het toepassen van flexsensoren? Ik kan er in algemeenheid voldoende over vinden, maar ik wil het als bewegingsdetector misbruiken in traptreden.
Dmv de flexsensoren onder de traptreden kan ik het verschil uitzoeken ( bijvoorbeeld ;) een kat en mens).

Toepassingen van detectie op de trap zie ik alleen terug komen als bewegingsensoren.
Ik lees dat gewicht sensoren ongeschikt zijn om op te staan en stuk kunnen gaan, dus dat lijkt af te vallen.
Is het geen optie om toch bewegingssensoren te gebruiken en ze dan zodanig te monteren en/of af te stellen zodat enkel mensen de sensoren triggeren?

PSN id: NL_SToRM


  • Fore!
  • Registratie: februari 2009
  • Laatst online: 13-12 22:00
vincent_1971 schreef op dinsdag 29 januari 2019 @ 10:12:
[...]


Zou voor een druk sensor gaan.
B.v.
https://www.sparkfun.com/products/11207

Zou zelf niet voor flexsensor gaan, de kromming van de hoek zal minimaal zijn als een huisdier erop loopt laat staan de weerstandsverandering.
Idee is juist om te zorgen dat die beesten ongemerkt het huis rond struinen. Voor hen zal de automatisering geen toegevoegde waarde zijn :P.
Dus als de flexsensor het huisdier niet kan detecteren is niet direct een probleem, wellicht een gemis voor toepassing in die toekomst. Dus als de detectie van een mens minimaal is, is dat nog steeds voldoende :) .

Overigens lees ik uit de artikelomschrijving dat erop staan dus geen probleem is? Enkele blogs nageplozen en die gaven aan dat dit nogal teer spul is.
SToRM666 schreef op dinsdag 29 januari 2019 @ 11:38:
[...]

Is het geen optie om toch bewegingssensoren te gebruiken en ze dan zodanig te monteren en/of af te stellen zodat enkel mensen de sensoren triggeren?
Uiteindelijk is dat met wat tweaking te doen, maar het liefst heb ik alles zoveel mogelijk uit het zicht. Onder de traptrede of onder het stukje tapijt vind ik dan het mooist. (daarbij is de flexsensor ook denk ik het makkelijkst te plaatsen en vervangen.

  • Atmoz
  • Registratie: juli 2001
  • Laatst online: 13:32

Atmoz

Techno!!

Ik snap even niet helemaal waarom onderstaande code niet doet wat ik wil :?


code:
1
2
3
4
5
6
7
  while(Serial.available() < 3);
  
  String SerialString = Serial.readString();
  int Getal = SerialString.toInt();
  val = map(Getal, 0, 320, 0, 180);  
  myservo.write(val);  
  Serial.flush();



Er komt constant (meerdere malen per seconde) data binnen op de seriële poort.
Dit zijn getallen tussen de 0 en de 320. Met de map-functie maak ik daar 0-180 van.
Precies wat de servo "nodig" heeft om te bewegen.

De servo beweegt wel, maar niet constant. Eigenlijk maar heel soms... om de paar seconde doet hij even iets. Ik zou verwachten dat de servo de hele tijd "bezig" is om weer naar de nieuwe positie te gaan...(die de Arduino tenslotte per seconde meerdere malen binnen krijgt!)

Waarom doet hij dat niet?


[edit]

Opgelost :9

Gebruik nu dit: Serial.readBytesUntil('\n', buffer, 7); en dan werkt het perfect 8)

Atmoz wijzigde deze reactie 02-02-2019 12:16 (6%)

Thuisbioscoop Limburg


  • SToRM666
  • Registratie: juli 2005
  • Laatst online: 11:03
De wake-up light werkt prima, ik heb m al een aantal dagen gebruikt. Ik heb echter nog 1 vervelend probleem en dat is de mp3 module. Het probleem dat ik heb is dat ik altijd ruis hoor uit de speaker als die niet in gebruik is en ik vraag me af hoe ik dat kan fixen.

In het begin deed ik al direct een init van die module bij het opstarten van de wekker, maar dit heb ik nu zo aangepast dat ik een init doe als ik een geluid moet afspelen en dan achteraf direct het geluid uit en de seriële verbinding afsluiten, maar zelfs dit helpt niet... Sterker nog, zelfs voordat ik een init doe hoor ik al ruis. Ik heb al wat zitten googelen en daar las ik dat ik 1K Ohm weerstandjes tussen de rx en tx aansluitingen moet doen, maar dat geeft geen verschil. Een ander idee was om een NPN te gebruiken, maar dan doet ie helemaal niets meer...

Iemand nog andere ideeën? Ik heb dus 4 aansluitingen: +, - , rx en tx.

PSN id: NL_SToRM


  • tsjoender
  • Registratie: april 2005
  • Laatst online: 19:58
SToRM666 schreef op zondag 3 februari 2019 @ 14:56:
De wake-up light werkt prima, ik heb m al een aantal dagen gebruikt. Ik heb echter nog 1 vervelend probleem en dat is de mp3 module. Het probleem dat ik heb is dat ik altijd ruis hoor uit de speaker als die niet in gebruik is en ik vraag me af hoe ik dat kan fixen.

In het begin deed ik al direct een init van die module bij het opstarten van de wekker, maar dit heb ik nu zo aangepast dat ik een init doe als ik een geluid moet afspelen en dan achteraf direct het geluid uit en de seriële verbinding afsluiten, maar zelfs dit helpt niet... Sterker nog, zelfs voordat ik een init doe hoor ik al ruis. Ik heb al wat zitten googelen en daar las ik dat ik 1K Ohm weerstandjes tussen de rx en tx aansluitingen moet doen, maar dat geeft geen verschil. Een ander idee was om een NPN te gebruiken, maar dan doet ie helemaal niets meer...

Iemand nog andere ideeën? Ik heb dus 4 aansluitingen: +, - , rx en tx.
Je vertelt niet welke module je gebruikt :) Ik zag wel een foto in een van je eerdere posts, maar herkende 'm niet.

Die 1kOhm weerstanden tussen TX en RX zijn waarschijnlijk ter bescherming van die IO pinnen door de stroom te beperken. Dus op zich prima om die te laten zitten. Kun je het volume ook regelen? Je zou dan misschien het volume steeds naar 0 (mute) kunnen zetten als er niets afgespeeld wordt.

  • SToRM666
  • Registratie: juli 2005
  • Laatst online: 11:03
tsjoender schreef op zondag 3 februari 2019 @ 19:51:
Je vertelt niet welke module je gebruikt :) Ik zag wel een foto in een van je eerdere posts, maar herkende 'm niet.

Die 1kOhm weerstanden tussen TX en RX zijn waarschijnlijk ter bescherming van die IO pinnen door de stroom te beperken. Dus op zich prima om die te laten zitten. Kun je het volume ook regelen? Je zou dan misschien het volume steeds naar 0 (mute) kunnen zetten als er niets afgespeeld wordt.
Alvast bedankt voor het meedenken. Het volume op 0 zetten doe ik inderdaad al, maar dat doet niets. Zelfs al voordat ik een geluid afspeel (en dus nog geen seriële connectie heb gemaakt met de mp3 module), hoor ik al ruis. Dus volgens mij ligt het meer aan de manier van aansluiten dan aan de programmatie, maar ik kan het mis hebben uiteraard...

Ik gebruik de volgende module: https://www.dx.com/p/uart...uino-2073960#.XFdA9lxKibg

Misschien ook handig om erbij te vermelden hoe het ongeveer aangesloten zit. Vanaf de voeding heb ik een directe aansluiting op de pcb waar deze mp3 speler en de ledstrip op aangesloten zitten. Vanaf de voeding gaat er nog een aparte 5V/GND naar de usb van de Arduino (dat is dus een doorgeknipte usb kabel). Vanaf de Arduino gaan er dan weer 5V en GND draden naar de pcb om de rest van de componenten van stroom te voorzien.

De GND van de directe verbinding naar de pcb en de GND van de Arduino zitten ook onderling verbonden op de PCB. Misschien dat daar het probleem zit?

Ik heb de module er nu toch uit, dus misschien dat ik eens een kleine opstelling maak om wat testen te doen.

SToRM666 wijzigde deze reactie 03-02-2019 20:39 (14%)

PSN id: NL_SToRM


  • tsjoender
  • Registratie: april 2005
  • Laatst online: 19:58
@SToRM666 Heb je al geprobeerd om het volume op 0 te zetten? Alle GND aansluitingen verbinden is juist goed om te voorkomen dat er spanningsverschillen ontstaat of dat stroom zijn eigen ongewenste weg weet te vinden.

Voeding is de meest waarchijnlijke bron van ruis. Ik zie dat deze module gevoed kan worden met een spanning tussen de 3,7 en 5,25V. Je zou eens drie penlites als voeding kunnen gebruiken (GND wel weer verbonden houden) en kijken of de ruis er dan ook is. De module alleen aangesloten op een Arduino zonder alle andere zaken erbij kan ook een goede test zijn (en dan een voor een de onderdelen van jouw klok weer toevoegen en luisteren wanneer de ruis terugkomt).

  • SToRM666
  • Registratie: juli 2005
  • Laatst online: 11:03
Volume op 0 helpt niet en zelfs de seriële verbinding afsluiten helpt niet ;)

In het begin heeft deze nog gewoon tussen de andere componenten aangesloten gezeten, dus met voeding via de Arduino, maar dat gaf teveel storing op de speaker. Het is niet dat het een keiharde ruis is, maar als het stil is kun je het van dichtbij wel horen en ik heb liever niet dat die module continu bezig is, maar enkel wanneer het nodig is.

Ik kan het als test inderdaad wel eens proberen met de penlites en zien wat dat doet.

SToRM666 wijzigde deze reactie 03-02-2019 21:03 (9%)

PSN id: NL_SToRM


  • tsjoender
  • Registratie: april 2005
  • Laatst online: 19:58
SToRM666 schreef op zondag 3 februari 2019 @ 21:02:
Volume op 0 helpt niet en zelfs de seriële verbinding afsluiten helpt niet ;)

In het begin heeft deze nog gewoon tussen de andere componenten aangesloten gezeten, dus met voeding via de Arduino, maar dat gaf teveel storing op de speaker. Het is niet dat het een keiharde ruis is, maar als het stil is kun je het van dichtbij wel horen en ik heb liever niet dat die module continu bezig is, maar enkel wanneer het nodig is.

Ik kan het als test inderdaad wel eens proberen met de penlites en zien wat dat doet.
Die NPN transistor die je eerder noemde was om de hele module uit te schakelen neem ik aan? Hoe had je die dan aangesloten?

  • SToRM666
  • Registratie: juli 2005
  • Laatst online: 11:03
Ik heb tussen de 5V en tussen de GND eens getest en in beide richtingen, maar dan kwam er nooit iets uit behalve wat gekke geluiden :P

Ik zit nu net even wat verder te prutsen en ik moet er ook bij zeggen dat die mp3 module onafhankelijk van de Arduino kan spelen, dus als de mp3 iets aan het afspelen is en ik reset de Arduino, dan speelt de mp3 vrolijk verder totdat die een commando krijgt om te stoppen. Ik heb de ruis nu nog iets stiller gekregen door wat commando's te sturen, maar het is nog altijd heel zacht te horen, maar dat is misschien niet echt iets wat kwaad kan?

Opzich wel handig dat de Arduino zijn stroom via usb krijgt, want als ik die eruit trek waardoor enkel de mp3 stroom krijgt, dan is de ruis harder dan wanneer ik de Arduino mee laat opstarten en even connecteer, het volume op "0" zet en weer een disconnect doe. Standaard staat het geluid van de mp3 module op "20".

SToRM666 wijzigde deze reactie 03-02-2019 22:10 (20%)

PSN id: NL_SToRM


  • jvdmast
  • Registratie: november 2002
  • Laatst online: 10-12 08:53
Heeft iemand hier wellicht ervaring met de combinatie van een SSD1306 (of soorgelijk) display en een i2c sóftware library? En dan met name níet de u8g2 mogelijkheid, want ik wil naast het display ook een bme280 en ccs811 over diezelfde i2c aansluiten.

Zie ook:
https://github.com/Testato/SoftwareWire/issues/19
https://github.com/adafruit/Adafruit_SSD1306/issues/133

  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
SToRM666 schreef op maandag 28 januari 2019 @ 16:34:
Gisteren de eerste test en alles werkte nog :)

[Afbeelding]
Knap gemaakt hoor d:)b

Toevallig was ik gisteren ook op zoek naar een led-matrix, maar dan als virtuele component op Thinkercad maar die zit er helaas niet bij en valt niet te importeren. Is leuk platform maar nogal sober, de standaard kleur voor ieder draadje is groen en iedere andere kleur draad moet je steeds apart een keuze voor maken, zover ik heb kunnen vinden
Heb deze in elkaar getekend :


klik voor groter


Heb als voorbeeld deze website genomen :
http://www.learnerswings....ounter-demonstration.html

Mij gaat het dan meer om de bijbehorende Arduino code en de datasheet van de chip, meer voor de theorie dus. Hoewel het wel zo is dat je de datasheet sneller doorhebt als je ook werkelijk zo'n schakeling in actie ziet, althans wat het timing diagram betreft bijvoorbeeld.
Het samenstellen ervan via een programma zoals Thinkercad is tevens een vorm van ontspanning.
Hoewel .... voor diezelfde chip kwam ik ook deze tegen :
https://www.instructables.com/id/810-LED-Matrix-with-4017/
Maar die gebruikt dus 80 losse ledjes en dat is weinig ontspanning meer.

Dus vandaar dat ik nu op zoek ben naar een simulator die wel zulke componenten heeft, of ze kan importeren.
LTSpice en Eagle heb ik vluchtig bekeken maar heb er geen ervaring mee en lijkt nogal overkill, bovendien meen ik dat die nogal prijzig zijn ?
Dus als iemand een tip heeft voor een microprocessor simulator dat echt niet 1001 mogelijkheden hoeft te hebben maar net een paar stapjes meer in huis heeft als Thinkercad dan zou zo'n tip erg welkom zijn.
jvdmast schreef op donderdag 7 februari 2019 @ 14:40:
Heeft iemand hier wellicht ervaring met de combinatie van een SSD1306 (of soorgelijk) display en een i2c sóftware library? En dan met name níet de u8g2 mogelijkheid, want ik wil naast het display ook een bme280 en ccs811 over diezelfde i2c aansluiten.

Zie ook:
https://github.com/Testato/SoftwareWire/issues/19
https://github.com/adafruit/Adafruit_SSD1306/issues/133
iemand heeft een aantal libraries opgesomd maar ervaring daarmee en met dit display heb ik er niet mee.

https://github.com/Testat...iki/Arduino-I2C-libraries

Maar zou toch te doen moeten zijn, hier een nl-voorbeeld

https://arduino-lessen.nl...306-op-arduino-aansluiten


oh, sorry
dat is met een u8g2.
maar moet alles dan in één library staan die alle drie de onderdelen tegelijk behandelt ?
Ik zie in c++ bijvoorbeeld vaak genoeg staan #include<iostream> en een regel daarna #include<string> bijvoorbeeld. Er worden dus meerdere libraries in één programma aangeroepen. Maar nu komt dan zo'n I2C bus erbij die je tegelijk wil gebruiken voor die drie dingen dus weet het ook even niet meer in korte tijd hoe dit precies zat. Zag wel een combi bordje ervan met één library.

https://github.com/sparkfun/Qwiic_BME280_CCS811_Combo

maar dan zonder display.

Hier staan ze allemaal, 2.000 stuks .... http://www.mamjo.com/forum/Smileys/default/shocked.gif

https://www.arduinolibraries.info/libraries

Misschien kan je ook deze trefwoorden eens proberen : arduino putting multiple devices on i2c.
Dat levert bijv. deze video op

YouTube: #20 Tutorial: Multiple Devices on One Arduino I2C Bus


'meer weergeven' onder de video geeft extra info

https://github.com/SensorsIot/I2C_1-Video

ik hoop dat je hiermee vindt wat je zoekt en heb er ondertussen ook zelf iets meer van opgestoken. :)

kitao wijzigde deze reactie 11-02-2019 22:30 (36%)


  • jvdmast
  • Registratie: november 2002
  • Laatst online: 10-12 08:53
Thanks @kitao ik had die lijsten ook wel gevonden en al een heleboel combi's getest.
Meerdere devices op 1 i2c is by-design, daarvoor is i2c gemaakt. Ook dat heb ik al een poos werkend. Alleen nu heb ik een combi nodig van één i2c bus als master met een paar slaves (waaronder dit display) en één i2c bus die als slave functioneert naar een andere master.

Die ccs811-bme280 combo had ik ook gezien, maar die lost nog steeds het display probleem niet op, die werkt gewoon als 2 i2c slaves (dus precies als een losse ccs811 en een losse bme80) en heeft een bijkomend probleem dat de bme last heeft van de warmte die de ccs genereert. ;)

Ik ben nu bezig om het om te draaien. De i2c devices aan de normale i2c bus (werkt wel namelijk) en een software-i2c slave. Die zijn schaarser maar omdat die minder hoeft te doen hoop ik dat ik daarmee verder kom.

  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
jvdmast schreef op dinsdag 12 februari 2019 @ 11:59:
Thanks @kitao ik had die lijsten ook wel gevonden en al een heleboel combi's getest.
Meerdere devices op 1 i2c is by-design, daarvoor is i2c gemaakt. Ook dat heb ik al een poos werkend. Alleen nu heb ik een combi nodig van één i2c bus als master met een paar slaves (waaronder dit display) en één i2c bus die als slave functioneert naar een andere master.

Die ccs811-bme280 combo had ik ook gezien, maar die lost nog steeds het display probleem niet op, die werkt gewoon als 2 i2c slaves (dus precies als een losse ccs811 en een losse bme80) en heeft een bijkomend probleem dat de bme last heeft van de warmte die de ccs genereert. ;)

Ik ben nu bezig om het om te draaien. De i2c devices aan de normale i2c bus (werkt wel namelijk) en een software-i2c slave. Die zijn schaarser maar omdat die minder hoeft te doen hoop ik dat ik daarmee verder kom.
Ja ik dacht zelf al dat je geen advies in de vorm van een google cursus nodig had, maar ja, meer als dat kon ik even niet geven want ben er vijf jaar tussenuit geweest met micro's en alles netjes opgeborgen. Was trouwens toch al niet super vergevorderd maar ook niet echt beginner meer. Het ligt nog steeds in de kast maar wou het virtueel weer oppakken en dacht ik kijk even met je mee en noteerde gewoon wat ik tegenkwam in de hoop dat jij toch iets ziet waardoor je verder kan. :)

Over zoek-cursus gesproken, na mijn vorige verzoek om een tip voor een arduino-simulator liep ik er ineens wel tegen aan terwijl ik toch al eerder had gezocht.

Zelf componenten importeren zit er nog steeds niet bij maar het arsenaal is veel groter als bij Thinkercad, zit ook debug in en een vrij groot assortiment programmeerbare IC's, etc. In/uit-zoomen zonder wieltjes muis gaat met twee vingers op touchpad, dat was even zoeken en ben nog maar éen kleur draad tegengekomen, namelijk zwart en ik zou voor diegeen die het ook wil testen aanraden eerst deze video kijken maar voor de rest is het een kwestie van oefenen en proberen.

YouTube: SimulIDE_0.1.5 Basic use.

Wil je arduino sketches nabootsen dan moet die volgens de instructies wel op je pc staan dus heb die zonet er weer opgezet. Die heb ik nog niet getest, want ben simpel begonnen met deze :


klik voor groter, je komt dan in imgur, klik nogmaals op plaatje


sorry voor het grote plaatje maar dat thumbnailen via imgur gaat ene keer wel en dan weer niet, zit tijdsvertraging in volgens mij

Kan hier voorlopig wel mee uit de voeten en het enige wat ze ervoor vragen is een vrijwillige donatie.

http://simulide.blogspot.com/

En er zit een vrij grote 'community' achter, veel video's erover, hele serie lessen erover etc.
.
.

kitao wijzigde deze reactie 12-02-2019 19:23 (6%)


  • PE4000
  • Registratie: november 2012
  • Laatst online: 19:39
Een poosje geleden kwam ik dit tegen: Temperatuur Monitor / Alarm en dit leek mij best wel interessant.
Eindelijk zondag mee aan de gang gegaan, echter volgens mij is mijn Nokia5110 display niet goed meer.
Laatst ook al gekloot gehad met dat display en nu exact hetzelfde.
De tekst is net leesbaar, maar naar verloop van tijd niet meer. Dus eerdaags een nieuwe halen.

The Setup Screen
http://www.vwlowen.co.uk/arduino/temperature/setup-menu.jpg
The Main Screen
http://www.vwlowen.co.uk/arduino/temperature/main-screen.jpg

  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
PE4000 schreef op dinsdag 12 februari 2019 @ 21:42:
Een poosje geleden kwam ik dit tegen: Temperatuur Monitor / Alarm en dit leek mij best wel interessant.
Eindelijk zondag mee aan de gang gegaan, echter volgens mij is mijn Nokia5110 display niet goed meer.
Laatst ook al gekloot gehad met dat display en nu exact hetzelfde.
De tekst is net leesbaar, maar naar verloop van tijd niet meer. Dus eerdaags een nieuwe halen.

The Setup Screen
[Afbeelding]
The Main Screen
[Afbeelding]
[YouTube: temperature]
Er hangen best veel componenten aan de Atm328, meen me te herinneren dat een aparte hulpvoeding (5V batterij op het display) dan soms wordt toegepast maar weet dat niet zeker meer. Maar kan ook inderdaad zo zijn dat die dingen snel verslijten.

Ben zelf inmiddels een stap verder met de virtuele uno, oftewel nep-uno voor sommigen B)
Voor geinteresseerden hier een paar stappen om dat aan de praat te krijgen, hoewel ik ieder in staat acht dit zelf uit te vogelen maar kost dan meer zoekwerk.
Arduino ide software is nodig, maar niet het bordje en SimulIDE, links in vorige post.
Het meeste is te zien in de twee video's hieronder dus ik houd het kort.
Laad een nieuw sketch in het arduino scherm en klik op file - preferences. Vink verbose output compilation aan. Klik daarna op V verify , je krijgt dan onderin de build-gegevens. Zonder verbose output te vinken krijg je die niet, vandaar. Zoek in de build gegevens naar een hex-file, select en ctrl+C om te kopieren.
Dat ziet er zo uit :

C:\\Users\\kitao\\AppData\\Local\\Temp\\arduino_build_844847/sketch_feb13b.ino.hex

en moet dit worden :

C:\Users\kitao\AppData\Local\Temp\arduino_build_844847\sketch_feb13b.ino.hex

Plak die laatste in een tijdelijk notepadje, is handig als je die nog nodig hebt. Hoewel, het blijkt namelijk dat zolang hetzelfde uno-programma open blijft dit pad niet meer verandert en bovendien heb je die volgens de video maar 1 keer nodig want bij wijziging uno-programma hoef je in Simul enkel op reload te klikken.
Nog iets, bij mij als ik op V verify druk vraagt die ieder keer om saven, is ook niet nodig.
Vervolgens in Simul, rechtsklik op de uno en klik Load firmware en plak de hex erin en klik Open.

Op die manier heb ik een matrix-led in beweging kunnen krijgen, hieronder de code en een plaatje ervan van een toch best snel lopend patroontje.
De code heb ik aangepast, het origineel is in de link hieronder te vinden, blijkt namelijk dat het origineel voor deze virtuele uno iets te snel gaat, houdt het niet bij. Vind de originele code ook lastig helemaal goed te doorzien, zou meer tijd vergen als ik er nu voor over heb om exact hetzelfde te krijgen als het origineel. Vermoed trouwens ook dat dit niet mogelijk is met zulke lage snelheid, maar kan me vergissen.
Wellicht een uitdaging voor de lezer om hier mijn vermoeden als kolder te weerleggen >:)


klik voor groter


als de thumbnail het doet haal ik deze weg

YouTube: SimulIDE Arduino Blink Basic

YouTube: SimulIDE 0.0.2 Simulator: Arduino barGraph example

origineel project :
http://osoyoo.com/2017/07/15/arduino-lesson-8x8-led-matrix/


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
// 2-dimensional array of row pin numbers:
int R[] = {2,3,4,5,A2,A3,A4,A5};  
// 2-dimensional array of column pin numbers:
int C[] = {13,12,11,10,9,8,7,6};    
  
unsigned char matrix[8][8] =     //the "matrix"   
{  
  0,0,0,0,0,0,0,1,  
  0,1,1,1,1,1,1,1,  
  0,0,1,1,1,1,1,1,  
  0,0,0,1,1,1,1,1, 
  0,0,0,0,1,1,1,1,  
  0,0,0,0,0,1,1,1,  
  0,0,0,0,0,0,1,1, 
  1,1,1,1,1,1,1,0,
    
};  
  
void setup()  
{  
   // iterate over the pins:
  for(int i = 0;i<8;i++)  
  // initialize the output pins:
  {  
    pinMode(R[i],OUTPUT);  
    pinMode(C[i],OUTPUT);  
  }  
}  
  
void loop()  
{  
  for(int i = 0 ; i < 1000 ; i++)        //Loop display 1000  
  {  
    Display(matrix);                   //Display the "matrix"  
  }  
}  
  
void Display(unsigned char dat[8][8])    
{  
  for(int c = 0; c<8;c++)  
  {  
    digitalWrite(C[c],LOW);//use the column 
    //loop
    for(int r = 0;r<8;r++)  
    {  
      digitalWrite(R[r],dat[r][c]);  
    }  
    delay(100);  // Stel hier de snelheid in van de matrix
    Clear();  //Remove empty display light
    
  }  
}  
  
void Clear()                        
{  
  for(int i = 0;i<8;i++)  
  {  
    digitalWrite(R[i],LOW);  
    digitalWrite(C[i],HIGH);  
  }  
}



Al met al niet ontevreden met deze in principe gratis software van SimulIDE :)

.

kitao wijzigde deze reactie 13-02-2019 21:17 (1%)
Reden: Gestuntel met duimnagel


  • Atmoz
  • Registratie: juli 2001
  • Laatst online: 13:32

Atmoz

Techno!!

Heeft iemand een goed idee voor het volgende probleem? (wat overigens niet alleen bij Arduino voorkomt, maar meer in het algemeen als je met camera-tracking en stappenmotoren werkt O-))

Ik krijg via de seriële-poort van de Arduino X en Y coördinaten door van een bewegend object (dat via een camera "getracked" wordt). Laten we het -voor het gemak- even bij X (alleen horizontale bewegingen dus) houden. Aan de hand van die getallen wil ik een stappenmotor een bepaalde positie laten aannemen.

Die getallen kunnen tussen de 0 en de 320 zitten. Het probleem is dat er teveel "storing" in de getallen die ik binnen krijg zit. Daarmee wil ik zeggen dat er bijvoorbeeld de volgende reeks (achter elkaar, via de UART) binnen komt:

3 (stappenmotor begint naar rechts te draaien)
15
30
42
47
59
60
40 <--- :(
67
80
49 (stappenmotor begint weer naar links terug te draaien)
21
31 <--- :(
14
8
0

Bij de 40 en later de 31 gaat het mis. Daar gaat de stappenmotor zich "onnodig" even in de verkeerde richting bewegen. Dat levert enorm storende vibraties op...

Ik weet niet of hier bepaalde slimme formules/truckjes voor zijn waarmee je dit kan oplossen?
Dit probleem zal in de praktijk wel vaker voorkomen lijkt me?
Dus misschien is er iemand met de gouden tip? _/-\o_

Thuisbioscoop Limburg


  • jeroen vrij
  • Registratie: februari 2016
  • Laatst online: 19-11 00:45

jeroen vrij

Just a arduino noob

Ik heb ook een arduino besteld de nano voor een projectje.
Maar kan iemand mij vertellen er is een app voor arduino.
Maar werkt deze op alle types van arduino.
Ik wil de nano ermee van een code voorzien.

Acties:
  • +1Henk 'm!

  • Atmoz
  • Registratie: juli 2001
  • Laatst online: 13:32

Atmoz

Techno!!

jeroen vrij schreef op vrijdag 1 maart 2019 @ 21:48:
Ik heb ook een arduino besteld de nano voor een projectje.
Maar kan iemand mij vertellen er is een app voor arduino.
Maar werkt deze op alle types van arduino.
Ik wil de nano ermee van een code voorzien.
Je kunt gewoon de Arduino IDE downloaden. Daarmee kun je alles types gewoon programmeren :)

Thuisbioscoop Limburg


  • jeroen vrij
  • Registratie: februari 2016
  • Laatst online: 19-11 00:45

jeroen vrij

Just a arduino noob

Ik ben een klok aan het maken kan iemand aan de hand van de code zien welk poort welk uur minuut en seconde aangeeft.
Het gaat om rgb leds waarbij de anodes 4x elk een kwartier pakken bij de kathodes is bij elke kleur apart de 1e minuut van elk kwartier doorgelust naar de 1e minuut van het 2e en 3e en 4e kwartier. En dat dus 15x rood 15x groen en 15x blauw.

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

//pins to the shift registers
int shiftpin = 15;
int storepin = 16;
int datapin = 14;
//pins for the four quarters of anodes
int firstquarter = 3;
int secondquarter = 5;
int thirdquarter = 4;
int fourthquarter = 2;

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}

void setup()
{
Wire.begin();
// set the initial time here:
//DS3231 seconds, minutes, hours, day, date, month, year
//setDS3231time(0,2,16,7,11,02,18);

//setting up the pins
pinMode(shiftpin, OUTPUT);
pinMode(storepin, OUTPUT);
pinMode(datapin, OUTPUT);
pinMode(firstquarter, OUTPUT);
pinMode(secondquarter, OUTPUT);
pinMode(thirdquarter, OUTPUT);
pinMode(fourthquarter, OUTPUT);
digitalWrite(storepin, LOW);
digitalWrite(shiftpin, LOW);
digitalWrite(firstquarter, LOW);
digitalWrite(secondquarter, LOW);
digitalWrite(thirdquarter, LOW);
digitalWrite(fourthquarter, LOW);
}

//function for sending an array to the shift registers
void shiftout(int a[]) {
digitalWrite(storepin, LOW);
for (int i=0;i<45;i++) {
digitalWrite(shiftpin, LOW);
digitalWrite(datapin, a[i]);
digitalWrite(shiftpin, HIGH);
}
digitalWrite(storepin, HIGH);
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}

void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}

void displayTime()
{
//this array holds the output signals for the cathodes
int output[45];
for (int i=0;i<45;i++) {
output[i] = 1;
}

//delay between the quarters
int t = 2;

//one of these get set to 1 if the two blue LEDs for the hours have to light up in two different quarters
int firsthour = 0;
int secondhour = 0;
int thirdhour = 0;
int fourthhour = 0;

while (1) {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
if (hour>11) {
hour = hour-12;
}

//convert the hours to minutes
int mhour = hour*60 + minute;

digitalWrite(firstquarter, HIGH);
if (0<second && second<16) {
output[15-second] = 0;
}
if (0<minute && minute<16) {
output[30-minute] = 0;
}
if (firsthour==1) {
output[44] = 0;
firsthour = 0;
}
if (12<=mhour && mhour<192) {
output[45-round(mhour/12)] = 0;
if (mhour<180) {
output[44-round(mhour/12)] = 0;
}
else {
secondhour = 1;
}
}
shiftout(output);
delay(t);
//reset the array
for (int i=0;i<45;i++) {
output[i] = 1;
}
shiftout(output);
digitalWrite(firstquarter, LOW);

digitalWrite(secondquarter, HIGH);
if (15<second && second<31) {
output[30-second] = 0;
}
if (15<minute && minute<31) {
output[45-minute] = 0;
}
if (secondhour==1) {
output[44] = 0;
secondhour = 0;
}
if (192<=mhour && mhour<372) {
output[45-round((mhour-180)/12)] = 0;
if (mhour<360) {
output[44-round((mhour-180)/12)] = 0;
}
else {
thirdhour = 1;
}
}
shiftout(output);
delay(t);
for (int i=0;i<45;i++) {
output[i] = 1;
}
shiftout(output);
digitalWrite(secondquarter, LOW);

digitalWrite(thirdquarter, HIGH);
if (30<second && second<46) {
output[45-second] = 0;
}
if (30<minute && minute<46) {
output[60-minute] = 0;
}
if (thirdhour==1) {
output[44] = 0;
thirdhour = 0;
}
if (372<=mhour && mhour<552) {
output[45-round((mhour-360)/12)] = 0;
if (mhour<540) {
output[44-round((mhour-360)/12)] = 0;
}
else {
fourthhour = 1;
}
}
shiftout(output);
delay(t);
for (int i=0;i<45;i++) {
output[i] = 1;
}
shiftout(output);
digitalWrite(thirdquarter, LOW);

digitalWrite(fourthquarter, HIGH);
if (45<second) {
output[60-second] = 0;
}
if (second==0) {
output[0] = 0;
}
if (45<minute) {
output[75-minute] = 0;
}
if (minute==0) {
output[15] = 0;
}
if (fourthhour==1) {
output[44] = 0;
fourthhour = 0;
}
if (552<=mhour) {
output[45-round((mhour-540)/12)] = 0;
;output[44-round((mhour-540)/12)] = 0;
}
if (mhour==0) {
output[30] = 0;
firsthour = 1;
}
shiftout(output);
delay(t);
for (int i=0;i<45;i++) {
output[i] = 1;
}
shiftout(output);
digitalWrite(fourthquarter, LOW);

}

}

void loop()
{
displayTime(); // display the real-time clock data
}

Acties:
  • +1Henk 'm!

  • Zarathustra
  • Registratie: januari 2008
  • Laatst online: 19:27
@atmoz een ‘moving average’ lost je probleem waarschijnlijk grotendeels op. Gemiddelde van de laatste n waarden dus. Bij vier waarden krijg je dan: nieuw = gemiddelde + (nieuw - gemiddelde) / 4 (4 omdat je dan een bit shift kunt gebruiken ipv delen) Nadeel is dat het de beweging iets vertraagt en alsnog iets terug draait bij foute data.

Je kunt ook steeds van twee of vier waardes het gemiddelde gebruiken. Vraag is of het dan nog snel genoeg reageert en/of je het aantal coordinaten per seconden kunt verhogen.

Anders steeds één waarde ‘bufferen’ en alleen de waarde als nieuw doel gebruiken als de volgende waarde ook stigt of daalt. Voor je voorbeeld data zou dit werken maar weet niet hoeveel ruis je hebt.

Zijn andere opties maar die kosten wat meer rekenkracht.

Zarathustra wijzigde deze reactie 02-03-2019 00:43 (12%)

Veni, vidi, vici - ik kwam, zag en overwon de drempels van het leven - denk ik dan maar, en vond vriendschap


  • SuperKris
  • Registratie: juni 2010
  • Laatst online: 15:51
Misschien een veel te algemene vraag om zo even te beantwoorden hoor, maar ik stel hem toch even.

Ik ga een redelijk uitgebreid projectje beginnen met een mega en 64 x 256 display. Mijn ervaring met displays is echt minimaal. Ik heb wel eens een testje gedaan met OLED's maar meer dan een paar cijfertjes of tekst niet.

Voor dit project wil ik diverse data op het schermpje toveren. Momenteel ben ik dat van plan met 3 hoofdschermen te doen die elk een fysieke knop krijgt om dat scherm op te roepen.

1) Scherm met accu spanningen, stromen, en icoontjes die aangeven hoe vol de accu's zitten.
2) Scherm met tank niveaus. Voornamelijk weergegeven als icoontjes
3) Scherm met temperaturen

Met de knoppen voor elk scherm ga je naar dat scherm toe. Daarnaast krijgen deze schermen 1 of 2 gedeelde functie toetsen die bijvoorbeeld een waarde resetten of extra functie weergeven.


Ik ben van plan te gaan werken met de U8g2 library: https://github.com/olikraus/u8g2

Hoe breng ik een structuur aan waarbij ik van scherm kan wisselen. Waar begin ik met zoiets?

  • Zarathustra
  • Registratie: januari 2008
  • Laatst online: 19:27
@SuperKris pseudo-code:


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
// definieer modes voor display
const modeTempeprature = 1;
const modeTankLevels = 2;

var currentMode = modeTemperature;

function displayTemperature(){
// schrijf beeldscherm voor temperatuur
}

function displayTankLevels(){
// beeld voor tank 
}

function updateScreen(){
switch(currentMode){
case modeTemperature: displayTemperature(); exit;
case modeTankLevels: displayTankLevels(); exit;
}
}

function onPressModeButton(){
switch(currentMode){
// wissel mode
}
updateScreen();
}



Voor de functieknopen doe je hetzelfde: een algemene functie en die afhankelijk van 'currentMode' de juiste functie aan laten roepen.

-- getypt op m'n ipad zonder tab-toets - hoop dat het leesbaar is :)

Veni, vidi, vici - ik kwam, zag en overwon de drempels van het leven - denk ik dan maar, en vond vriendschap


Acties:
  • +2Henk 'm!

  • farlane
  • Registratie: maart 2000
  • Laatst online: 11:07
Het werkt, maar fraai is het niet imho.

Cleaner is om een Screen class te maken met draw()/keyPress() members en die voor de verschillende schermen te implementeren.
Als je daarbij een "currentScreen" bijhoudt heb je volgens mij een beter onderhoudbaar design, een extra scherm houdt in dat je simpelweg een nieuwe implementatie maakt van een Screen waarbij je nergens meer hoeft te 'switchen' op welk scherm je ook al weer in zat.

Ter illustratie:

C++:
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
67
68
constexpr int PIN_KEY_0 = 0;
constexpr int PIN_KEY_1 = 1;

class Screen {
  public:
    enum SCREENS { HOME_SCREEN = 0, BATTERY_SCREEN };

    virtual void draw() = 0;
    virtual void keyDown(int key) = 0;

    void activate(SCREENS id) {
      _current = _screens[ id ];
    }

    static void update() {
      auto c = _current;

      // TODO: Detect edge on key pins
      if ( digitalRead(PIN_KEY_0) )
        c->keyDown(0);
      if ( digitalRead(PIN_KEY_1) )
        c->keyDown(1);

      // TODO: No screen update each loop?
      _current->draw();
    }

  private:
    static Screen* _current;
    static Screen* _screens[];
};

class HomeScreen : public Screen {
  public:
    void draw() {
      // draw home screen
    }

    void keyDown(int key) {
      activate(SCREENS::BATTERY_SCREEN);
    }
};

class BatteryScreen : public Screen {
  public:
    void draw() {
      // draw battery screen
    }

    void keyDown(int key) {
      activate(SCREENS::HOME_SCREEN);
    }
};

HomeScreen home_screen;
BatteryScreen battery_screen;

Screen* Screen::_screens[] = { &home_screen, &battery_screen };
Screen* Screen::_current = Screen::_screens[ SCREENS::HOME_SCREEN ];

void setup() {
  pinMode(PIN_KEY_0, INPUT);
  pinMode(PIN_KEY_1, INPUT);
}

void loop() {
  Screen::update();
}

farlane wijzigde deze reactie 03-03-2019 11:55 (54%)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0Henk 'm!

  • Zarathustra
  • Registratie: januari 2008
  • Laatst online: 19:27
@farlane zonder meer met je eens dat je (OO) oplossing mooier is. Moet bekennen dat ik geen ervaring heb met airduino. Wel met atmega en avr: weinig opslag en geheugen dus ik val snel terug op old-skool programmeren.

Veni, vidi, vici - ik kwam, zag en overwon de drempels van het leven - denk ik dan maar, en vond vriendschap


Acties:
  • +1Henk 'm!

  • farlane
  • Registratie: maart 2000
  • Laatst online: 11:07
Zarathustra schreef op zondag 3 maart 2019 @ 16:08:
@farlane zonder meer met je eens dat je (OO) oplossing mooier is. Moet bekennen dat ik geen ervaring heb met airduino. Wel met atmega en avr: weinig opslag en geheugen dus ik val snel terug op old-skool programmeren.
Arduino is C++ dus ik maak graag gebruik van de mogelijkheden die dat oplevert. Dat gezegd hebbende, als het C was geweest had ik een vergelijkbare oplossing gemaakt met een screen struct en een handvol functie pointers. (In essentie is er niet zo'n heel groot verschil tussen die C en C++ oplossingen)

Onder de streep is de C++ oplossing cleaner, en qua code size vergelijkbaar vermoed ik. Old skool is vaak overrated :P

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Zarathustra
  • Registratie: januari 2008
  • Laatst online: 19:27
Meer dan eens @farlane Deze oude rottende rot pielde nog assembly op z'n zx-81 die hij met een 50 watt soldeerbout had gemod voor niet assccii ;) graphics.

Weet overigens niet of @SuperKris bekend is met object georienteerd programmeren. Weet wel dat we hem gaan helpen bij zijn project :)

Veni, vidi, vici - ik kwam, zag en overwon de drempels van het leven - denk ik dan maar, en vond vriendschap


  • SuperKris
  • Registratie: juni 2010
  • Laatst online: 15:51
Zarathustra schreef op zaterdag 2 maart 2019 @ 14:54:
@SuperKris pseudo-code:


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
// definieer modes voor display
const modeTempeprature = 1;
const modeTankLevels = 2;

var currentMode = modeTemperature;

function displayTemperature(){
// schrijf beeldscherm voor temperatuur
}

function displayTankLevels(){
// beeld voor tank 
}

function updateScreen(){
switch(currentMode){
case modeTemperature: displayTemperature(); exit;
case modeTankLevels: displayTankLevels(); exit;
}
}

function onPressModeButton(){
switch(currentMode){
// wissel mode
}
updateScreen();
}



Voor de functieknopen doe je hetzelfde: een algemene functie en die afhankelijk van 'currentMode' de juiste functie aan laten roepen.

-- getypt op m'n ipad zonder tab-toets - hoop dat het leesbaar is :)
Dit kan ik nog wel begrijpen, thanks :)

In andere projecten zoals bij dit project ben ik er wel achter gekomen dat het niet altijd mogelijk om bepaalde delen van het programma in functies te bouwen.

Zover ik het begrepen heb, staat alle code behalve de aangeroepen functie stil tot de functie doorlopen is en beëindigd wordt. Gedurende die tijd werken interrupts die in de main loop staan niet. Ik weet nog niet goed hoe kritisch dat voor dit project gaat worden, maar ik ben bang dat de functie van het schrijven naar de display relatief lang duurt vergeleken met de andere code. Dat zou betekenen dat de Arduino een groot deel van de tijd niet reageert op het indrukken van een knop. Ook wil ik lampjes laten knipperen. Die timing is niet heel cruciaal, dus dat zal wel goed komen. Ook moet de arduino constant zijn analoge ingangen meten en hier wat logica op toepassen. Constant is vrij relatief hier. De waardes 1x per seconde uitlezen is wellicht al genoeg.
farlane schreef op zondag 3 maart 2019 @ 11:20:
[...]


Het werkt, maar fraai is het niet imho.

Cleaner is om een Screen class te maken met draw()/keyPress() members en die voor de verschillende schermen te implementeren.
Als je daarbij een "currentScreen" bijhoudt heb je volgens mij een beter onderhoudbaar design, een extra scherm houdt in dat je simpelweg een nieuwe implementatie maakt van een Screen waarbij je nergens meer hoeft te 'switchen' op welk scherm je ook al weer in zat.

Ter illustratie:

C++:
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
67
68
constexpr int PIN_KEY_0 = 0;
constexpr int PIN_KEY_1 = 1;

class Screen {
  public:
    enum SCREENS { HOME_SCREEN = 0, BATTERY_SCREEN };

    virtual void draw() = 0;
    virtual void keyDown(int key) = 0;

    void activate(SCREENS id) {
      _current = _screens[ id ];
    }

    static void update() {
      auto c = _current;

      // TODO: Detect edge on key pins
      if ( digitalRead(PIN_KEY_0) )
        c->keyDown(0);
      if ( digitalRead(PIN_KEY_1) )
        c->keyDown(1);

      // TODO: No screen update each loop?
      _current->draw();
    }

  private:
    static Screen* _current;
    static Screen* _screens[];
};

class HomeScreen : public Screen {
  public:
    void draw() {
      // draw home screen
    }

    void keyDown(int key) {
      activate(SCREENS::BATTERY_SCREEN);
    }
};

class BatteryScreen : public Screen {
  public:
    void draw() {
      // draw battery screen
    }

    void keyDown(int key) {
      activate(SCREENS::HOME_SCREEN);
    }
};

HomeScreen home_screen;
BatteryScreen battery_screen;

Screen* Screen::_screens[] = { &home_screen, &battery_screen };
Screen* Screen::_current = Screen::_screens[ SCREENS::HOME_SCREEN ];

void setup() {
  pinMode(PIN_KEY_0, INPUT);
  pinMode(PIN_KEY_1, INPUT);
}

void loop() {
  Screen::update();
}

Thanks voor je input :)
Dit zal vast een hele mooie oplossing zijn, maar dit is wel een beetje pittige code voor mij 90% van wat er in staat herken ik niet...
Zarathustra schreef op maandag 4 maart 2019 @ 04:11:
Meer dan eens @farlane Deze oude rottende rot pielde nog assembly op z'n zx-81 die hij met een 50 watt soldeerbout had gemod voor niet assccii ;) graphics.

Weet overigens niet of @SuperKris bekend is met object georienteerd programmeren. Weet wel dat we hem gaan helpen bij zijn project :)
Nee, daar ben ik helaas niet bekend mee :+

  • Zarathustra
  • Registratie: januari 2008
  • Laatst online: 19:27
@SuperKris interrupts werken altijd. Alleen ala je interrupts blokkeert werken ze niet. Als je libraries gebruikt (misschien ook die je noemt) dan kunnen die ook interrupts blokkeren. Dat staat vaak in de documentatie.

Of dat een probleem is? Meestal niet. Als ik een stukje code schrijf dat honderd keer per minuut de temeratuur meet is het geen probleem dat het soms 99 keer per minuut is. Als ik een geluidsrecorcder maak is het wel een probleem als de metingen niet perfect getimed zijn. Teveel tegelijk willen doen op een eenvoudige microprocessor geeft ook problemen.

Maak even een los draadje aan voor je project. De vragen die je stelt zijn niet 1-2-3 te beantwoorden. Wel interessant. En ik denk dat er mede-tweakers zijn die mijn uitleg over 'real-time' systemen (zonder OO) kunnen nuanceren. Zo leer ik ook wat :)

Veni, vidi, vici - ik kwam, zag en overwon de drempels van het leven - denk ik dan maar, en vond vriendschap


  • SuperKris
  • Registratie: juni 2010
  • Laatst online: 15:51
Zarathustra schreef op maandag 4 maart 2019 @ 11:33:
@SuperKris interrupts werken altijd. Alleen ala je interrupts blokkeert werken ze niet. Als je libraries gebruikt (misschien ook die je noemt) dan kunnen die ook interrupts blokkeren. Dat staat vaak in de documentatie.

Of dat een probleem is? Meestal niet. Als ik een stukje code schrijf dat honderd keer per minuut de temeratuur meet is het geen probleem dat het soms 99 keer per minuut is. Als ik een geluidsrecorcder maak is het wel een probleem als de metingen niet perfect getimed zijn. Teveel tegelijk willen doen op een eenvoudige microprocessor geeft ook problemen.

Maak even een los draadje aan voor je project. De vragen die je stelt zijn niet 1-2-3 te beantwoorden. Wel interessant. En ik denk dat er mede-tweakers zijn die mijn uitleg over 'real-time' systemen (zonder OO) kunnen nuanceren. Zo leer ik ook wat :)
Na even googelen ben ik bang dat ik de term interrupt helemaal verkeerd gebruik. Dit is een functie van de arduino die ik blijkbaar nog niet toegepast heb... Zeker nuttige info. De vraag is nu eigenlijk of ik echt interrupts nodig heb voor dit project.

De timing is inderdaad niet heel cruciaal voor dit project. Het is meer dat ik bang ben dat aanroepen van functies er voor kan zorgen dat de knoppen niet meer werken, maar misschien is dat voor dit project niet zon groot probleem.

Ik ga eerst maar eens wat zaken proberen op de door jou gesuggereerde methode en misschien maak ik later nog wel even een topic aan als ik vastloop.

  • GeertH
  • Registratie: april 2010
  • Laatst online: 19:36
Ik probeer met een attiny85 een puls te genereren.
Situatie als volgt:

Versterker schakelt in, geeft 5 volt op P2 van attiny
Versterker schakelt uit, 5 volt op P2 valt weg.

Nu wil ik dat er op P3 1 puls van 0.5 seconden komt, digitalwrite = HIGH, zodra 5v op P2 komt, en ook 1 puls van 0.5 seconden zodra 5v wegvalt. Dit om een bc547 + relais aan te sturen

Heb zelf wat geprobeerd, maar werkt helaas niet.
Iemand die ziet wat ik verkeerd doe, en me de goede richting op kan helpen?

Mijn code:


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
// constants won't change. They're used here to set pin numbers:
const int amplifierPin = 3;     // the number of the input pin
const int remotePin =  2;      // the number of the transistor pin

// variables will change:
int amplifierState = 0;         // variable for reading the input status

void setup() {
  // initialize the output pin as an output:
  pinMode(remotePin, OUTPUT);
  // initialize the input pin as an input:
  pinMode(amplifierPin, INPUT);
}

void loop() {
  // check if the amplifier is on:
  amplifierState = digitalRead(amplifierPin);

  // check if the amplifier is on. If it is, the amplifierState is HIGH:
  if (amplifierState == HIGH) {
    // pulse remote:
    digitalWrite(remotePin, HIGH);
    delay (500);}
  // check if the amplifier is off. If it is, the amplifierState is LOW:
  if (amplifierState == LOW) {
    // pulse remote
    digitalWrite(remotePin, HIGH);
    delay (500);}

BTO 15CL16 Core i5-4210M, 8GB ram, 120GB Samsung 840 ssd. Volkswagen Kever 1974


  • mcDavid
  • Registratie: april 2008
  • Laatst online: 19:19
@GeertH plaats je code aub in [code]-tags, dan blijft het leesbaar. Daarnaast, wat werkt er precies niet? Wat je wilt dat er gebeurt is duidelijk, maar wat gebeurt er in plaats daarvan?

mcDavid wijzigde deze reactie 04-03-2019 18:32 (7%)

zcflevo.nl


  • GeertH
  • Registratie: april 2010
  • Laatst online: 19:36
mcDavid schreef op maandag 4 maart 2019 @ 18:31:
@GeertH plaats je code aub in [code]-tags, dan blijft het leesbaar. Daarnaast, wat werkt er precies niet? Wat je wilt dat er gebeurt is duidelijk, maar wat gebeurt er in plaats daarvan?
Zojuist tussen tags gezet!

Wat er werkt.
Bij inschakelen attiny klikt het relais aan, en blijft aan.
Ongeacht of er op pin3 5v staat of niet.
Ook blijft het relais aan als ik 5v op pin3 puls.

BTO 15CL16 Core i5-4210M, 8GB ram, 120GB Samsung 840 ssd. Volkswagen Kever 1974


  • tsjoender
  • Registratie: april 2005
  • Laatst online: 19:58
GeertH schreef op maandag 4 maart 2019 @ 18:23:
Ik probeer met een attiny85 een puls te genereren.
Situatie als volgt:

Versterker schakelt in, geeft 5 volt op P2 van attiny
Versterker schakelt uit, 5 volt op P2 valt weg.

Nu wil ik dat er op P3 1 puls van 0.5 seconden komt, digitalwrite = HIGH, zodra 5v op P2 komt, en ook 1 puls van 0.5 seconden zodra 5v wegvalt. Dit om een bc547 + relais aan te sturen

Heb zelf wat geprobeerd, maar werkt helaas niet.
Iemand die ziet wat ik verkeerd doe, en me de goede richting op kan helpen?

Mijn code:

// constants won't change. They're used here to set pin numbers:
const int amplifierPin = 3; // the number of the input pin
const int remotePin = 2; // the number of the transistor pin

// variables will change:
int amplifierState = 0; // variable for reading the input status

void setup() {
// initialize the output pin as an output:
pinMode(remotePin, OUTPUT);
// initialize the input pin as an input:
pinMode(amplifierPin, INPUT);
}

void loop() {
// check if the amplifier is on:
amplifierState = digitalRead(amplifierPin);

// check if the amplifier is on. If it is, the amplifierState is HIGH:
if (amplifierState == HIGH) {
// pulse remote:
digitalWrite(remotePin, HIGH);
delay (500);}
// check if the amplifier is off. If it is, the amplifierState is LOW:
if (amplifierState == LOW) {
// pulse remote
digitalWrite(remotePin, HIGH);
delay (500);}
Je code mist nog een accolade aan het eind, maar dat zal een copy / paste dingetje zijn?

Met deze code zul je denk ik zien dat P2 altijd hoog is ongeacht of P3 hoog of laag is. Daarnaast zet je de remotePin nergens meer laag, dus die delay zal de loop eventjes laten wachten, maar de pin blijft dan hoog en de loop begint dan weer van voor af aan en zal de pin weer hoog zetten omdat dit bij alle condities de bedoeling is in deze code.

Volgens mij wil je de puls alleen doen bij de overgang van laag naar hoog op amplifierPin en bij de overgang van hoog naar laag op amplifierPin. Met een hulp variabele kun je dat doen. Zoiets:


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
// constants won't change. They're used here to set pin numbers:
const int amplifierPin = 3;     // the number of the input pin
const int remotePin =  2;      // the number of the transistor pin

bool lastPinstate = LOW;

// variables will change:
int amplifierState = 0;         // variable for reading the input status

void setup() {
  // initialize the output pin as an output:
  pinMode(remotePin, OUTPUT);
  // initialize the input pin as an input:
  pinMode(amplifierPin, INPUT);
}

void loop() {
  // check if the amplifier is on:
  amplifierState = digitalRead(amplifierPin);

  // check if the amplifier is on. If it is, the amplifierState is HIGH:
  if (amplifierState == HIGH && lastPinstate == LOW) {
    // pulse remote:
    digitalWrite(remotePin, HIGH);
    delay (500);
    digitalWrite(remotePin, LOW);
    lastPinstate = amplifierState;
  }
  // check if the amplifier is off. If it is, the amplifierState is LOW:
  if (amplifierState == LOW && lastPinstate == HIGH) {
    // pulse remote:
    digitalWrite(remotePin, HIGH);
    delay (500);
    digitalWrite(remotePin, LOW);
    lastPinstate = amplifierState;
  }

}



Niet getest en zo opgeschreven, maar dit is denk ik wel in de richting van wat je wilt.

  • GeertH
  • Registratie: april 2010
  • Laatst online: 19:36
P2 is nu inderdaad altijd hoog!
Ik zal je code vanavond testen, en laat je weten wat de uitkomst is!

Edit: Met de code van jou, klikt het relais 1 keer aan, en weer uit.
Hierna geen reactie op high of low op pin 3.
farlane schreef op maandag 4 maart 2019 @ 22:38:
Om te voorkomen dat je loop() telkens 500ms loopt te blocken bij het veranderen van de knop state (je kunt niets anders doen op dat moment) zou je ook een kleine statemachine kunnen maken:

C++:
1
  auto tick = millis();

op dit stukje gaat arduino programmer de fout in. krijg de melding: 'tick' does not name a type

GeertH wijzigde deze reactie 04-03-2019 23:43 (84%)

BTO 15CL16 Core i5-4210M, 8GB ram, 120GB Samsung 840 ssd. Volkswagen Kever 1974


  • farlane
  • Registratie: maart 2000
  • Laatst online: 11:07
Om te voorkomen dat je loop() telkens 500ms loopt te blocken bij het veranderen van de knop state (je kunt niets anders doen op dat moment) zou je ook een kleine statemachine kunnen maken:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void loop() {
  static bool previous_state = digitalRead(amplifierPin);
  static long start_tick = 0;

  auto tick = millis();

  bool state = digitalRead(amplifierPin);
  if ( state ^ previous_state ) {
    start_tick = tick;
  }
  previous_state = state;

  if ( start_tick && tick - start_tick <= 500 ) {
    digitalWrite(remotePin, HIGH);
  } else {
    digitalWrite(remotePin, LOW);
    start_tick = 0;
  }
}


Rekening houden met overflow van millis() is dan een oefening voor de TS ....

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • farlane
  • Registratie: maart 2000
  • Laatst online: 11:07
GeertH schreef op maandag 4 maart 2019 @ 19:38:
op dit stukje gaat arduino programmer de fout in. krijg de melding: 'tick' does not name a type
Dat komt waarschijnlijk omdat je je compiler niet op C++11 hebt ingesteld. Welke versie van de IDE gebruik je want sinds versie 1.6.6 zou dit standaard het geval moeten zijn?

Aan de andere kant kun je auto ook vervangen met het type dat millis() retouneert ( ik denk unsigned long? ) start_tick moet hetzelfde type hebben trouwens.....

farlane wijzigde deze reactie 06-03-2019 12:27 (5%)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
jeroen vrij schreef op zaterdag 2 maart 2019 @ 00:07:
Ik ben een klok aan het maken kan iemand aan de hand van de code zien welk poort welk uur minuut en seconde aangeeft.
Het gaat om rgb leds waarbij de anodes 4x elk een kwartier pakken bij de kathodes is bij elke kleur apart de 1e minuut van elk kwartier doorgelust naar de 1e minuut van het 2e en 3e en 4e kwartier. En dat dus 15x rood 15x groen en 15x blauw.

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

//pins to the shift registers
int shiftpin = 15;
int storepin = 16;
int datapin = 14;
//pins for the four quarters of anodes
int firstquarter = 3;
int secondquarter = 5;
int thirdquarter = 4;
int fourthquarter = 2;

[...]

//setting up the pins
pinMode(shiftpin, OUTPUT);
pinMode(storepin, OUTPUT);
pinMode(datapin, OUTPUT);
pinMode(firstquarter, OUTPUT);
pinMode(secondquarter, OUTPUT);
pinMode(thirdquarter, OUTPUT);
pinMode(fourthquarter, OUTPUT);
digitalWrite(storepin, LOW);
digitalWrite(shiftpin, LOW);
digitalWrite(firstquarter, LOW);
digitalWrite(secondquarter, LOW);
digitalWrite(thirdquarter, LOW);
digitalWrite(fourthquarter, LOW);
}

[...]
Sorry, ik zie geen arduino pin voor de uren, minuten en seconden, ook niet in de code hoewel ik niet beweer die 100% te begrijpen.
Shiftregisters zijn meestal wel aan elkaar doorgeschakeld, dus als je bijv een 2-bit shift register hebt dan telt die chip1 van 00 - 01 - 10 - 11 en dan is die vol. Op dat moment kan er een overflow signaal gegeven worden naar de chip2 en die gaat dan van 00 naar 01.
Chip1 wordt weer gereset en begint opnieuw, etc, etc.

Heb je geen linkje naar de bron van je project ?
Ik vermoed namelijk dat in ieder geval de uren-leds door een chip2 worden aangestuurd. (en dus niet rechtstreeks op een arduino-pin staan)


Ps\
# jeroen vrij, bedankt voor de terugkoppeling en voor de link :)
.

kitao wijzigde deze reactie 06-03-2019 15:38 (3%)
Reden: Ps\


  • jeroen vrij
  • Registratie: februari 2016
  • Laatst online: 19-11 00:45

jeroen vrij

Just a arduino noob

http://henrikberkmann.com/how-i-built-my-arduino-led-clock/

Maar heb hem inmiddels aan de gang.

Ik gebruik arduino ide app voor Android.
Ik moest hem even resetten en doen deed hij het wel.
Moet alleen nog even switchen met aansluitingen omdat de seconden niet netjes rondgaan

  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
jeroen vrij schreef op woensdag 6 maart 2019 @ 15:30:
http://henrikberkmann.com/how-i-built-my-arduino-led-clock/

Maar heb hem inmiddels aan de gang.

Ik gebruik arduino ide app voor Android.
Ik moest hem even resetten en doen deed hij het wel.
Moet alleen nog even switchen met aansluitingen omdat de seconden niet netjes rondgaan
Zie ook ps\ vorige post, en knap dat je het zelf hebt opgelost.

Heb het schema en bouwfoto's uit jouw link nog even bekeken maar op dit moment kom ik er niet helemaal uit.
Zie namelijk 6 chips met ieder 8 weerstanden op Q0-7 die zo te zien met de seconden leds zijn verbonden.
(eigenlijk nog minder want de zesde chip heeft slechts 5 weerstanden eraan hangen)
Dus ik mis er nog minstens 15 ... http://www.mamjo.com/forum/Smileys/default/huh.gif
De zwarte draden vanaf de vier transistors zijn zover ik begrepen heb voor het multiplexen om een fractie van een seconde 15 leds aan te sturen.

Ben namelijk misschien van plan om iets soortgelijks via een virtuele arduino te maken met 3 matrixen, twee van 10x6 voor de seconden en minuten en eentje van 4x3 voor de uren.
Dat wordt dan een gewone counter, of beter gezegd een loop-licht, want de virtuele arduino software, of mijn laptop, is te traag om multiplexenden leds goed te displayen zoals ik hier merkte :
[Discussie] Arduino-topic
Bovendien wordt het sowieso geen atoomklok precisie en ben van plan de tijd wat sneller te laten lopen, bijvoorbeeld 1 op 12.
En ik zeg misschien omdat het me wrs wel lukt om met een aantal geneste loops in C++ de teller in beweging te krijgen maar vertaling naar arduino-code plus de juiste pins aansturen is weer iets anders.

Heb wel al eens eerder een klok met leds gemaakt, met max-chips heten die geloof ik, staat ergens in dit topic maar heb het geduld er niet meer voor.
Had er een foto van met een enorme kluwen draad op een groot breadboard maar is niet meer te vinden.
Uiteindelijk heb ik dan deze gemaakt ter vervanging maar dan kan je net zo goed een digitale wekker kopen voor 5 euro.



en ps\
met OO wordt volgens mij OOP bedoeld, namelijk object orientated programming

.

kitao wijzigde deze reactie 06-03-2019 20:32 (14%)


  • fo0
  • Registratie: juli 2018
  • Laatst online: 12-12 20:10
Ik heb hier een nodeMCU en ik kom ergens niet uit; ik heb de volgende simpele code:


code:
1
2
3
4
5
6
void loop() {
  
  // put your setup code here, to run once:
  Serial.println(analogRead(sensor_0_pin));
  delay(1000);
}


Op één of andere manier krijg ik een sinus beweging qua waardes; waar kan dat aan liggen?

  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
fo0 schreef op woensdag 6 maart 2019 @ 20:55:
Ik heb hier een nodeMCU en ik kom ergens niet uit; ik heb de volgende simpele code:


code:
1
2
3
4
5
6
void loop() {
  
  // put your setup code here, to run once:
  Serial.println(analogRead(sensor_0_pin));
  delay(1000);
}


Op één of andere manier krijg ik een sinus beweging qua waardes; waar kan dat aan liggen?
waar zit de S0 aan verbonden ?
Als de node ongeveer lijkt op een arduino kwam ik dit tegen op trefwoord Serial.println(analogRead(); pin not connected

If the analog input pin is not connected to anything, the value returned by analogRead() will fluctuate based on a number of factors (e.g. the values of the other analog inputs, how close your hand is to the board, etc.).

https://www.arduino.cc/re...ons/analog-io/analogread/

  • fo0
  • Registratie: juli 2018
  • Laatst online: 12-12 20:10
@kitao
Op dit moment zit A0 aan een simpele LDR, node mcu is gebasseerd op de ESP8266. Ik heb hem gewoon aangesloten zoals altijd. Voorbeeld van output:
https://pastebin.com/d2DcLMaS

fo0 wijzigde deze reactie 06-03-2019 21:38 (48%)


  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
fo0 schreef op woensdag 6 maart 2019 @ 21:37:
@kitao
Op dit moment zit A0 aan een simpele LDR, node mcu is gebasseerd op de ESP8266. Ik heb hem gewoon aangesloten zoals altijd. Voorbeeld van output:
https://pastebin.com/d2DcLMaS
sorry, ik deed slechts een suggestie, verder ken ik de node-mcu niet, zie ook dingen over wifi enzo.
maar je toont wel een afbeelding van een arduino , een ldr en een output.
die output is geen sinus want er komen alleen positieve getallen in voor. (tenzij die omhoog gekrikt is).
waarom dat bij jou dan wel gebeurt weet ik niet, met name omdat je een variabele (van licht afhankelijke) weerstand uitleest en weerstanden hebben per definitie geen negatieve waarde zover ik weet.

De output met een minimum van ca. 85 en max ca. 135 lijkt mij normaal.
Je moet die dingen echt totaal afdekken of lamp op richten om die waardes te laten uitschieten.

Je kan ook een kleinere tweede brug serie weerstand plaatsen misschien, ipv b-z-g een b-z-r.
Dan wordt het bereik om in te lezen op de pin wat groter.
.

kitao wijzigde deze reactie 06-03-2019 23:59 (15%)


  • fo0
  • Registratie: juli 2018
  • Laatst online: 12-12 20:10
Bedankt, ik had het ook over een sinus beweging hij maakt inderdaad geen echte sinus. Hij reageert er wel op. Al dek ik hem helemaal af maakt hij een sinus beweging van 10 naar 30 en weer terug. Morgen eens een andere node pakken. Ik heb het al vele keren gedaan en ben dit nog nooit tegengekomen. Heel raar.

  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
fo0 schreef op woensdag 6 maart 2019 @ 22:37:
Bedankt, ik had het ook over een sinus beweging hij maakt inderdaad geen echte sinus. Hij reageert er wel op. Al dek ik hem helemaal af maakt hij een sinus beweging van 10 naar 30 en weer terug. Morgen eens een andere node pakken. Ik heb het al vele keren gedaan en ben dit nog nooit tegengekomen. Heel raar.
Handig als je een voorraadje hebt liggen ;)
Mijn suggestie om een b-z-r weerstand te plaatsen kan in principe wel 5mA opleveren tussen de plus en min.
bzr = 1K meen ik. Zag wel voorbeelden met bzo en dat is toch een factor 10 lager als bzg. Afin, ik hoop dat het met de reserve node beter gaat.

Heb zelf inmiddels de eerste stap gemaakt in mijn projectje, een looplicht-klok, geïnspireerd door de post van jeroen vrij. Ben er heel simpel aan begonnen want mijn ervaring met arduino programmeren heeft een jaar of 5 op de stofplank gelegen. Ook leek het me niet handig om meteen 60 leds, al dan niet als matrix, te gaan plaatsen, bovendien zijn daar zonder extra chips toch nooit genoeg pinnen voor.
Onderstaand zijn 3 leds die elk 20 seconden voorstellen plus de bijbehorende code. De minuten en uren moeten op dezelfde wijze nog bijgeplaatst worden en dan zo dat het geheel met een paar geneste loops de tijd volmaakt. Daarna wordt het uitbreiden maar wordt afwachten hoe dat verder uitpakt. Heb wel enig idee, zo kan je met 4 pinnen op de arduino mooi vanaf 0 t/m 15 tellen en met die binaire code dus 15 leds aansturen, mits ik de juiste chip weet te vinden en die ook in de Simulide aanwezig is. Importeren is er namelijk niet bij.




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
//  Om de 2 seconden gaat een led branden, er zijn 3 seconden leds
//  Elke led moet 20 seconden voorstellen
int S00 = 10;      // De drie seconden leds
int S20 = 11;
int S40 = 12;

void setup() {                
  // initialize the digital pin as an output.
  pinMode(S00, OUTPUT);   
  pinMode(S20, OUTPUT);  
  pinMode(S40, OUTPUT);    
}
void loop() {
delay(2000);                     // wait for 2 secondS
digitalWrite(S00, HIGH);       // turn the LED on (HIGH is the voltage level)
delay(2000);                      // wait for 2 secondS
digitalWrite(S20, HIGH);      // turn the LED on (HIGH is the voltage level)
delay(2000);                      // wait for 2 secondS
digitalWrite(S40, HIGH);      // turn the LED on (HIGH is the voltage level)
delay(2000);                      // wait for 2 secondS
digitalWrite(S00, LOW);       // turn the LED off by making the voltage LOW
digitalWrite(S20, LOW);       // turn the LED off by making the voltage LOW
digitalWrite(S40, LOW);       // turn the LED off by making the voltage LOW
}



Simulide opzetten, zie :
kitao in "[Discussie] Arduino-topic"
Bovenstaande code komt oorspronkelijk van :
https://create.arduino.cc...mi/5-blinking-leds-c29889
.
Ps\
Heb nog even gekeken of ik een LDR via simulide kan gebruiken maar zit er niet bij volgens mij en of ik via simulide een serial monitor in beeld kan krijgen zal ik later nog eens uitzoeken.
Heb wel een snellere en makkelijkere methode gevonden om een hex-file in simulide te krijgen, die staat hier :
https://www.botshop.co.za/2017/02/
Getest en gaat goed.

Ps2\
Zie nu ook dat in mijn code er een totaal van 8000 delay aanwezig is in void loop() , terwijl dit natuurlijk 6000 moest zijn. Dit is een kwestie van bijschaven.
.

kitao wijzigde deze reactie 07-03-2019 15:09 (7%)
Reden: Ps\


  • GeertH
  • Registratie: april 2010
  • Laatst online: 19:36
farlane schreef op woensdag 6 maart 2019 @ 12:26:
[...]


Dat komt waarschijnlijk omdat je je compiler niet op C++11 hebt ingesteld. Welke versie van de IDE gebruik je want sinds versie 1.6.6 zou dit standaard het geval moeten zijn?

Aan de andere kant kun je auto ook vervangen met het type dat millis() retouneert ( ik denk unsigned long? ) start_tick moet hetzelfde type hebben trouwens.....
Ik gebruik versie 1.8.7, dus neem aan dat C++11 aanstaat.

BTO 15CL16 Core i5-4210M, 8GB ram, 120GB Samsung 840 ssd. Volkswagen Kever 1974


  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
GeertH schreef op donderdag 7 maart 2019 @ 18:29:
Ik gebruik versie 1.8.7, dus neem aan dat C++11 aanstaat.
Een manier om dat te testen zou misschien kunnen via deze online C++ compiler, onderaan zitten keuze knopjes voor C++98,11 en 14. http://cpp.sh/

Vervolg vorige post.

Heb eerst een programma gemaakt dat meteen uitging van 60 seconden en 60 minuten maar werd onoverzichtelijk, daarom terug naar iets simpelers. De code is nog in C++ aangezien ik nog moet uitpluizen hoe dat naar Arduino te vertalen. Als dat gebeurd is kan ik het testen en fijnstellen hoe het uitkomt met de delays e.d. om dichter bij de werkelijk verstreken tijd te komen, al zal die versneld worden maar wel in verhouding. Een nadeel van de Simulide is namelijk dat die regelmatig vastloopt en heb bovendien geen zin om een uur te wachten of er een lampje gaat branden.
Het programma kan hier getest worden :
https://www.tutorialspoint.com/compile_cpp_online.php

Ps\ In de code staat bovenaan als commentaar een factor 3, maar eigenlijk zijn het er vier, namelijk
-> 000 - 100 - 110 - 111 -> , vandaar de delays van 1500.
Overigens ken ik geen instructie om in C++ een echte tijdafgewogen delay in te voeren. (?)

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
// Drie seconden = 1 minuut en drie minuten = 1 uur en drie uur = 1 dag
// Kopieer dit programma en test het in een C++ online compiler, bijvoorbeeld :
// https://www.tutorialspoint.com/compile_cpp_online.php

#include<iostream>
using namespace std;

int main() {
LABEL : // doet nu niks, heeft pas nut als goto op regel 43 wordt geactiveerd.

    for (int u = 1; u < 5; u++) {   // lus voor uren
        if (u == 1)
            cout << "U00, zet alle U-leds uit, delay 1500" << endl;
        if (u == 2)
            cout << "Zet U01-led aan, delay 1500" << endl;
        if (u == 3)
            cout << "Zet U02-led aan, delay 1500" << endl;
        if (u == 4)
            cout << "Zet U03-led aan, delay 1500" << endl;

        for (int m = 1; m < 5; m++) {   // geneste lus voor minuten
            if (m == 1)
                cout << "M00, zet alle M-leds uit, delay 1500" << endl;
            if (m == 2)
                cout << "Zet M01-led aan, delay 1500" << endl;
            if (m == 3)
                cout << "Zet M02-led aan, delay 1500" << endl;
            if (m == 4)
                cout << "Zet M03-led aan, delay 1500" << endl;

            for (int s = 1; s < 5; s++) {   // geneste lus voor seconden
                if (s == 1)
                    cout << "S00, zet alle S-leds uit, delay 1500" << endl;
                if (s == 2)
                    cout << "Zet S01-led aan, delay 1500" << endl;
                if (s == 3)
                    cout << "Zet S02-led aan, delay 1500" << endl;
                if (s == 4)
                    cout << "Zet S03-led aan, delay 1500" << endl << endl;
            }
        }
    }
    // goto LABEL; // EEUWIGE LUS
}


Fragment van output :

kitao wijzigde deze reactie 08-03-2019 03:58 (4%)
Reden: Ps\


  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
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 :D

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.
.

kitao wijzigde deze reactie 09-03-2019 17:35 (6%)
Reden: Ps\Edit + Ps2\


  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
De Simulide klok in nieuwe stijl is af, voor de helft althans.
Loopt als een zonnetje na een paar uurtjes meten en passen, beter als de vorige waar ik toch het idee had dat er bij de nul-doorgangen iets niet helemaal goed ging. Lijkt met switch-case iets makkelijker te gaan vind ik.

Led S00 staat altijd aan, dit ter indicatie als beginpunt van 00:00:00
Een minuut 00 bestaat eigenlijk niet, daarom wordt led M00, hoewel aangesloten, niet aangestuurd.
Vind dat er iets beter uit zien en lijkt symmetrischer.
Voor de weerstanden zie commentaar in de code.
Deel 2 verschijnt als de tweede uno met 12 uren eraan is gekoppeld.



De tijd is nu 00 : (30-40) : (30-40)

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
// De weerstanden zijn in Simulide 120 Ohm, in het echt is 220 Ohm te adviseren.

int t = 1000; // Verander hiermee de kloksnelheid (in milliseconden) in één keer.
int counter_M = 0;  // counter voor de minuten in switch case

int S00 = 0;  int S10 = 1;   int S20 = 2;   // De seconden leds
int S30 = 3;  int S40 = 4;   int S50 = 5;   // De seconden leds 
int M00 = 6;  int M10 = 7;   int M20 = 8;   // De minuten leds
int M30 = 9;  int M40 = 10;  int M50 = 11;  // De minuten leds    

void setup() {   // initialize the digital pins as an output.      
  pinMode(S00, OUTPUT) ; pinMode(S10, OUTPUT); pinMode(S20, OUTPUT); 
  pinMode(S30, OUTPUT) ; pinMode(S40, OUTPUT); pinMode(S50, OUTPUT);
  pinMode(M00, OUTPUT) ; pinMode(M10, OUTPUT); pinMode(M20, OUTPUT); 
  pinMode(M30, OUTPUT) ; pinMode(M40, OUTPUT); pinMode(M50, OUTPUT);
  digitalWrite(S00, HIGH);  // S00 aan, deze blijft constant aan.  
  digitalWrite(M00, LOW);   // M00 uit, deze blijft constant uit.     
}
void loop() {
      counter_M++;     // verhoog counter met 1
      delay(t);        // wait for t seconds  
  for (int s = 1; s < 6; s++) {
    switch (s) {
    case 1: digitalWrite(S10, HIGH); break;
    case 2: digitalWrite(S20, HIGH); break;
    case 3: digitalWrite(S30, HIGH); break;
    case 4: digitalWrite(S40, HIGH); break;
    case 5: digitalWrite(S50, HIGH); break; } // einde switch/case
      delay(t); } // wait for t seconds + einde for-lus
    digitalWrite(S10, LOW);digitalWrite(S20, LOW);digitalWrite(S30, LOW);
    digitalWrite(S40, LOW);digitalWrite(S50, LOW);   // reset de seconden
  if (counter_M == 6) {  // check of de minuten vol zijn
    digitalWrite(M10, LOW);digitalWrite(M20, LOW);digitalWrite(M30, LOW);
    digitalWrite(M40, LOW);digitalWrite(M50, LOW);  // reset de minuten
          counter_M = 0;   } // reset counter + einde if-conditie
      switch (counter_M) {
      case 1: digitalWrite(M10, HIGH); break;
      case 2: digitalWrite(M20, HIGH); break;
      case 3: digitalWrite(M30, HIGH); break;
      case 4: digitalWrite(M40, HIGH); break;
      case 5: digitalWrite(M50, HIGH); break; } // einde switch/case
}  // return naar void loop


.

  • Joepla
  • Registratie: maart 2005
  • Laatst online: 10:46

Joepla

Geavanceerde micro-elektronica

@kitao Klopt het dat je de tijd laat afhangen van de delays die je programmeert?
Ik vraag me af of je daarmee een stabiele, op wat langere termijn nauwkeurige klok kan maken. Mogelijk moet je hem dan iedere week ofzo corrigeren.

Zelf ben ik bezig om een Nixieklok te bouwen (nog steeds wat componenten aan het verzamelen), waarbij ik nog twijfel hoe ik de tijd bepaal. Een GPS ontvanger is vrij simpel te koppelen en dan heb je geen gedoe met afwijkingen (alleen de tijdzone en zomer-/wintertijd ingeven). Je zou daarvan ook alleen de secondepuls kunnen gebruiken, als je het eenvoudig wilt houden.

Als alternatief heb je ook nog de netfrequentie, die is op lange termijn ook zeer stabiel.

Live solarinfo op PVoutput [6,625 kWp]


  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
Joepla schreef op zondag 10 maart 2019 @ 18:03:

@kitao Klopt het dat je de tijd laat afhangen van de delays die je programmeert?

Ik vraag me af of je daarmee een stabiele, op wat langere termijn nauwkeurige klok kan maken. Mogelijk moet je hem dan iedere week ofzo corrigeren.

Zelf ben ik bezig om een Nixieklok te bouwen (nog steeds wat componenten aan het verzamelen), waarbij ik nog twijfel hoe ik de tijd bepaal. Een GPS ontvanger is vrij simpel te koppelen en dan heb je geen gedoe met afwijkingen (alleen de tijdzone en zomer-/wintertijd ingeven). Je zou daarvan ook alleen de secondepuls kunnen gebruiken, als je het eenvoudig wilt houden.

Als alternatief heb je ook nog de netfrequentie, die is op lange termijn ook zeer stabiel.
Ja dat klopt helemaal :)
Door regel 3 int t = 1000; // Verander hiermee de kloksnelheid (in milliseconden) in één keer te wijzigen tot bijvoorbeeld 10000 kom je dichter in de buurt bij werkelijk verstreken tijd, in theorie althans, heb dat zelf namelijk niet eens geprobeerd. Maar indien dat zo is, nadeel is dan wel dat je iets van 10 minuten moet wachten op de volgende nul-doorgang. Om een heel uur te laten passeren zal de t nog verder verhoogd moeten worden. Maar had in dit serie post projectje al geschreven dat het geen atoomklok precisie zou worden. Alles is namelijk virtueel gesimuleerd in het software programma Simulide, dat sowieso al een standaard vertraging van minstens 80% heeft en er komt geen enkele hardware aan te pas. Voor het opzetten van Simulide zie deze post : kitao in "[Discussie] Arduino-topic"
Ook heb ik de optie om zelf een start tijd op te geven gelaten voor wat het is, zal voor mij te ingewikkeld worden op dit moment. Mocht iemand de klok willen starten op een heel uur dan svp wachten totdat de klok slaat.

Ik weet dat er speciale bordjes zijn voor tijd, jeroen vrij had dat ook in zijn klok waar mijn projectje door is geinspireerd. Maar in Simulide valt dat niet toe te passen.
Dit projectje is een benadering om tijd weer te geven, het gaat mij niet om de nauwkeurigheid. Eigenlijk ging mij het erom om de door mij opgedane kennis van beginnend C++ programmeren in de praktijk naar een Arduino te vertalen. De code is daarom nergens van geplukt maar is eigen creatie met hooguit het raadplegen van de Arduino-code references. En tegelijkertijd wil ik eventuele lezers de gelegenheid geven dit na te bouwen waarbij toch vaak het struikelblok het programma maken is.
En ps\
Mocht iemand het met een echte Arduino te hebben uit geprobeerd en het loopt niet soepel dan hoor ik dat graag natuurlijk. :)

Een Nixie-klok vind ik trouwens ook heel mooi, maar ben tot nu toe definitief gestopt met solderen en bedraden, maar vind het altijd leuk er iets over te lezen en zie er graag foto's van.
.
Ps2\
Opnieuw wijziging plan van aanpak, de bezuinigingen steken een spaak in het wiel :|


klik voor groter

Deel2 zal dus niet verschijnen. Alternatief zou een Mega kunnen zijn maar wil het wel bereikbaar houden voor de beginners, waar ik mezelf ook onder reken na 5 jaar onderbreking.
Beginners hebben meestal ook geen tweede Uno in huis dus was al van plan een Deel3 met een chip voor de uren te maken. Deel2 vervalt dus en wordt meteen Deel3 (tzt).

.

kitao wijzigde deze reactie 11-03-2019 11:50 (21%)
Reden: En ps\


Acties:
  • +1Henk 'm!

  • kitao
  • Registratie: juli 2012
  • Laatst online: 22-05 16:27
Deel 3, wat eerst Deel 2 was, zie vorige post, is beginnetje mee gemaakt.
Ik hoop dat lezers het leuk vinden om de stapjes te volgen, ik wil niks opdringen ofzo.

Allereerst moeten opzoeken hoe een teller-chip nu eigenlijk ook al weer aangestuurd wordt, bovendien moest het een chip zijn die ook in Simulide aanwezig is en kwam uit bij de 74HC595. Paar websites geraadpleegd en deze drie bleven er over, de eerste is Nederlands-talig , de tweede en derde zijn deze :
https://www.arduino.cc/en/Tutorial/ShiftOut
https://www.arduino.cc/re...ons/advanced-io/shiftout/

Voor de rest er nog niet veel bij geprogrammeerd want behalve het nazoeken van hoe de 595 ongeveer in mekaar steekt gaat er veel tijd in het tekenen zitten.

Tegenvaller daarbij was dat ik de uren-leds ook van links naar rechts wil laten tellen en dat kwam niet mooi uit met de pin-posities van de 595. Nu moet de shift-register dus tegengesteld gaan lopen, vanaf Q7 t/m Q0.
Staat dus allemaal een beetje op zn kop.
Verder ben ik van plan om voor de uren-leds een aparte functie aan te roepen in de Arduino-code, maar dat zal wel geen verrassingen opleveren en ongeveer hetzelfde gaan als in C++ hoop ik.

Dit is de opstelling tot nu toe


klik voor groter

Led M00 die toch al constant Laag werd gehouden helaas moeten afkoppelen om er een Latch van te maken want alle pinnen zijn nu vol aan de beneden zijde van de Uno. Pin 12 is Data en 13 de klok.
Chip 2 nog niets aan gedaan behalve de ledjes erop gezet, die moet vanaf 9 t/m 12 gaan tellen.
Wou er ook nog een mogelijkheid inzetten om tenminste de uren van tevoren te kunnen instellen zodat er niet tot middernacht gewacht hoeft te worden om de klok gelijk te krijgen. Niet dat de Simulide het zo lang volhoudt, dan is die al lang en breed vastgelopen, ben al blij als er 5 minuten geknipper uit komt ;)

Meer details en slot de volgende keer.

.

kitao wijzigde deze reactie 11-03-2019 22:11 (0%)
Reden: typo's


Acties:
  • +2Henk 'm!

  • DurkVell
  • Registratie: augustus 2011
  • Laatst online: 12-12 23:17
@kitao : is het een idee om voor de liefhebbers van dit hele verhaal een apart topic te openen?
Pagina: 1 ... 91 92 93 Laatste


Apple iPhone 11 Nintendo Switch Lite LG OLED C9 Google Pixel 4 FIFA 20 Samsung Galaxy S10 Sony PlayStation 5 Smartphones

'14 '15 '16 '17 2018

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2019 Hosting door True