15
15
#define DUTY_MAX ((1 << LEDC_TIMER_10_BIT) -1 )
16
16
#define FREQ_MIN_Hz 1 /* Do not decrease it! */
17
17
18
+ #define FUEL_DUTY_CYCLE_MIN 100 /* FULL */
19
+ #define FUEL_DUTY_CYCLE_MAX 540 /* EMPTY */
20
+ #define TEMP_DUTY_CYCLE_MIN 26 /* 60°C */
21
+ #define TEMP_DUTY_CYCLE_MAX 512 /* >120°C */
22
+ #define OILTEMP_DUTY_CYCLE_MIN 12 /* 60°C */
23
+ #define OILTEMP_DUTY_CYCLE_MAX 600 /* >180°C */
24
+ #define OIL_WARN_TRESH_RPM 300
18
25
19
26
#define TURN_R_PIN 5
20
27
#define FUEL_PIN 2
32
39
#define DIMM_PIN 33
33
40
#define PWR_PIN 17
34
41
35
- #define BUF_SIZE 128
42
+ #define BUF_SIZE 64
36
43
37
- char simHubMessageBuf [BUF_SIZE];
38
- BluetoothSerial btSerial ;
44
+ char simhub_message_buf [BUF_SIZE];
45
+ BluetoothSerial bt_serial ;
39
46
40
- float revs;
41
- float speed_kmh;
42
- float fuel_percent;
43
- float water_temperature_degC;
44
- int turn_left;
45
- int turn_right;
46
- int brake;
47
- float oil_temperature_degC;
48
-
49
- unsigned int temp_duty_cycle = 0 ;
50
- float speed_Hz = 0 ;
51
- float rpm_Hz = 0 ;
52
- unsigned int fuel_duty_cycle = 0 ;
53
- unsigned int oil_temp_duty_cycle = 0 ;
54
47
55
48
void ledc_init (uint8_t pin, float freq_Hz, ledc_channel_t channel, ledc_timer_t timer) {
56
49
const char * ME = __func__;
@@ -137,23 +130,32 @@ void setup() {
137
130
138
131
digitalWrite (PWR_PIN, HIGH);
139
132
140
- memset (simHubMessageBuf , 0x0 , BUF_SIZE);
141
- btSerial .begin (BT_NAME);
133
+ memset (simhub_message_buf , 0x0 , BUF_SIZE);
134
+ bt_serial .begin (BT_NAME);
142
135
}
143
136
144
137
void loop () {
145
- if (btSerial .available () > 0 )
138
+ if (bt_serial .available () > 0 )
146
139
{
147
- btSerial .readBytesUntil (' {' , simHubMessageBuf , BUF_SIZE);
148
- int readCount = btSerial .readBytesUntil (' }' , simHubMessageBuf , BUF_SIZE);
149
- simHubMessageBuf [min (readCount, BUF_SIZE - 1 )] = 0x0 ;
150
- processMessage ();
151
- memset (simHubMessageBuf , 0x0 , BUF_SIZE);
140
+ bt_serial .readBytesUntil (' {' , simhub_message_buf , BUF_SIZE);
141
+ int readCount = bt_serial .readBytesUntil (' }' , simhub_message_buf , BUF_SIZE);
142
+ simhub_message_buf [min (readCount, BUF_SIZE - 1 )] = 0x0 ;
143
+ process_message ();
144
+ memset (simhub_message_buf , 0x0 , BUF_SIZE);
152
145
}
153
146
}
154
147
155
- void processMessage () {
156
- sscanf (simHubMessageBuf, " %f&%f&%f&%f&%d&%d&%d&%f" ,
148
+ void process_message () {
149
+ unsigned int revs;
150
+ unsigned int speed_kmh;
151
+ unsigned int fuel_percent;
152
+ float water_temperature_degC;
153
+ int turn_left;
154
+ int turn_right;
155
+ int brake;
156
+ float oil_temperature_degC;
157
+
158
+ sscanf (simhub_message_buf, " %u&%u&%u&%f&%d&%d&%d&%f" ,
157
159
&revs,
158
160
&speed_kmh,
159
161
&fuel_percent,
@@ -164,17 +166,75 @@ void processMessage() {
164
166
&oil_temperature_degC
165
167
);
166
168
167
- if (revs >= 200 )
169
+ float rpm_Hz = rpm_get_Hz (revs);
170
+ float speed_Hz = speed_get_Hz (speed_kmh);
171
+ unsigned int fuel_duty_cycle = fuel_duty_cycle_get (fuel_percent);
172
+ unsigned int temp_duty_cycle = water_temperature_duty_cycle_get (water_temperature_degC);
173
+ unsigned int oil_temp_duty_cycle = oil_temperature_duty_cycle_get (oil_temperature_degC);
174
+
175
+ handle_lights (turn_left, turn_right, brake, revs);
176
+
177
+ ledc_set_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, temp_duty_cycle);
178
+ ledc_update_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
179
+
180
+ ledc_set_freq (LEDC_HIGH_SPEED_MODE, LEDC_TIMER_1, rpm_Hz);
181
+ ledc_set_freq (LEDC_HIGH_SPEED_MODE, LEDC_TIMER_2, speed_Hz);
182
+
183
+ ledc_set_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_3, fuel_duty_cycle);
184
+ ledc_update_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_3);
185
+
186
+ ledc_set_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_4, oil_temp_duty_cycle);
187
+ ledc_update_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_4);
188
+ }
189
+
190
+ float rpm_get_Hz (float revs) {
191
+ float freq_Hz = 0.05 * revs;
192
+
193
+ if (freq_Hz < FREQ_MIN_Hz)
168
194
{
169
- digitalWrite (OIL_PIN, HIGH) ;
195
+ return FREQ_MIN_Hz ;
170
196
}
171
- if (revs < 200 )
197
+
198
+ return freq_Hz;
199
+ }
200
+
201
+ float speed_get_Hz (float speed_kmh) {
202
+ float freq_Hz = 1.087 * speed_kmh - 0.6 ;
203
+
204
+ if (freq_Hz < FREQ_MIN_Hz)
172
205
{
173
- digitalWrite (OIL_PIN, LOW) ;
206
+ return FREQ_MIN_Hz ;
174
207
}
175
208
176
- rpm_Hz = 0.05 * revs;
209
+ return freq_Hz;
210
+ }
177
211
212
+ unsigned int fuel_duty_cycle_get (float fuel_percent) {
213
+ unsigned int fuel_duty_cycle = FUEL_DUTY_CYCLE_MIN;
214
+
215
+ if (fuel_percent > 0.0 && fuel_percent <= 25.0 )
216
+ {
217
+ fuel_duty_cycle = -9.6 * fuel_percent + 540 ;
218
+ }
219
+ else if (fuel_percent > 25.0 && fuel_percent <= 50.0 )
220
+ {
221
+ fuel_duty_cycle = -4.4 * fuel_percent + 410 ;
222
+ }
223
+ else if (fuel_percent > 50.0 && fuel_percent <= 75.0 )
224
+ {
225
+ fuel_duty_cycle = -2.08 * fuel_percent + 294 ;
226
+ }
227
+ else if (fuel_percent > 75.0 && fuel_percent <= 100.0 )
228
+ {
229
+ fuel_duty_cycle = -1.52 * fuel_percent + 252 ;
230
+ }
231
+
232
+ return fuel_duty_cycle;
233
+ }
234
+
235
+ unsigned int water_temperature_duty_cycle_get (float water_temperature_degC) {
236
+ unsigned int temp_duty_cycle = TEMP_DUTY_CYCLE_MIN;
237
+
178
238
if (water_temperature_degC > 60.0 && water_temperature_degC <= 80.0 )
179
239
{
180
240
temp_duty_cycle = water_temperature_degC - 34 ;
@@ -192,25 +252,17 @@ void processMessage() {
192
252
temp_duty_cycle = 21.0 * water_temperature_degC - 2100 ;
193
253
}
194
254
195
- speed_Hz = 1.087 * speed_kmh - 0.6 ;
196
-
197
- if (fuel_percent > 0.0 && fuel_percent <= 25.0 )
255
+ if (temp_duty_cycle >= TEMP_DUTY_CYCLE_MAX)
198
256
{
199
- fuel_duty_cycle = -9.6 * fuel_percent + 540 ;
200
- }
201
- else if (fuel_percent > 25.0 && fuel_percent <= 50.0 )
202
- {
203
- fuel_duty_cycle = -4.4 * fuel_percent + 410 ;
204
- }
205
- else if (fuel_percent > 50.0 && fuel_percent <= 75.0 )
206
- {
207
- fuel_duty_cycle = -2.08 * fuel_percent + 294 ;
208
- }
209
- else if (fuel_percent > 75.0 && fuel_percent <= 100.0 )
210
- {
211
- fuel_duty_cycle = -1.52 * fuel_percent + 252 ;
257
+ return TEMP_DUTY_CYCLE_MAX;
212
258
}
213
259
260
+ return temp_duty_cycle;
261
+ }
262
+
263
+ unsigned int oil_temperature_duty_cycle_get (float oil_temperature_degC) {
264
+ unsigned int oil_temp_duty_cycle = OILTEMP_DUTY_CYCLE_MIN;
265
+
214
266
if (oil_temperature_degC > 60.0 && oil_temperature_degC <= 100.0 )
215
267
{
216
268
oil_temp_duty_cycle = 0.9 * oil_temperature_degC - 42 ;
@@ -232,6 +284,30 @@ void processMessage() {
232
284
oil_temp_duty_cycle = 17.5 * oil_temperature_degC - 2570 ;
233
285
}
234
286
287
+ if (oil_temp_duty_cycle >= OILTEMP_DUTY_CYCLE_MAX)
288
+ {
289
+ return OILTEMP_DUTY_CYCLE_MAX;
290
+ }
291
+
292
+ return oil_temp_duty_cycle;
293
+ }
294
+
295
+ void handle_lights (
296
+ int turn_left,
297
+ int turn_right,
298
+ int brake,
299
+ unsigned int revs
300
+ )
301
+ {
302
+ if (revs >= OIL_WARN_TRESH_RPM)
303
+ {
304
+ digitalWrite (OIL_PIN, HIGH);
305
+ }
306
+ if (revs < OIL_WARN_TRESH_RPM)
307
+ {
308
+ digitalWrite (OIL_PIN, LOW);
309
+ }
310
+
235
311
if (turn_right != 0 )
236
312
{
237
313
digitalWrite (TURN_R_PIN, HIGH);
@@ -256,34 +332,4 @@ void processMessage() {
256
332
{
257
333
digitalWrite (BRAKE_PIN, LOW);
258
334
}
259
-
260
- if (temp_duty_cycle >= 26 && temp_duty_cycle <= 512 )
261
- {
262
- ledc_set_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, temp_duty_cycle);
263
- ledc_update_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
264
- }
265
-
266
- if (rpm_Hz < FREQ_MIN_Hz)
267
- {
268
- rpm_Hz = FREQ_MIN_Hz;
269
- }
270
- ledc_set_freq (LEDC_HIGH_SPEED_MODE, LEDC_TIMER_1, rpm_Hz);
271
-
272
- if (speed_Hz < FREQ_MIN_Hz)
273
- {
274
- speed_Hz = FREQ_MIN_Hz;
275
- }
276
- ledc_set_freq (LEDC_HIGH_SPEED_MODE, LEDC_TIMER_2, speed_Hz);
277
-
278
- if (fuel_duty_cycle >= 100 && fuel_duty_cycle <= 540 )
279
- {
280
- ledc_set_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_3, fuel_duty_cycle);
281
- ledc_update_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_3);
282
- }
283
-
284
- if (oil_temp_duty_cycle >= 12 && oil_temp_duty_cycle <= 600 )
285
- {
286
- ledc_set_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_4, oil_temp_duty_cycle);
287
- ledc_update_duty (LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_4);
288
- }
289
335
}
0 commit comments