-
Notifications
You must be signed in to change notification settings - Fork 0
/
Indigo_V1.3.ino
179 lines (149 loc) · 4.7 KB
/
Indigo_V1.3.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
//Høyttaler
unsigned long forrigeTid = 0;
unsigned long tid = 0;
int intervall = 2000;
//Boolse sjekkpunkter
boolean hodestotteOk = false;
boolean mobilholderOk = false;
boolean setebelteOk = false;
boolean harLyst = false;
//Maaling av bilsikkerhet
const int setebelte = 12;
const int mobilholder = A0;
const int hodestotte = 13;
int hodeTeller = 0;
//Tykkplate til telefon
int kraft;
//LEDs og lyd
const int gronnLED = 9;
const int setebelteLED = 2;
const int mobilholderLED = 3;
const int hodeputeLED = 4;
const int statusLED = 6;
const int hoyttaler = 8;
//Brukes til aa maale om initiell test er utfoert
int teller = 0;
void setup() {
//De ulike portene settes til riktig modus
pinMode(setebelte, INPUT_PULLUP);
pinMode(hodestotte, INPUT);
pinMode(mobilholder, INPUT);
pinMode(gronnLED, OUTPUT);
pinMode(setebelteLED, OUTPUT);
pinMode(hodeputeLED, OUTPUT);
pinMode(mobilholderLED, OUTPUT);
pinMode(statusLED, OUTPUT);
//Ved oppstart settes alle de roede lysene paa, i tillegg til statusLED som lyser naar enheten er paa
digitalWrite(setebelteLED, HIGH);
digitalWrite(hodeputeLED, HIGH);
digitalWrite(mobilholderLED, HIGH);
digitalWrite(statusLED, HIGH);
}
void loop() {
//Tar forste sjekk av alle sensorer, dersom teller er mindre enn 1.
if (teller < 1) {
hovedsjekk();
}
//Sjekker alle sensorer, med unntak av nakkestoette, dersom teller er storre eller lik 1.
//Dersom en feil oppstaar og rettes, kjores pulserEnGang().
if (teller >= 1) {
sjekk();
pulserEnGang();
}
}
//Forestegangssjekk av alle sensorer.
void hovedsjekk(){
sjekkSetebelte();
sjekkMobilholder();
sjekkHodestotte();
//Hvis alle sensorene er OK, settes teller til 1 og hovedsjekk vil ikke utfoeres paa nytt.
if(hodestotteOk && mobilholderOk && setebelteOk) {
teller += 1;
pulserendeLys();
harLyst = true;
}
}
//Sjekker setebelte og mobilholder. Gir lys- og lydsignal dersom en av sensorkretsene brytes
void sjekk() {
sjekkSetebelte();
sjekkMobilholder();
//Dersom mobilholder eller setebeltesensor ikke er OK, setter harLyst til false og et lydsignal spilles av.
if (mobilholderOk == false || setebelteOk == false) {
harLyst = false;
tid = millis();
if (forrigeTid + intervall < tid) {
lyd(300, 200);
forrigeTid = millis();
}
}
}
//Sjekker ved kjoring om det groenne pulserende lyset allerede har lyst naar siste feil ble rettet. Hvis ikke, kjoerer den pulserendeLys()
//Lokken startes kun dersom harLyst == false, som kun er tilfellet dersom en sensor har gitt feilsignal.
//Dersom alle sensorene igjen er OK og harLyst fortsatt == false, kjores pulserendeLys(), for saa at harLyst settes lik true.
void pulserEnGang() {
if(!harLyst) {
sjekkSetebelte();
sjekkMobilholder();
if (mobilholderOk == true && setebelteOk == true && harLyst == false) {
pulserendeLys();
harLyst = true;
}
}
}
//Spiller av et lydsignal med forhaandsdefinert varighet
void lyd(int frekvens, int ms) {
tone(hoyttaler, frekvens, ms);
}
//Sjekker setebelte og styrer LED som indikerer om setebeltet er tilkoblet eller ikke
void sjekkSetebelte(){
if (digitalRead(setebelte)) {
digitalWrite(setebelteLED, HIGH);
setebelteOk = false;
}else {
digitalWrite(setebelteLED, LOW);
setebelteOk = true;
}
}
//Sjekker mobilholder og styrer LED som indikerer om mobilen er satt riktig paa plass eller ikke
void sjekkMobilholder(){
kraft = analogRead(mobilholder);
if (kraft > 500) {
digitalWrite(mobilholderLED, LOW);
mobilholderOk = true;
} else {
digitalWrite(mobilholderLED, HIGH);
mobilholderOk = false;
}
}
//Sjekker mobilholder og slaar av LED for hodeplassering dersom sensoren trigges ved riktig sittestilling.
//Sittestillingen sjekkes kun en gang etter oppstart.
void sjekkHodestotte(){
if (digitalRead(hodestotte)) {
hodeTeller ++;
digitalWrite(hodeputeLED, LOW);
hodestotteOk = true;
} else if (hodeTeller > 0){
digitalWrite(hodeputeLED, LOW);
} else {
digitalWrite(hodeputeLED, HIGH);
}
}
//millis-basert metode for aa utsette handling under kjoering av kode
void millisDelay(int ms) {
unsigned long now = millis();
int ventetid = ms;
while (millis() < now + ventetid) { }
}
//Kjorer en lys-sekvens hvor alle RGB-diodene fader opp og ned gronnfarge.
//Lysstyrken okes med 5 og skrives til alle de analog-styrte diodene hver 30. ms
//Paa tilsvarende maate senkes lysstyrken igjen naar lyset har naadd maks lysstyrke paa 200.
void pulserendeLys() {
for (int lysStyrke = 0 ; lysStyrke <= 200; lysStyrke += 5) {
analogWrite(gronnLED, lysStyrke);
millisDelay(30);
}
for (int lysStyrke = 200 ; lysStyrke >= 0; lysStyrke -= 5) {
analogWrite(gronnLED, lysStyrke);
millisDelay(30);
}
}