#include <Wire.h> //
#include <Adafruit_GFX.h> // Ulike OLED bibiliotek
#include <Adafruit_SSD1306.h> //
#define SCREEN_WIDTH 128 // OLED display bredde
#define SCREEN_HEIGHT 64 // OLED display høyde
const int button = 13; // Button pin
bool lastButtPress = false; // Sjekke om knapp var trykket (haha butt (ja det var med vilje))
const int constRainbowR = 6; // Konstant regnbue led R sin pin
const int constRainbowG = 5; // Konstant regnbue led G sin pin
const int constRainbowB = 3; // Konstant regnbue led B sin pin
const int rainbowR = 11; // Styrelig regnbue led R sin pin
const int rainbowG = 10; // Styrelig regnbue led G sin pin
const int rainbowB = 9; // Styrelig regnbue led B sin pin
int currentR; // Variabel for å lagre nåværende inputtet R verdi
int currentG; // Variabel for å lagre nåværende inputtet G verdi
int currentB; // Variabel for å lagre nåværende inputtet B verdi
int wantedR; // Variabel for å lagre ønsket inputtet B verdi
int wantedG; // Variabel for å lagre ønsket inputtet B verdi
int wantedB; // Variabel for å lagre ønsket inputtet B verdi
const int wiggleRoom = 10; // Hvor mye mer/mindre nåværende kan være fra ønsket fargeverdi
bool correctColor = false; // Bool til å styre en while loop når man styrer fargen
bool correctCode = false; // Bool til å styre en while loop når man skriver inn koden
#define OLED_RESET -1 // Oppsett av OLED
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
unsigned long currentMillis = 0; // Variabel til å lagre millis
const int interval = 1000; // Variabel til millis intervall for å telle ned i timer
int countdownSeconds; // Hvor mange sekunder i nedtellingen
const int code = 5492; // Koden å skrive inn
int numIn = 0; // Hvilket tall man endrer, går fra 0 til 3 for siffer 1 til 4
int codeInput[4] = {0,0,0,0}; // Liste med siffer man skriver inn
bool next = false; // Bool til å sjekke om man skal ut av spesifike while looper
void setup() {
Wire.begin(); // SDA connected to A5, SCL connected to A4
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Starter display
display.clearDisplay(); // Fjerner minne fra display
display.setTextColor(WHITE); // Setter textfarge på OLED til hvit
Serial.begin(9600); // Starter serial til bruk for debugging av variabler
pinMode(rainbowR, OUTPUT); // Setter opp pin til R i styrbar regnbue led
pinMode(rainbowG, OUTPUT); // Setter opp pin til G i styrbar regnbue led
pinMode(rainbowB, OUTPUT); // Setter opp pin til B i styrbar regnbue led
pinMode(constRainbowR, OUTPUT); // Setter opp pin til R i konstant regnbue led
pinMode(constRainbowG, OUTPUT); // Setter opp pin til G i konstant regnbue led
pinMode(constRainbowB, OUTPUT); // Setter opp pin til B i konstant regnbue led
pinMode(button, INPUT_PULLUP); // Setter opp pin til å lese knapp
int avgSeed = (analogRead(A0)+analogRead(A1) + analogRead(A2))/3; // sjekker gjennomsnittet til potmeter for å generere ett "seed" til random
srand(avgSeed); // setter random seed til gjennomsnittet
}
// Funksjon som stiller alle verdier i codeInput til 0
void resetInput(){
codeInput[0] = 0; // Setter første siffer i codeInput til 0
codeInput[1] = 0; // Setter andre siffer i codeInput til 0
codeInput[2] = 0; // Setter tredje siffer i codeInput til 0
codeInput[3] = 0; // Setter fjerde siffer i codeInput til 0
}
// Funksjon til å skrive av nåværende RGB verdier basert på potmeter
void setAdjustable(){
analogWrite(rainbowR, currentR); // Skriver justerbar LED R til currentR som ble satt tidligere
analogWrite(rainbowG, currentG); // Skriver justerbar LED G til currentG som ble satt tidligere
analogWrite(rainbowB, currentB); // Skriver justerbar LED B til currentB som ble satt tidligere
}
// Funksjon til å sette konstant led
void setConstant(){
analogWrite(constRainbowR, wantedR); // Skriver ønsket R verdi til LED
analogWrite(constRainbowG, wantedG); // Skriver ønsket G verdi til LED
analogWrite(constRainbowB, wantedB); // Skriver ønsket B verdi til LED
}
// Funksjon til å lage tilfeldig farge på konstante led
void randomLed(){
wantedR = rand() %256; // Setter ønsket R verdi til random mellom 0 og 255
wantedG = rand() %256; // Setter ønsket G verdi til random mellom 0 og 255
wantedB = rand() %256; // Setter ønsket B verdi til random mellom 0 og 255
}
void loop() {
while(correctCode == false){ // Første while loop, skriving og sjekk av kode
Serial.println(digitalRead(button)); // Printer hvilken state knapp er i for debug
codeInput[numIn] = map(analogRead(A2),0,1023,0,9); // Leser av potmeter koblet til A2, kalt B for blå, til å skrive inn tall mellom 0 og 9
if ((digitalRead(button) == 0) and (lastButtPress == false)){ // Sjekker om knapp er trykket og ikke var trykket sist
numIn = numIn + 1; // Legger til hvilket siffer som redigeres når du trykker
lastButtPress = true; // Sier at du trykker på knappen
} else if ((lastButtPress == true) and (digitalRead(button) == 1)){ // Sjekker om at du ikke har trykket og at den sist var trykket
lastButtPress = false; // Sier du ikke trykker på knappen
}
Serial.println(numIn); // Printer numIn for debug (den hopper fra 3 til 6, men funker fortsatt)
// Gir instruksjoner om hvordan man skriver inn koden
display.clearDisplay(); // Fjerner lagret minne i OLED
display.setCursor(0,0); // Setter hvor den printer fra til øvre venstre hjørne
display.setTextSize(2); // Setter tekststørrelsen til 2
display.println("Input kode"); // Printer og setter ny linje i OLED sitt minne
display.setTextSize(1); // Setter tekststørrelsen til 1
display.println("b = rullere"); // Printer og setter ny linje i OLED sitt minne
display.println("knapp = input"); // Printer og setter ny linje i OLED sitt minne
display.setTextSize(2); // Setter tekststørrelsen til 2
// For loop som printer hvert tall i codeInput med et mellomrom i OLEDs minnne
for (int i = 0; i <= 3; i = i + 1){
display.print(codeInput[i]);
display.print(" ");
}
display.println(); // Setter neste linje på OLED under sifrene
// For loop som printer mellomrom under siffer utenom det man endrer på
for (int i = 0; i <= 3; i = i + 1){
if (numIn == i){ // Sjekker om den printer samme verdien som numIn
display.print("^");
} else {
display.print(" ");
}
display.print(" ");
}
display.display(); // Viser alt i minnet til OLED
//Stor if statement som sjekker om man har skrevet inn rett kode
if (numIn > 3){ // Sjekker om man inputtet mer en 3 tall (som tidligere nevnt den hopper fra 3 til 6, så det brukes > istedenfor =)
if((codeInput[0]*1000 + codeInput[1]*100 + codeInput[2]*10 + codeInput[3]) == code){ // En barbarisk måte for å sjekke om siffrene i codeInput blir lik til koden
display.clearDisplay(); // Fjerner minne i OLED
display.setCursor(0,0); // Setter hvor den printer fra til øvre venstre hjørne
display.setTextSize(3); // Setter tekstørrelse til 3
display.println("Korrekt"); // Printer "korrekt" og setter inn ny linje på OLED
display.println("kode"); // Printer "kode" og setter inn ny linje på OLED
display.setTextSize(1); // Setter tekststørrelse til 1
display.println("Knapp for oppgave"); // Printer "Knapp for oppgave" og setter inn ny linje på OLED
display.display(); // Viser alt i minnet til OLED
next = false; // Setter variabelen next til false for å vise at den ikke skal gå til neste før while loopen er ferdig
while (next == false){ // While loop imens next er false, brukt til å sjekke om man trykker knappen
if ((digitalRead(button) == 0) and (lastButtPress == false)){ // Sjekker om knappen er trykket og ikke var trykket før
lastButtPress = true; // Setter at knappen var trykket sist
correctCode = true; // Setter at man har rett kode, som vil lukke den større while loopen
next = true; // Setter next til true, sånn at man kan fortsette i koden
} else if ((lastButtPress == true) and (digitalRead(button) == 1)){ // Sjekker om knappen ikke var trykket, og om den var trykket sist
lastButtPress = false; // Setter at knappen ikke var trykket sist
}
}
} else { // Else statement som Viser at man har feil om man skrev feil kode
display.clearDisplay(); // Fjerner minne i OLED
display.setCursor(0,0); // Setter hvor den starter å printe til øvre venstre hjørne
display.setTextSize(3); // Setter tekststørrelse til 3
display.println("Feil"); // Printer "Feil" og legger til en ny linje
display.println("kode"); // Printer "Kode" og legger til en ny linje
display.setTextSize(1); // Setter tekststørrelsen til 1
display.println("Knapp for restart"); // Printer "Knapp for restart" og legger til en ny linje
display.display(); // Viser alt i minnet til OLED
next = false; // Setter variabelen next til false for å vise at den ikke skal gå til neste før while loopen er ferdig
while (next == false){ // While loop imens next er false, brukt til å sjekke om man trykker knappen
if ((digitalRead(button) == 0) and (lastButtPress == false)){ // Sjekker om knappen er trykket og ikke var trykket før
lastButtPress = true; // Setter at knappen var trykket sist
numIn = 0; // Resetter siffer man skriver inn til det første
resetInput();
next = true; // Setter next til true, sånn at man kan fortsette i koden
} else if ((lastButtPress == true) and (digitalRead(button) == 1)){ // Sjekker om knappen ikke var trykket, og om den var trykket sist
lastButtPress = false; // Setter at knappen ikke var trykket sist
}
}
}
}
}
// Koden nedover gjør rede til oppgaven
randomLed(); // Setter ønsket RGB verdi til tilfeldige tall mellom 0 og 255
setConstant(); // Setter konstant led til riktig RGB verdi
Serial.println(correctColor); // Printer om man har rett farge for debugging (man skal ikke ennå, selv om den er nøyaktig lik av tilfeldighet)
// Gjør rede for nedtellingen
currentMillis = millis(); // Setter currentMillis lik millis for nedtellingen
countdownSeconds = 60; // Setter antall sekunder man har på seg til 60
display.clearDisplay(); // Fjerner minne til OLED
display.setCursor(0,0); // Setter hvor den printer fra til øvre venstre hjørne
display.setTextSize(2); // Setter tekststørrelse til 2
display.println("Match led"); // Printer "Match led" og legger til en ny linje
display.println(); // Legger til en ny linje
display.setTextSize(4); // Setter tekststørrelse til 4
display.print(countdownSeconds); // Printer antall sekunder igjen
display.display(); // Viser alt i minnet til OLED
// While loop som kjører oppgaven hvor man finner led
while(correctColor == false){ // Sjekker om correctColor er false
// Leser av potmeter for RGB verdier
currentR = map(analogRead(A0),0,1023,0,255); // Leser av R verdien justert til mellom 0 og 255
currentG = map(analogRead(A1),0,1023,0,255); // Leser av G verdien justert til mellom 0 og 255
currentB = map(analogRead(A2),0,1023,0,255); // Leser av B verdien justert til mellom 0 og 255
// Printer nåværende justerbare regnbue led verdier
Serial.print("Current: R:"); // Printer "Current: R:" til serial
Serial.print(currentR); // Printer currentR til serial
Serial.print(" G:"); // Printer " G:" til serial
Serial.print(currentG); // Printer currentG til serial
Serial.print(" B:"); // Printer " B:" til serial
Serial.println(currentB); // Printer currentB til serial
// Printer nåværende konstante regnbue led verdier
Serial.print("Wanted : R:"); // Printer "Wanted : R:" til serial
Serial.print(wantedR); // Printer wantedR til serial
Serial.print(" G:"); // Printer " G:" til serial
Serial.print(wantedG); // Printer wantedG til serial
Serial.print(" B:"); // Printer " B:" til serial
Serial.println(wantedB); // Printer wantedB til serial
setAdjustable();
// Timerfunksjon som setter ned countdownSeconds hvert sekund
if((currentMillis + interval) <= millis()){ // Sjekker om currentMillis og intervallen er mindre en millis()
if (countdownSeconds > 0){ // Sjekker om det er mer enn 0 sekund igjen
currentMillis = millis(); // Setter currentMillis til millis() for neste sekund
countdownSeconds -= 1; // Gjør countdownSeconds 1 mindre for det har gått ett sekund
display.clearDisplay(); // Fjerner minne til OLED
display.setCursor(0,0); // Setter hvor den printer fra til øvre venstre hjørne
display.setTextSize(2); // Setter tekststørrelse til 2
display.println("Match led"); // Printer "Match led" og legger til en ny linje
display.println(); // Legger til en ny linje
display.setTextSize(4); // Setter tekststørrelse til 4
display.print(countdownSeconds); // Printer antall sekunder igjen
display.display(); // Viser alt i minnet til OLED
} else { // Else statement til hvis man er tom for tid
display.clearDisplay(); // Fjerner minne til OLED
display.setCursor(0,0); // Setter hvor den printer fra til øvre venstre hjørne
display.setTextSize(2); // Setter tekststørrelse til 2
display.println("Du gikk tom for tid"); // Printer "Du gikk tom for tid" og legger til en ny linje
display.setTextSize(1); // Setter tekststørrelse til 1
display.println("Restart med knapp"); // Printer "Restart med knapp" og legger til en ny linje
display.display(); // Viser alt i minnet til OLED
next = false; // Setter variabelen next til false for å vise at den ikke skal gå til neste før while loopen er ferdig
while (next = false){ // Holder deg fast til du trykker knappen
if ((digitalRead(button) == 0) and (lastButtPress == false)){ // Sjekker om knappen er trykket og ikke var trykket før
next = true; // Setter next til true, sånn at man kan fortsette i koden
lastButtPress = true; // Sier at du trykker på knappen
} else if ((lastButtPress == true) and (digitalRead(button) == 1)){ // Sjekker om knappen ikke var trykket, og om den var trykket sist
lastButtPress = false; // Setter at knappen ikke var trykket sist
}
}
randomLed(); // Setter ønsket RGB verdi til tilfeldige tall mellom 0 og 255
setConstant(); // Setter konstant led til riktig RGB verdi
countdownSeconds = 60; // Resetter timeren til 60 sekund
}
}
// If statement som sjekker om RGB verdiene er +- 10 fra de ønskede og gir deg rett
if((currentR <= wantedR + wiggleRoom) and (currentR >= wantedR - wiggleRoom) and //
(currentG <= wantedG + wiggleRoom) and (currentG >= wantedG - wiggleRoom) and // Hvis nåværende verdi er innen +- wiggleroom av ønskede, så får man rett
(currentB <= wantedB + wiggleRoom) and (currentB >= wantedB - wiggleRoom)){ //
correctColor = true; // Sier at fargen er rett
display.clearDisplay(); // Fjerner minne til OLED
display.setTextSize(2); // Setter tekststørrelse til 2
display.setCursor(0, 0); // Setter hvor den printer fra til øvre venstre hjørne
display.print("Gratulerer"); // Printer "Gratulerer"
display.println("----------"); // Printer "----------" og legger til en ny linje
display.setTextSize(1); // Setter tekststørrelse til 2
display.println(" Neste kode er 1582"); // Printer " Neste kode er 1582" og legger til en ny linje
display.println(" Restart med knapp"); // Printer " Restart med knapp" og legger til en ny linje
display.display(); // Viser alt i minnet til OLED
}
}
// While loop til å holde deg fast fram til du trykker på knappen og starter på ny
while (correctColor == true){ // Sjekker om du hadde rett farge
if (digitalRead(button) == 0){ // Leser av om knappen blir trykket
correctCode = false; // Sier at koden er feil, slik at den tilstående while loopen tidligere i programmet har evnen til å kjøre igjen
correctColor = false; // Sier at fargen er feil, slik at den tilstående while loopen tidligere i programmet har evnen til å kjøre igjen
lastButtPress = true; // Sier at man har trykket på knappen, slik at man ikke setter inn tall med en gang man trykker
numIn = 0; // Setter sifferet man endrer til det første
resetInput(); // Resetter codeInput sine verdier til 0
}
}
}