Oppgave 9: Ferdig

This commit is contained in:
Alex Thomassen 2019-01-31 14:03:56 +01:00
parent 08e67315cc
commit f381f3c267
Signed by: Alex
GPG Key ID: 10BD786B5F6FF5DE
2 changed files with 53 additions and 30 deletions

View File

@ -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)"
}

View File

@ -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 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 å "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 står det at 250 ms er "ok", 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 variabelet `pedActivateAfter`) skal trafikklys avslutte syklusen.
* Dette vil da skje tidligere enn vanlig i visse tilfeller.
* Om trafikklys allerede er 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, 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 hvilke trafikklys som skal lyse, som igjen er basert 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;
}