Sonar #2
Leestijd: 3 MinutenOp mijn werk moeten we onze pc locken wanneer we onze werkplek verlaten. Het is eigenlijk al een gewoonte geworden maar het moest makkelijker kunnen bedacht ik me. Een tijdje geleden heb ik een sonar module uitgeprobeerd. Het plan; gebruik een Arduino Leonardo om “Windows toets + L” te sturen wanneer de sonar module detecteert dat er geen persoon meer is binnen het opgegeven bereik.
Het is een redelijk simpele oplossing, bij het testen was het alleen belangrijk dat de Leonardo niet continue de pc ging locken en dat je zodoende geen code meer kon uploaden. Ook wou ik weten wanneer de pc gelocked werd dus een led om je te waarschuwen is wenselijk.
De eagle library voor de HC-SR04 kan je hier downloaden
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
const int trigPin = 2; const int echoPin = 4; const int ledPin = 7; boolean ledBlinked = false; void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(ledPin, OUTPUT); Keyboard.begin(); delay(100); } void loop() { long cm; cm = getAvgDistance(5); Serial.print(cm); Serial.print("cm"); Serial.println(); if(cm >= 100 && !ledBlinked) { for (int i=0; i <= 5; i++){ digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500); cm = getAvgDistance(5); if(cm <= 100) { return; } } ledBlinked = true; Keyboard.press(131); delay(100); Keyboard.press('l'); delay(100); Keyboard.releaseAll(); return; } if(cm < 50) { //fallback ledBlinked = false; } delay(1000); } long getAvgDistance(int loop) { long sum = 0; for (int i=0; i <= loop; i++){ sum += getDistance(); } return (sum / loop); } long getDistance() { long duration; // The sensor is triggered by a HIGH pulse of 10 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Read the signal from the sensor: a HIGH pulse whose // duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. duration = pulseIn(echoPin, HIGH); // Wait 50ms between pings (~ 20 pings/sec). 29ms should be min delay between pings delay(50); // convert the time into a distance return microsecondsToCentimeters(duration); } long microsecondsToCentimeters(long microseconds) { // The speed of sound is 340 m/s or 29 microseconds per centimeter. // The ping travels out and back, so to find the distance of the // object we take half of the distance travelled. return microseconds / 29 / 2; } |