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:

1. Läs in Hämta alla sensorvärden överst i loopen. Knapp, tilt, fotocell. Spara i lokala variabler.
2. Uppdatera tillstånd Edge-detection på knappen — om den just nu gick från HIGH till LOW, toggla larmet. Mönstret från träff 3.
3. Fatta beslut If/else-kedja som bestämmer vilket av lägena som är aktivt: larm tjuter, stämningsljus, eller helt tyst.
4. Agera ut Skriv ut till buzzer, RGB-LED, ev. inbyggda LED:en. Sedan en kort delay och loopen börjar om.

Skelett att starta från

Strukturen är redan på plats — fyll i logiken i loop() själv.

larm-skelett.ino Ladda ner ↓
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.

larm-komplett.ino Ladda ner ↓
// ─── 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);
}
Hjälpfunktion 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.

Vägen framåt

Vad kan jag göra härnäst?

Kuraterade resurser — kanaler, projekt, nästa hardware, svenska komponenthandlare.

Resurser & nästa steg →