Hackathon — sense + act
Den röda tråden går ihop. Knapp, tilt, fotocell, buzzer och RGB — från fem komponenter till ett fungerande tjuvlarm. Mönstret bakom i princip allt inbyggt: läs in, fatta beslut, agera ut.
Uppgiften
Bygg ett tjuvlarm av kit-komponenterna du har:
- Knapp — slår på och av larmet.
- Tilt-sensor — utlöser larmet om någon flyttar på det.
- Fotocell — när rummet är mörkt (utan att larmet är på) tänds ett stämningsljus.
- Buzzer — tjuter när larmet utlöser.
- RGB-LED — blinkar rött vid larm, ger varmt sken som stämningsljus.
Inget nytt API. Allt bygger på det du redan kan — det som är nytt är att kombinera det.
Mönstret
Fyra block i loop() — samma struktur du kommer se i alla inbyggda system:
delay och loopen börjar om.
Skelett att starta från
Strukturen är redan på plats — fyll i logiken i loop() själv.
const int knappPin = 9;
const int tiltPin = 2;
const int ldrPin = A0;
const int buzzerPin = 12;
const int ledR = 6;
const int ledG = 5;
const int ledB = 3;
const int morkTroskel = 300;
bool larmPaslaget = false;
int lastKnappState = HIGH;
void sattFarg(int r, int g, int b) {
analogWrite(ledR, r);
analogWrite(ledG, g);
analogWrite(ledB, b);
}
void setup() {
Serial.begin(9600);
pinMode(knappPin, INPUT_PULLUP);
pinMode(tiltPin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledB, OUTPUT);
}
void loop() {
// 1. LÄS — knapp, tilt, fotocell
// TODO: läs alla tre och spara i variabler
// 2. BESLUT — knappen togglar larmet (flank-detektion)
// TODO: om knappen JUST tryckts (LOW men förra var HIGH),
// invertera larmPaslaget
// 3. AGERA — välj vad som ska hända
// - Om larm PÅ och tilt LUTAD: buzzer + rött blink
// - Om larm AV och MÖRKT: stämningsljus
// - Annars: tyst, RGB släckt
delay(10);
}
Komplett lösning
En version som uppfyller hela kravspecen. Bilaga D i kompendiet går igenom varje rad — varför den är där, vad den gör, och var den kommer ifrån.
// ─── Pin-tilldelning ────────────────────────────────────
const int knappPin = 9;
const int tiltPin = 2;
const int ldrPin = A0;
const int buzzerPin = 12;
const int ledR = 6;
const int ledG = 5;
const int ledB = 3;
const int morkTroskel = 300;
bool larmPaslaget = false;
int lastKnappState = HIGH;
void sattFarg(int r, int g, int b) {
analogWrite(ledR, r);
analogWrite(ledG, g);
analogWrite(ledB, b);
}
void setup() {
Serial.begin(9600);
pinMode(knappPin, INPUT_PULLUP);
pinMode(tiltPin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledB, OUTPUT);
Serial.println("Larmet startat. Larm av som default.");
}
void loop() {
// 1. LÄS INPUTS
int knappState = digitalRead(knappPin);
bool tiltLutad = (digitalRead(tiltPin) == LOW);
delay(50); // debounce tilt — kulan bouncar i hylsan
int ljus = analogRead(ldrPin);
// 2. EDGE-DETECTION för knappen (toggla larmläget)
if (knappState == LOW && lastKnappState == HIGH) {
larmPaslaget = !larmPaslaget;
Serial.print("Larm nu ");
Serial.println(larmPaslaget ? "PÅ" : "AV");
}
lastKnappState = knappState;
// 3. BESTÄM VAD SOM SKA HÄNDA
if (larmPaslaget && tiltLutad) {
digitalWrite(buzzerPin, HIGH);
sattFarg(255, 0, 0);
delay(100);
digitalWrite(buzzerPin, LOW);
sattFarg(0, 0, 0);
delay(100);
} else if (!larmPaslaget && ljus < morkTroskel) {
digitalWrite(buzzerPin, LOW);
sattFarg(120, 60, 20);
} else {
digitalWrite(buzzerPin, LOW);
sattFarg(0, 0, 0);
}
delay(10);
}
sattFarg(r, g, b): Tre analogWrite-rader paketerade till en funktion. När du senare vill sätta en färg räcker det med sattFarg(255, 0, 0) istället för tre separata rader. Det är så koden blir läsbar när den växer.
Vad du har lärt dig på fem träffar
Du började med en enda LED och en resistor. Du slutar med ett komplett inbyggt system som läser flera sensorer samtidigt, fattar beslut och agerar.
- Träff 1: Krets & Ohms lag & LED & Blink — sätta upp och styra utgångar.
- Träff 2: PWM & RGB — utgångar med flera nivåer, inte bara av/på.
- Träff 3: Knapp & if/else & flank-detektion — ingångar och logik.
- Träff 4: Fotocell & tilt & Serial & spänningsdelare — analog avläsning och felsökning.
- Träff 5: Integration — sense + act-loopen som är hjärtat i allt inbyggt.
Det här är inte ett slut, utan en avstamp.
Vad kan jag göra härnäst?
Kuraterade resurser — kanaler, projekt, nästa hardware, svenska komponenthandlare.