-
Notifications
You must be signed in to change notification settings - Fork 0
/
old_nav_screen.ino
359 lines (334 loc) · 10.3 KB
/
old_nav_screen.ino
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
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
#include <avr/sleep.h>
const bool OPEN = true;
const bool CLOSE = false;
const bool HOODOPENED = true;
const bool HOODCLOSED = false;
const int POTENTIOMETER_PIN = A5; // Hood potentiometer
const int RPWM_PIN = 5;
const int LPWM_PIN = 6;
const int L_EN_PIN = 7;
const int R_EN_PIN = 8;
const int ACC_PIN = 2; // Accessory pin, detect when car start
const int TILT_PIN = 9; // Tilt button pin number
const int OPEN_PIN = 10; // Open/close button pin number
const int SCREEN_PIN = 11; // SCREEN PIN to turn off or on the screen
const int OS_PIN = 12; // OS BUTTON
const int OS_POWER_RELAY_PIN = 13; // OS POWER RELAY
const int BUTTONDELAY = 400; // Minimum time between button presses
const int ACCDETECTDELAY = 2000; // Time (ms) that ACC needs to be on before car is considered 'on'
const int HOODOPENEDVALUE = 157; // Analogue potentiometer value when hood is open
const int HOODCLOSEDVALUE = 918; // Analogue potentiometer value when hood is closed
const int HOODPOSTOLERANCE = 10; // Analogue potentiometer value tolerance
const int TILTVALUE = 15; // Difference potentiometer value for each tilt
const int MAXTILT = 2; // Max hood tilt level
// Defining Global Variables
boolean screenOff = false; // Define if the os's screen on/off
boolean osOff = false; // Initialise Operating System state
boolean osPowerOff = true; // Define is OS is powered by relay
boolean carOff = true; // Initialise carOff state
boolean onHoodStatus = HOODCLOSED; // Track desired hood status when car on, controlled by checkOpenButton()
boolean currentHoodStatus = HOODCLOSED; // Track current physical hood status, controlled by operateHood()
int motorRunTime = 0; // Time the motor has run for
int tiltLevel = 0; // Initialise hood tilt level (0:none - 2:tilted
void setup()
{
pinMode(RPWM_PIN, OUTPUT);
pinMode(LPWM_PIN, OUTPUT);
pinMode(L_EN_PIN, OUTPUT);
pinMode(R_EN_PIN, OUTPUT);
pinMode(TILT_PIN, INPUT);
pinMode(OPEN_PIN, INPUT);
pinMode(SCREEN_PIN, OUTPUT);
pinMode(ACC_PIN, INPUT);
pinMode(OS_PIN, OUTPUT);
pinMode(OS_POWER_RELAY_PIN, OUTPUT);
digitalWrite(RPWM_PIN, LOW);
digitalWrite(LPWM_PIN, LOW);
digitalWrite(L_EN_PIN, LOW);
digitalWrite(R_EN_PIN, LOW);
digitalWrite(TILT_PIN, HIGH);
digitalWrite(OPEN_PIN, HIGH);
digitalWrite(SCREEN_PIN, LOW);
digitalWrite(OS_PIN, HIGH);
digitalWrite(OS_POWER_RELAY_PIN, LOW);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(ACC_PIN) == HIGH)
{ // Accessories are on (car on)
// Serial.println("ACC ON");
checkResume(); // Check if the car was previously off
checkOpenButton(); // Check if the Open button has been pressed
checkTiltButton(); // Check if the Tilt button has been pressed
}
else
{ // Accessories are off (car off)
Serial.println("ACC OFF");
if (carOff)
{
sleepNow();
}
else
{
checkOff();
}
}
}
void checkResume()
{
/*
* Check if we are resuming from a 'carOff' event, restore previous hood position
*/
if (carOff == true) // Only run if car off
{
delay(ACCDETECTDELAY); // Wait a ACCDETECTDELAY time
if (digitalRead(ACC_PIN) == HIGH) // Check to see if Accessories are still on
{
if (onHoodStatus == HOODOPENED)
{
Serial.println("RESUME OPEN");
startOS();
operateHood(OPEN, false); // Restore the previous hood position
restorePosition();
}
carOff = false;
}
}
}
void checkOff()
{
/*
* Check if the car is off and closes the hood
*/
Serial.println("CHECK OFF");
delay(ACCDETECTDELAY); // Wait a ACCDETECTDELAY time
if (digitalRead(ACC_PIN) == LOW) // Check if Accessories is still off
{
if (getPotentiometerValue() < (HOODCLOSEDVALUE - HOODPOSTOLERANCE)) // Hood is open, close it
{
operateHood(CLOSE, false);
stopOS();
}
carOff = true;
}
}
void checkOpenButton()
{
/*
* Check if the Open button has been pressed and perform the open action
*/
int openButtonState = digitalRead(OPEN_PIN); // Get the current state of the Open button
if (openButtonState == LOW) // Button has been pressed
{
Serial.println("OPEN BUTTON");
if (getPotentiometerValue() < (HOODCLOSEDVALUE - HOODPOSTOLERANCE)) // Hood is open
{
Serial.println("HOOD IS OPEN");
operateHood(CLOSE, false);
onHoodStatus = HOODCLOSED;
if (osOff == false) // If OS is on we turn off the screen
{
turnOffScreen();
}
}
else // Hood is closed
{
Serial.println("HOOD IS CLOSE");
if (osOff || osPowerOff) // If OS is stopped we started it
{
startOS();
} else {
turnOnScreen();
}
operateHood(OPEN, false);
restorePosition();
onHoodStatus = HOODOPENED;
}
delay(BUTTONDELAY); // A delay so we have time to capture the button release
}
}
void checkTiltButton()
{
/*
* Check if the Tilt button has been pressed and perform the tilt action
*/
int tiltButtonState = digitalRead(TILT_PIN); // Get the current state of the Tilt button
if (tiltButtonState == LOW) // Button has been pressed
{
Serial.println("TILT BUTTON");
if (currentHoodStatus == HOODOPENED) // Hood is currently physically open
{
if (tiltLevel == MAXTILT) // If at max tilt, return to fully opened
{
operateHood(OPEN, false);
tiltLevel = 0;
}
else // Otherwise, tilt it
{
operateHood(CLOSE, true);
tiltLevel++;
}
delay(BUTTONDELAY); // A delay so we have time to capture the button release
}
}
}
void operateHood(bool dir, bool tilt)
{
/*
* Operate the navigation hood by driving the motor
*
* Args:
* dir: A boolean determining the direction to drive the hood (OPEN or CLOSE)
* tilt: A boolean flag to signify if we only want to tilt the hood
*/
if (tilt) // If we only want to tilt the hood, dir is ignored
{
String debugString = "Tilting hood, potentiometer: ";
Serial.println(debugString + analogRead(POTENTIOMETER_PIN));
startMotor(CLOSE);
int currentValue = analogRead(POTENTIOMETER_PIN);
Serial.println(analogRead(currentValue));
// Run until we're fully open. If it's run for over 2s stop
while (getPotentiometerValue() < currentValue + TILTVALUE)
{
Serial.println(analogRead(POTENTIOMETER_PIN));
delay(100);
}
stopMotor();
}
else
{
if (dir) // If direction is OPEN
{
String debugString = "Opening hood, potentiometer: ";
Serial.println(debugString + analogRead(POTENTIOMETER_PIN));
startMotor(OPEN);
// Run until we're fully open. If it's run for over 2s stop
while (getPotentiometerValue() > HOODOPENEDVALUE && motorRunTime < 200)
{
delay(100);
motorRunTime++;
}
stopMotor();
motorRunTime = 0;
currentHoodStatus = HOODOPENED;
Serial.println("Hood is hopened");
}
else // If direction is CLOSE
{
String debugString = "Closing hood, potentiometer: ";
Serial.println(debugString + analogRead(POTENTIOMETER_PIN));
startMotor(CLOSE);
// Run until we're fully closed. If it's run for over 2s stop;
while (getPotentiometerValue() < HOODCLOSEDVALUE && motorRunTime < 200)
{
delay(100);
motorRunTime++;
}
stopMotor();
motorRunTime = 0;
currentHoodStatus = HOODCLOSED;
Serial.println("Hood is closed");
}
}
}
void startMotor(bool dir)
{
digitalWrite(L_EN_PIN, HIGH); // Enable the motor
digitalWrite(R_EN_PIN, HIGH); // Enable the motor
if (dir)
{
analogWrite(RPWM_PIN, 200);
}
else
{
analogWrite(LPWM_PIN, 200);
}
}
void stopMotor()
{
digitalWrite(L_EN_PIN, LOW);
digitalWrite(R_EN_PIN, LOW); // Stop the motor
analogWrite(LPWM_PIN, 0);
analogWrite(RPWM_PIN, 0);
}
void restorePosition()
{
/*
* Restore the previous tilt position if any
*/
for (int i = 0; i < tiltLevel; i++) // Tilt to previous desired level if any
{
delay(BUTTONDELAY);
operateHood(CLOSE, true);
}
}
int getPotentiometerValue()
{
int sensorValue = analogRead(POTENTIOMETER_PIN);
// Serial.println(sensorValue);
return sensorValue;
}
void turnOffScreen() {
Serial.println("turnOffScreen");
digitalWrite(SCREEN_PIN, HIGH);
delay(500);
digitalWrite(SCREEN_PIN, LOW);
}
void turnOnScreen() {
Serial.println("turnOnScreen");
digitalWrite(SCREEN_PIN, HIGH);
delay(500);
digitalWrite(SCREEN_PIN, LOW);
}
void startOS()
{
Serial.println("START OS");
if(osPowerOff){
Serial.println("POWER OS ON");
digitalWrite(OS_POWER_RELAY_PIN, HIGH);
osPowerOff = false;
} else {
digitalWrite(OS_PIN, LOW);
delay(500);
digitalWrite(OS_PIN, HIGH);
}
osOff = false;
}
void stopOS()
{
Serial.println("STOP OS");
digitalWrite(OS_PIN, LOW);
delay(5000); // Need to wait 5 sec to trigger turn off
digitalWrite(OS_PIN, HIGH);
delay(20000); // Wait 10 sec for android to turn off
digitalWrite(OS_POWER_RELAY_PIN, LOW);
osPowerOff = true;
osOff = true;
}
void sleepNow()
{
/*
* Setup an interrupt and enter sleep mode
*/
Serial.println("Entering sleep mode");
delay(100);
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set type of sleep mode
sleep_enable(); // Enable sleep mode
attachInterrupt(0, wakeUp, HIGH); // Use interrupt 0 (pin 2 ie. ACC input to wake device)
sleep_mode(); // Put device to sleep
sleep_disable(); // Execution resumes from here after waking up
detachInterrupt(0);
delay(100);
Serial.println("Resuming from Sleep");
}
void wakeUp()
{
Serial.println("WAKE UP");
/*
* The wakeUp() interrupt service routine will run when we get input from ACC (pin 2)
* Since we just want the device to wake up we do nothing here
*/
// test
}