Oppgave 9: Ferdig
This commit is contained in:
parent
08e67315cc
commit
f381f3c267
5
.vscode/arduino.json
vendored
5
.vscode/arduino.json
vendored
@ -1,5 +1,6 @@
|
||||
{
|
||||
"board": "arduino:avr:uno",
|
||||
"port": "COM7",
|
||||
"sketch": "Sketches\\sketch_sep13a-LEDBlink\\sketch_sep13a-LEDBlink.ino"
|
||||
"port": "COM6",
|
||||
"sketch": "Sketches\\sketch_jan10a-ArduinoInnlevering\\sketch_jan10a-ArduinoInnlevering.ino",
|
||||
"programmer": "Atmel-ICE (AVR)"
|
||||
}
|
@ -14,6 +14,7 @@ const int trafficYellow = 9;
|
||||
const int trafficGreen = 10;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
// Pins som skal være output, brukes bare i setup.
|
||||
int outputPins[] = {
|
||||
pedGreen,
|
||||
@ -32,7 +33,7 @@ void setup() {
|
||||
pinMode(outputPins[i], OUTPUT);
|
||||
}
|
||||
|
||||
pinMode(pedSwitch, INPUT_PULLUP);
|
||||
pinMode(pedSwitch, INPUT);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -79,7 +80,8 @@ int trafficLightLengths[] = {
|
||||
unsigned long lastStateChange = millis();
|
||||
|
||||
/**
|
||||
* Huske på sist gang fotgjengermodus startet.
|
||||
* Dette tracker når fotgjengermodus skal starte etter trafikklyssekvens er ferdig.
|
||||
* Senere i koden vil dette være noe lignende: millis() + pedActivateAfter
|
||||
*/
|
||||
unsigned long pedLastStart = 0;
|
||||
|
||||
@ -91,11 +93,13 @@ unsigned long pedLastEnd = 0;
|
||||
|
||||
/**
|
||||
* Antall millisekunder fotgjengere har på å "krysse".
|
||||
* Jeg har bare satt 5 sekunder, men det er valgfritt hvor langt dette er ¯\_(ツ)_/¯
|
||||
*/
|
||||
const int pedLength = 8000;
|
||||
const int pedLength = 5000;
|
||||
|
||||
/**
|
||||
* Antall millisekunder mellom hvert "blink" for fotgjengerlyset.
|
||||
* I oppgaven så står det at 250 ms er "ok", så dette blir da default.
|
||||
*/
|
||||
const int pedBlinkLength = 250;
|
||||
|
||||
@ -119,6 +123,19 @@ unsigned long pedLastBlinkChange = 0;
|
||||
*/
|
||||
bool pedActive = false;
|
||||
|
||||
/**
|
||||
* Om det grønne fotgjengerlyset skal lyse.
|
||||
*/
|
||||
bool pedLightOn = false;
|
||||
|
||||
/**
|
||||
* Hvor mange millisekunder etter at trafikklys er ferdig
|
||||
* som fotgjengerlys skal aktivere.
|
||||
*
|
||||
* I følge oppgaven skal dette være 5 sekunder.
|
||||
*/
|
||||
const int pedActivateAfter = 5000;
|
||||
|
||||
/**
|
||||
* Holder verdien om "fotgjengermodus" skal aktiveres
|
||||
* etter neste trafikklyssyklus.
|
||||
@ -130,14 +147,6 @@ bool pedShouldActivate = false;
|
||||
*/
|
||||
unsigned long pedShouldActivateTime = 0;
|
||||
|
||||
/**
|
||||
* Hvor mange millisekunder etter at fotgjengerknappen har blitt trykket inn
|
||||
* som fotgjengerlys skal aktivere.
|
||||
*
|
||||
* I følge oppgaven skal dette være 5 sekunder.
|
||||
*/
|
||||
const int pedActivateAfter = 5000;
|
||||
|
||||
void loop() {
|
||||
/**
|
||||
* Definer en felles verdi som er et resultat av millis().
|
||||
@ -153,9 +162,10 @@ void loop() {
|
||||
*
|
||||
* Knappen setter et flagg (`pedShouldActivate`) som sjekkes etter at trafikklys har gått tilbake til rødt.
|
||||
*/
|
||||
if (analogRead(pedSwitch) == LOW && !pedActive) {
|
||||
if (digitalRead(pedSwitch) == HIGH && !pedActive && !pedShouldActivate) {
|
||||
pedShouldActivate = true;
|
||||
pedShouldActivateTime = currentTime;
|
||||
Serial.println("Pedestrian button pressed");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -163,8 +173,9 @@ void loop() {
|
||||
* `pedActive` er som default false, men blir satt til true
|
||||
* når `pedShouldActivate` er true og trafikklysene har gått tilbake til rødt.
|
||||
*/
|
||||
if (pedActive) {
|
||||
bool pedLightOn = false;
|
||||
if (pedActive && currentTime >= pedLastStart) {
|
||||
pedShouldActivate = false;
|
||||
|
||||
if (pedBlinkCount == 0) {
|
||||
pedLightOn = true;
|
||||
}
|
||||
@ -178,7 +189,7 @@ void loop() {
|
||||
*/
|
||||
if (pedBlinkCount == 0) {
|
||||
pedLightOn = false;
|
||||
pedLastBlinkChange = currentTime;
|
||||
Serial.println("Start pedestrian blink");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -198,8 +209,13 @@ void loop() {
|
||||
pedLightOn = !pedLightOn;
|
||||
pedLastBlinkChange = currentTime;
|
||||
|
||||
Serial.print("Ped light status: ");
|
||||
Serial.println(pedLightOn);
|
||||
|
||||
if (pedLightOn) {
|
||||
pedBlinkCount++;
|
||||
Serial.print("Pedestrian blink: ");
|
||||
Serial.println(pedBlinkCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -209,8 +225,10 @@ void loop() {
|
||||
* og setter da `pedActive` tilbake til false slik at trafikklysene kan begynne vanlig syklus.
|
||||
*/
|
||||
if (pedBlinkCount >= pedMaxBlinkCount) {
|
||||
Serial.println("Pedestrian light over");
|
||||
pedActive = false;
|
||||
pedLightOn = false;
|
||||
pedBlinkCount = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -226,7 +244,9 @@ void loop() {
|
||||
* Denne "staten" vil bare være ved oppstart.
|
||||
*/
|
||||
if (trafficState == -1) {
|
||||
Serial.println("Traffic initialized.");
|
||||
digitalWrite(trafficRed, HIGH);
|
||||
digitalWrite(pedRed, HIGH);
|
||||
lastStateChange = currentTime;
|
||||
trafficState = 0;
|
||||
|
||||
@ -240,20 +260,12 @@ void loop() {
|
||||
int lightLength = trafficLightLengths[trafficState];
|
||||
|
||||
/**
|
||||
* Denne if-setningen sjekker to forskjellige ting:
|
||||
*
|
||||
* 1: `pedActivateNow`
|
||||
* Aller først sjekker den om fotgjengerknappen har blitt trykket.
|
||||
* 5 sekunder etter (basert på variabelet `pedActivateAfter`) skal trafikklys avslutte syklusen.
|
||||
* Dette vil da skje tidligere enn vanlig i visse tilfeller.
|
||||
* Om trafikklys allerede er på vei til å avslutte syklusen, kan det hende at dette skjer før 5 sekunder.
|
||||
*
|
||||
* 2: `incrementTrafficState`
|
||||
* Den vanlige sjekken er om `trafficState` skal inkrementes. Det vil da si at trafikken går som vanlig.
|
||||
* Denne if-setningen sjekker `incrementTrafficState`.
|
||||
* Dette sjekker om `trafficState` skal inkrementes, altså at et viss antall millisekunder har gått
|
||||
* siden trafikklys endret fra f.eks. gult til grønt, eller rødt til gult.
|
||||
*/
|
||||
bool pedActivateNow = (pedShouldActivate && currentTime - pedShouldActivateTime >= pedActivateAfter);
|
||||
bool incrementTrafficState = (!pedActive && currentTime - lastStateChange >= lightLength);
|
||||
if (pedActivateNow || incrementTrafficState)
|
||||
if (incrementTrafficState)
|
||||
{
|
||||
/**
|
||||
* Definer standard lysverdier for trafikklys, overskrives i switch nedenfor.
|
||||
@ -272,6 +284,9 @@ void loop() {
|
||||
*/
|
||||
lastStateChange = currentTime;
|
||||
|
||||
Serial.print("State change: ");
|
||||
Serial.println(trafficState);
|
||||
|
||||
/**
|
||||
* Trafikklys er ferdig med syklus, gå tilbake til rødt.
|
||||
* Hvis `trafficState` er mer enn 3, betyr det at siste del av syklus (gult lys) er ferdig.
|
||||
@ -286,7 +301,8 @@ void loop() {
|
||||
*/
|
||||
if (pedShouldActivate)
|
||||
{
|
||||
pedLastStart = currentTime;
|
||||
Serial.println("Pedestrian mode activates - Traffic light cycle over");
|
||||
pedLastStart = currentTime + pedActivateAfter;
|
||||
pedActive = true;
|
||||
pedBlinkCount = 0;
|
||||
}
|
||||
@ -300,27 +316,33 @@ void loop() {
|
||||
* Disse oppdateres basert på hvilke trafikklys som skal lyse, som igjen er basert på trafficState.
|
||||
* Etter switch-case skrives disse til LED og de aktiveres ettersom.
|
||||
*/
|
||||
|
||||
Serial.print("Traffic light: ");
|
||||
switch (trafficState)
|
||||
{
|
||||
// Rødt lys
|
||||
case redState:
|
||||
redLight = HIGH;
|
||||
Serial.println("Red");
|
||||
break;
|
||||
|
||||
// Rødt + gult lys
|
||||
case redYellowState:
|
||||
redLight = HIGH;
|
||||
yellowLight = HIGH;
|
||||
Serial.println("Red + Yellow");
|
||||
break;
|
||||
|
||||
// Grønt lys
|
||||
case greenState:
|
||||
greenLight = HIGH;
|
||||
Serial.println("Green");
|
||||
break;
|
||||
|
||||
// Gult lys
|
||||
case yellowState:
|
||||
yellowLight = HIGH;
|
||||
Serial.println("Yellow");
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user