Stap 4: Stap 4: codering van het apparaat
Nu dat we het allemaal hebben zetten samen, zijn tijd maken we het werk. Eerste dingen eerst, open te stellen uw Arduino software. Zorg ervoor dat u het juiste apparaat selecteert en start een nieuw project.
Zodra je klaar, zijn tijd om te beginnen met onze initiële setup. We beginnen met het definiëren van onze constanten, bestanden, en variabelen opnemen.
#include #define trig 8 //Trig pin #define echo 9 //Echo pin #define serv 10 //Servo pin #define loopDuration 60 //Duration of scan loop #define alertDuration 30 //Duration of alert long duration, initialDistance, scannedDistance, timer, alertTimer; Servo servo; int servoPosition; bool alertMode; bool positiveMovement;
Vervolgens is de setup. Hier zetten we onze eerste variabelen die we zullen meteen gebruiken. De positie van de servo is ingesteld, de pinnen zijn toegewezen en de eerste lezen is lezen. Er is over het algemeen een 2.1 seconden vertraging voordat de setup is voltooid.
void setup() { servoPosition = 45; positiveMovement = 1; timer = 0; alertMode = 0; servo.attach(serv); servo.write(servoPosition); pinMode(trig, OUTPUT); pinMode(echo, INPUT); Serial.begin(9600); delay(1000); Serial.println("Initializing..."); delay(1000); Serial.println("Initialized."); initialScan(); delay(100); }
Nu voor de hoofdlus. Het programma controleert de voorwaarden en zal uitvoeren op basis van het resultaat. Namelijk, als het programma in de alert modus is, het zal doen een specifieke scan alleen voor die modus. Als niet gecontroleerd als de lus is voorbij, en als dat zo is zal de servo naar een nieuwe positie verplaatsen en deelnemen aan een nieuwe lezing en opnieuw instellen van de timer. Anders zal het controleren op verkeer en verhogen van de timer.
void loop() { if (alertMode) { alertScan(); } else if (timer > loopDuration ) { adjustServo(); initialScan(); timer = 0; } else { movementCheck(); timer++; } delay(10); }
alertScan handgrepen informeren de gebruiker er geweest een probleem en het aftellen voor de alert duur. Als de waakzame tijd met geen problemen is, het beëindigen van de waarschuwing en terug te keren naar de normale scan. Anders zal het informeren van de gebruiker van de situatie en af te tellen.
void alertScan() { if (alertTimer >= alertDuration) { alertMode = 0; initialScan(); Serial.println("Alert ended. Returning to normal."); delay(50); initialScan(); } else { Serial.print("Alert in progress. Time left: "); Serial.println(alertDuration - alertTimer); movementCheck(); alertTimer++; delay(10); } }
initialScan krijgt de afstand die worden vergeleken met de rest van de scans. De sensor zal afgeven van ultrasone golven en dan lezen ze in. Het lezen in gegevens vervolgens wordt geconverteerd naar inches en weergegeven in de seriële monitor.
void initialScan() { digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); duration = pulseIn(echo, HIGH); initialDistance = duration / 148; //Converts to inches Serial.print("Monitoring Distance: "); Serial.print(initialDistance); Serial.println("\""); delay(100); }
movementCheck doet het zelfde ding als initialScan, maar vergelijkt vervolgens de resultaten aan de aanvankelijk Lees in afstand. Als er geen problemen, dan is de lus blijft op. Anders wordt het de alertMode ingesteld op true.
}void movementCheck() { digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); duration = pulseIn(echo, HIGH); scannedDistance = duration / 148; delay(100); if (alertMode) { return; } if (scannedDistance > initialDistance + 2 || scannedDistance < initialDistance - 2) { Serial.print("Issue detected. Distance at: "); Serial.print(scannedDistance); Serial.println("\""); Serial.println("Alert in progress."); alertMode = 1; alertTimer = 0; timer -= 50; delay(10); } }
adjustServo is wat de aanpassing van de huidige hoek van de sensor worden verwerkt. Momenteel gebruikt het 45, 90 en 135 graden, hoewel dit kan zijn aangepast hoe u nodig hebt. De vertraging na servo.write is om te compenseren voor verschuiven of beweging die anders problemen met de lezingen veroorzaken kan.
void adjustServo() { if (alertMode) { Serial.println("Lockdown in progress."); return; } if (positiveMovement) { servoPosition+=45; } else if (!positiveMovement) { servoPosition-=45; } servo.write(servoPosition); delay(500); Serial.print("Current angle: "); Serial.println(servoPosition); if (servoPosition == 135) { positiveMovement = 0; } else if (servoPosition == 45) { positiveMovement = 1; } }
Hier is de volledige code. Voel je vrij om te wijzigen en te gebruiken aangezien u pasvorm ziet.
/* Nicholas RoweCS4985Movement Scanner */#include <Servo.h>#define trig 8 #define echo 9 #define serv 10 #define loopDuration 60 #define alertDuration 30 long duration, initialDistance, scannedDistance, timer, alertTimer; Servo servo; int servoPosition; bool alertMode; bool positiveMovement;void setup() { servoPosition = 45; positiveMovement = 1; timer = 0; alertMode = 0; servo.attach(serv); servo.write(servoPosition); pinMode(trig, OUTPUT); pinMode(echo, INPUT); Serial.begin(9600); delay(1000); Serial.println("Initializing..."); delay(1000); Serial.println("Initialized."); initialScan(); delay(100); }void loop() { if (alertMode) { alertScan(); } else if (timer > loopDuration ) { adjustServo(); initialScan(); timer = 0; } else { movementCheck(); timer++; } delay(10); }void alertScan() { if (alertTimer >= alertDuration) { alertMode = 0; initialScan(); Serial.println("Alert ended. Returning to normal."); delay(50); initialScan(); } else { Serial.print("Alert in progress. Time left: "); Serial.println(30 - alertTimer); movementCheck(); alertTimer++; delay(10); } }void initialScan() { digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); duration = pulseIn(echo, HIGH); initialDistance = duration / 148; Serial.print("Monitoring Distance: "); Serial.print(initialDistance); Serial.println("\""); delay(100); }void movementCheck() { digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); duration = pulseIn(echo, HIGH); scannedDistance = duration / 148; delay(100); if (alertMode) { return; } if (scannedDistance > initialDistance + 2 || scannedDistance < initialDistance - 2) { Serial.print("Issue detected. Distance at: "); Serial.print(scannedDistance); Serial.println("\""); Serial.println("Alert in progress."); alertMode = 1; alertTimer = 0; timer -= 50; delay(10); } }void adjustServo() { if (alertMode) { Serial.println("Lockdown in progress."); return; } if (positiveMovement) { servoPosition+=45; } else if (!positiveMovement) { servoPosition-=45; } servo.write(servoPosition); delay(500); Serial.print("Current angle: "); Serial.println(servoPosition); if (servoPosition == 135) { positiveMovement = 0; } else if (servoPosition == 45) { positiveMovement = 1; } }