Étape 4: Étape 4: l’appareil de codage
Maintenant que nous avons tout mis ensemble, il est temps nous faire fonctionner. Commençons tout d’abord, ouvrent votre logiciel Arduino. Assurez-vous que vous sélectionnez le périphérique approprié et démarrez un nouveau projet.
Une fois que vous êtes prêt, son temps de démarrer avec notre configuration initiale. Nous commençons par définir nos constantes, inclure des fichiers et des variables.
#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;
Suivant est le programme d’installation. Ici, nous avons mis nos variables initiales que nous allons utiliser tout de suite. La position du servo est réglée, les broches sont mappés et la lecture initiale est lu. Il y a un retard deuxième 2,1 ensemble avant que l’installation est terminée.
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); }
Maintenant pour la boucle principale. Le programme vérifie les conditions et s’exécutera selon le résultat. À savoir, si le programme est en mode alerte, il fera une analyse spécifique juste pour ce mode. Si non, il vérifie si la boucle est terminée et si oui vont déplacer le servo vers une nouvelle position et prendre à une nouvelle lecture et réinitialiser la minuterie. Dans le cas contraire, il vérifiera pour mouvement et augmenter la minuterie.
void loop() { if (alertMode) { alertScan(); } else if (timer > loopDuration ) { adjustServo(); initialScan(); timer = 0; } else { movementCheck(); timer++; } delay(10); }
alertScan poignées pour informer l’utilisateur il a été un problème et le compte à rebours pour la durée de l’alerte. Si le temps d’alerte est en place sans aucun problème, il terminera l’alerte et regagner le balayage normal. Autrement il informera l’utilisateur de la situation et compte à rebours.
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 obtient la distance sur laquelle le reste des scans est comparé à. Le capteur envoie des ondes ultrasoniques et eux en lirait. La lecture de données est ensuite convertie en pouces et affichée dans le moniteur de la série.
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 fait la même chose qu’initialScan, mais compare ensuite les résultats à la distance lue au départ. S’il n’y a pas de problèmes, la boucle continue ensuite sur. Sinon, il définit l’alertMode sur 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, c’est ce qui gère le réglage de l’angle actuel de la sonde. Il utilise actuellement 45, 90 et 135 degrés, même si cela peut être ajusté de façon dont vous avez besoin. Le retard après servo.write est de compenser tout déplacement ou mouvement qui serait autrement causer des problèmes avec la lecture.
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; } }
Voici le code complet. N’hésitez pas à modifier et l’utiliser comme bon vous semble.
/* 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; } }