Mijn km/h teller in mijn auto wijkt standaard +/- 10% af van de werkelijke snelheid. Volgens de dealer is dit nog binnen de normen, maar volgens mij is dit knap irritant, dus dacht ik er aan om zelf een oplossing te bouwen in de vorm van een GPS gestuurde KM-Teller.
De onderdelen die ik hiervoor gebruik zijn de volgende:Nadat ik eerst de GPS module getest heb met de TinyGPSPlus library en de Parser voorbeeldsketch (en netjes output op de serial monitor zag) heb ik de code gestript totdat ik alleen nog maar de snelheid als output kreeg.
Daarna heb ik de voorbeelsketch voor het 7 segment display getest om de werking van het display te testen. Dit werkte ook meteen in 1 keer.
Daarna heb ik beide sketches gecombineerd om de snelheid van de GPS weer te geven op het 7 segment display. Snelheid op het display getest in de auto en het werkt
Echter wel met het volgende probleem: Iedere update van de snelheid knippert het display. (zie video)
Probleem:
[YouTube: https://www.youtube.com/watch?v=z8cYJUXAgwI]
Zelf dacht ik eerst dat de 'smartdelay' in de code het probleem veroorzaakte, maar dit was niet het geval.
Daarna heb ik het volgende stukje code weg gelaten:
Nu knippert het display niet meer, echter wordt de snelheid ook niet meer weergegeven, alleen 0000 brandt continue.
Zelf loop ik nu vast en weet niet hoe ik de code verder kan aanpassen, zodat het display niet meer knippert.
Wat zie ik over het hoofd en/of hoe kan ik er voor zorgen dat het display niet meer knippert ?
In Fritzing heb ik het schema getekend, hoe ik het geheel heb aangesloten:
De pinnummers uit de voorbeelsketches heb ik aangepast, zodat het display mooi bovenop de Nano past.

Schema:

Dit is de code zoals ik het nu werkend heb (met knipperend display)
De onderdelen die ik hiervoor gebruik zijn de volgende:Nadat ik eerst de GPS module getest heb met de TinyGPSPlus library en de Parser voorbeeldsketch (en netjes output op de serial monitor zag) heb ik de code gestript totdat ik alleen nog maar de snelheid als output kreeg.
Daarna heb ik de voorbeelsketch voor het 7 segment display getest om de werking van het display te testen. Dit werkte ook meteen in 1 keer.
Daarna heb ik beide sketches gecombineerd om de snelheid van de GPS weer te geven op het 7 segment display. Snelheid op het display getest in de auto en het werkt
Echter wel met het volgende probleem: Iedere update van de snelheid knippert het display. (zie video)
Probleem:
[YouTube: https://www.youtube.com/watch?v=z8cYJUXAgwI]
Zelf dacht ik eerst dat de 'smartdelay' in de code het probleem veroorzaakte, maar dit was niet het geval.
Daarna heb ik het volgende stukje code weg gelaten:
C++:
1
2
3
4
5
6
7
8
9
| //Turn off all segments lightNumber(10); // // //Turn off all digits digitalWrite(digit1, DIGIT_OFF); digitalWrite(digit2, DIGIT_OFF); digitalWrite(digit3, DIGIT_OFF); digitalWrite(digit4, DIGIT_OFF); } |
Nu knippert het display niet meer, echter wordt de snelheid ook niet meer weergegeven, alleen 0000 brandt continue.
Zelf loop ik nu vast en weet niet hoe ik de code verder kan aanpassen, zodat het display niet meer knippert.
Wat zie ik over het hoofd en/of hoe kan ik er voor zorgen dat het display niet meer knippert ?
In Fritzing heb ik het schema getekend, hoe ik het geheel heb aangesloten:
De pinnummers uit de voorbeelsketches heb ik aangepast, zodat het display mooi bovenop de Nano past.

Schema:

Dit is de code zoals ik het nu werkend heb (met knipperend display)
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
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
246
247
248
249
250
251
252
253
254
| #include <TinyGPS++.h> #include <SoftwareSerial.h> int digit1 = 9; //PWM Display pin 1 int digit2 = 8; //PWM Display pin 2 int digit3 = 4; //PWM Display pin 6 int digit4 = 2; //PWM Display pin 8 int segA = A2; //Display pin 14 int segB = A0; //Display pin 16 int segC = A3; //Display pin 13 int segD = 7; //Display pin 3 int segE = 5; //Display pin 5 int segF = A5; //Display pin 11 int segG = A1; //Display pin 15 static const int RXPin = 10, TXPin = 11; static const uint32_t GPSBaud = 9600; // The TinyGPS++ object TinyGPSPlus gps; // The serial connection to the GPS device SoftwareSerial ss(RXPin, TXPin); void setup() { Serial.begin(115200); ss.begin(GPSBaud); Serial.println(F("Speedometer")); pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT); pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT); pinMode(segG, OUTPUT); pinMode(digit1, OUTPUT); pinMode(digit2, OUTPUT); pinMode(digit3, OUTPUT); pinMode(digit4, OUTPUT); pinMode(13, OUTPUT); } void loop() { printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 0); Serial.println(F("")); smartDelay(1000); } void smartDelay(unsigned long ms) { unsigned long start = millis(); do { while (ss.available()) gps.encode(ss.read()); } while (millis() - start < ms); } void printFloat(float val, bool valid, int len, int prec) { if (!valid) { while (len-- > 1) displayNumber(0000); Serial.print('*'); Serial.print(' '); } else { Serial.print(val, prec); int vi = abs((int)val); int flen = prec + (val < 0.0 ? 2 : 1); // . and - flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; for (int i=flen; i<len; ++i) Serial.print(' '); displayNumber(val); } smartDelay(0); } void displayNumber(int toDisplay) { #define DISPLAY_BRIGHTNESS 500 #define DIGIT_ON HIGH #define DIGIT_OFF LOW long beginTime = millis(); for(int digit = 4 ; digit > 0 ; digit--) { //Turn on a digit for a short amount of time switch(digit) { case 1: digitalWrite(digit1, DIGIT_ON); break; case 2: digitalWrite(digit2, DIGIT_ON); break; case 3: digitalWrite(digit3, DIGIT_ON); break; case 4: digitalWrite(digit4, DIGIT_ON); break; } //Turn on the right segments for this digit lightNumber(toDisplay % 10); toDisplay /= 10; delayMicroseconds(DISPLAY_BRIGHTNESS); //Display this digit for a fraction of a second (between 1us and 5000us, 500 is pretty good) //Turn off all segments lightNumber(10); // // //Turn off all digits digitalWrite(digit1, DIGIT_OFF); digitalWrite(digit2, DIGIT_OFF); digitalWrite(digit3, DIGIT_OFF); digitalWrite(digit4, DIGIT_OFF); } while( (millis() - beginTime) < 10) ; //Wait for 20ms to pass before we paint the display again } //Given a number, turns on those segments //If number == 10, then turn off number void lightNumber(int numberToDisplay) { #define SEGMENT_ON LOW #define SEGMENT_OFF HIGH switch (numberToDisplay){ case 0: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_OFF); break; case 1: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break; case 2: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break; case 3: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_ON); break; case 4: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 5: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 6: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 7: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break; case 8: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 9: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON); digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON); digitalWrite(segG, SEGMENT_ON); break; case 10: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_OFF); digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_OFF); digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF); digitalWrite(segG, SEGMENT_OFF); break; } } |
[ Voor 0% gewijzigd door Luppie op 28-09-2015 19:46 . Reden: Broken Links aangepast ]
Heb je iets aan mijn antwoord ? Een thumbs-up wordt zeker op prijs gesteld.