Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal.h> //Inkluderar biblioteket för LCD-skärmen
- //definierar alla pinsen (define istället för int eftersom define inte tat upp minne på arduinon)
- #define TRIG_PIN 9
- #define ECHO_PIN 8
- #define SOUND_PIN 12
- #define BUTTON_PIN 2
- #define RED_LIGHT 5
- #define BLUE_LIGHT 6
- int maxdistance = 25; //maximala avståndet man kan komma nära arduinon innan larmet aktiveras (i cm)
- long long start; //används för timer
- long long lastToggle; //används för timer
- long long lampTimer; //används för timer
- bool active; //säger om larmet ska vara aktiverat (1) eller i viloläge (0)
- int activeLight = 1; //säger vilken lampa som ska vara tänd. Antingen röd eller blå, 0 eller 1
- int frequency; //hur ofta lamporna ska byta. Är proportionell mot avståndet.
- LiquidCrystal lcd(11, 10, 7, 4, 3, 1); //definierar alla pins för LCD-skärmen
- void setup(){
- Serial.begin(115200); //kopplar ihop konsolen
- //sätter pins till antingne input eller output beroende på användningsområde
- pinMode(ECHO_PIN, INPUT);
- pinMode(TRIG_PIN, OUTPUT);
- pinMode(SOUND_PIN, OUTPUT);
- pinMode(BUTTON_PIN, INPUT);
- pinMode(RED_LIGHT, OUTPUT);
- pinMode(BLUE_LIGHT, OUTPUT);
- lastToggle = millis(); //bärjar tideräkningen för knappen
- active = false; //sätter alarmet till av
- lcd.begin(16,2); //sätter igång LCD-skärmen
- }
- void skriv(){ //funktion för att skriva något på skärmen
- lcd.setCursor(2, 1);
- lcd.clear();
- lcd.print("Ringer polis");
- }
- float getDistance(){ //funktion om returnerar avståndet i cm
- digitalWrite(TRIG_PIN, LOW);
- delayMicroseconds(2);
- digitalWrite(TRIG_PIN, HIGH); //sänder ut en ultraljudspuls från trigpin
- delayMicroseconds(10); //väntar 10 mikrosekunder
- digitalWrite(TRIG_PIN, LOW); //stänger av pulsen
- double duration = pulseIn(ECHO_PIN, HIGH); //duration är tiden det tar för pulsen att komma tillbaka till echopin
- return(0.0343*duration/2); //0.0343 = ljudets hastighet i cm/mikrosekund. Delar på två eftersom pulsen studsar
- }
- bool isButtonPressed(){ //testar om knappen trycks ner
- if (digitalRead(BUTTON_PIN)){ //om knappen trycks ner
- if (millis() - lastToggle > 250){ //om det har gått 250 millisekunder sedan sen senast trycktes ner
- lastToggle = millis(); //resettar timern
- digitalWrite(RED_LIGHT, LOW); //stänger av lamporna (detta behövs egentligen inte men ger ett bugg om man tar bort)
- digitalWrite(BLUE_LIGHT, LOW);
- return(true); //true om knappen trycks ner
- }
- }
- return(false); //false om den inte trycks ner
- }
- void blink(){ //funktion för att blinka med lamporna. Kallas på hela tiden när alarmet är aktivt
- int time = millis() - lampTimer; //hur långt tid det har gått sedan lamporna senast byttes
- frequency = 10*getDistance(); //hur ofta lamporna ska byta
- if (time > frequency){ //om det har gått den tiden det ska innan de byts
- lampTimer = millis(); //resettar timern
- if (activeLight == 1){ //om den aktiva lampan är 1 så ska den tändas och blå släckas, och vice versa
- digitalWrite(RED_LIGHT, HIGH);
- digitalWrite(BLUE_LIGHT, LOW);
- activeLight = 2; //ändrar activelight till nästa gång det har gått en frekvens
- } else if (activeLight == 2){
- digitalWrite(BLUE_LIGHT, HIGH);
- digitalWrite(RED_LIGHT, LOW);
- activeLight = 1;
- }
- }
- }
- void alarm(){ //när larmet är aktivt och inte har tryckt ner inom 5 sek
- noTone(SOUND_PIN); //stäng av ljudet för det är irriterande
- skriv(); //kallar funktionen skriv() som skriver något på skrämen
- while (!isButtonPressed()){ //så länge vi inte trycker ner knappen så ska lamporna blinka
- blink();
- }
- }
- void loop(){ //main-loopen för arduinon
- if (getDistance() < maxdistance && active == false){ //om man är nära nog och larmet inte redan är aktivt
- tone(SOUND_PIN, 400); //sätt på alarmsignal
- start = millis(); //starta timer
- active = true; //nu är larmet aktivt
- }
- while (active){
- if (millis() - start < 5000){ //inom 5 sekunder ska man kunna stänga av larmet utan att tillkalla polis
- if (isButtonPressed()){
- active = false; // active blir false för att larmet stänga av och går till viloläge
- noTone(SOUND_PIN);
- delay(3000); //delay för att larmet inte ska gå igång medan man trycker på knappen
- break;
- }
- }
- if (millis() - start > 5000){ //om man inte trycker på knappen inom 5 sekunder
- active = false; //alarmet blir till viloläge men alarm kommer kallas
- alarm();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement