Advertisement
RobinBrusbo

kod med fula kommentarer

Feb 28th, 2020
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <LiquidCrystal.h> //Inkluderar biblioteket för LCD-skärmen
  2.  
  3. //definierar alla pinsen (define istället för int eftersom define inte tat upp minne på arduinon)
  4. #define TRIG_PIN 9
  5. #define ECHO_PIN 8
  6. #define SOUND_PIN 12
  7. #define BUTTON_PIN 2
  8. #define RED_LIGHT 5
  9. #define BLUE_LIGHT 6
  10.  
  11. int maxdistance = 25; //maximala avståndet man kan komma nära arduinon innan larmet aktiveras (i cm)
  12. long long start; //används för timer
  13. long long lastToggle; //används för timer
  14. long long lampTimer; //används för timer
  15. bool active; //säger om larmet ska vara aktiverat (1) eller i viloläge (0)
  16. int activeLight = 1; //säger vilken lampa som ska vara tänd. Antingen röd eller blå, 0 eller 1
  17. int frequency; //hur ofta lamporna ska byta. Är proportionell mot avståndet.
  18.  
  19. LiquidCrystal lcd(11, 10, 7, 4, 3, 1); //definierar alla pins för LCD-skärmen
  20.  
  21. void setup(){
  22.     Serial.begin(115200); //kopplar ihop konsolen
  23.    
  24.    //sätter pins till antingne input eller output beroende på användningsområde
  25.     pinMode(ECHO_PIN, INPUT);
  26.     pinMode(TRIG_PIN, OUTPUT);
  27.     pinMode(SOUND_PIN, OUTPUT);
  28.     pinMode(BUTTON_PIN, INPUT);
  29.     pinMode(RED_LIGHT, OUTPUT);
  30.     pinMode(BLUE_LIGHT, OUTPUT);
  31.    
  32.     lastToggle = millis(); //bärjar tideräkningen för knappen
  33.     active = false; //sätter alarmet till av
  34.    
  35.     lcd.begin(16,2); //sätter igång LCD-skärmen
  36. }
  37.  
  38. void skriv(){ //funktion för att skriva något på skärmen
  39.     lcd.setCursor(2, 1);
  40.     lcd.clear();
  41.     lcd.print("Ringer polis");
  42. }
  43.  
  44. float getDistance(){ //funktion om returnerar avståndet i cm
  45.     digitalWrite(TRIG_PIN, LOW);
  46.     delayMicroseconds(2);
  47.     digitalWrite(TRIG_PIN, HIGH); //sänder ut en ultraljudspuls från trigpin
  48.     delayMicroseconds(10); //väntar 10 mikrosekunder
  49.     digitalWrite(TRIG_PIN, LOW); //stänger av pulsen
  50.  
  51.     double duration = pulseIn(ECHO_PIN, HIGH); //duration är tiden det tar för pulsen att komma tillbaka till echopin
  52.  
  53.     return(0.0343*duration/2); //0.0343 = ljudets hastighet i cm/mikrosekund. Delar på två eftersom pulsen studsar
  54. }
  55.  
  56. bool isButtonPressed(){ //testar om knappen trycks ner
  57.     if (digitalRead(BUTTON_PIN)){ //om knappen trycks ner
  58.         if (millis() - lastToggle > 250){ //om det har gått 250 millisekunder sedan sen senast trycktes ner
  59.             lastToggle = millis(); //resettar timern
  60.             digitalWrite(RED_LIGHT, LOW); //stänger av lamporna (detta behövs egentligen inte men ger ett bugg om man tar bort)
  61.             digitalWrite(BLUE_LIGHT, LOW);
  62.             return(true); //true om knappen trycks ner
  63.         }
  64.     }
  65.     return(false); //false om den inte trycks ner
  66. }
  67.  
  68. void blink(){ //funktion för att blinka med lamporna. Kallas på hela tiden när alarmet är aktivt
  69.     int time = millis() - lampTimer; //hur långt tid det har gått sedan lamporna senast byttes
  70.     frequency = 10*getDistance(); //hur ofta lamporna ska byta
  71.  
  72.     if (time > frequency){ //om det har gått den tiden det ska innan de byts
  73.         lampTimer = millis(); //resettar timern
  74.         if (activeLight == 1){ //om den aktiva lampan är 1 så ska den tändas och blå släckas, och vice versa
  75.             digitalWrite(RED_LIGHT, HIGH);
  76.             digitalWrite(BLUE_LIGHT, LOW);
  77.             activeLight = 2; //ändrar activelight till nästa gång det har gått en frekvens
  78.         } else if (activeLight == 2){
  79.             digitalWrite(BLUE_LIGHT, HIGH);
  80.             digitalWrite(RED_LIGHT, LOW);
  81.             activeLight = 1;
  82.         }
  83.     }
  84. }
  85.  
  86. void alarm(){ //när larmet är aktivt och inte har tryckt ner inom 5 sek
  87.     noTone(SOUND_PIN); //stäng av ljudet för det är irriterande
  88.     skriv(); //kallar funktionen skriv() som skriver något på skrämen
  89.    
  90.     while (!isButtonPressed()){ //så länge vi inte trycker ner knappen så ska lamporna blinka
  91.         blink();
  92.     }
  93. }
  94.  
  95. void loop(){ //main-loopen för arduinon
  96.  
  97.     if (getDistance() < maxdistance && active == false){ //om man är nära nog och larmet inte redan är aktivt
  98.         tone(SOUND_PIN, 400); //sätt på alarmsignal
  99.         start = millis(); //starta timer
  100.         active = true; //nu är larmet aktivt
  101.     }
  102.    
  103.     while (active){
  104.         if (millis() - start < 5000){ //inom 5 sekunder ska man kunna stänga av larmet utan att tillkalla polis
  105.             if (isButtonPressed()){
  106.                 active = false; // active blir false för att larmet stänga av och går till viloläge
  107.                 noTone(SOUND_PIN);
  108.                 delay(3000); //delay för att larmet inte ska gå igång medan man trycker på knappen
  109.                 break;
  110.             }
  111.         }
  112.         if (millis() - start > 5000){ //om man inte trycker på knappen inom 5 sekunder
  113.             active = false; //alarmet blir till viloläge men alarm kommer kallas
  114.             alarm();
  115.         }
  116.     }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement