This shows you the differences between two versions of the page.
iothings:proiecte:2022sric:motion-detection [2023/06/02 04:17] denis.zoican |
iothings:proiecte:2022sric:motion-detection [2023/06/02 08:25] (current) denis.zoican [Software Design] |
||
---|---|---|---|
Line 20: | Line 20: | ||
- [[https://www.emag.ro/fire-cabluri-tata-tata-arduino-modulosy-20-cm-40-buc-5903689130493/pd/DSXWKRMBM/?cmpid=87002&gclid=CjwKCAjwg-GjBhBnEiwAMUvNW5PwIBJRkQa1B_L6_S4qtSAiKIHZwc8SP9CVTK0SFbi0vcymN0HNMhoC2AMQAvD_BwE | Connection wires]] | - [[https://www.emag.ro/fire-cabluri-tata-tata-arduino-modulosy-20-cm-40-buc-5903689130493/pd/DSXWKRMBM/?cmpid=87002&gclid=CjwKCAjwg-GjBhBnEiwAMUvNW5PwIBJRkQa1B_L6_S4qtSAiKIHZwc8SP9CVTK0SFbi0vcymN0HNMhoC2AMQAvD_BwE | Connection wires]] | ||
- | === Hardware Schematics === | + | === Schematics === |
{{:iothings:proiecte:2022sric:motion-detection-schema.png?700|}} | {{:iothings:proiecte:2022sric:motion-detection-schema.png?700|}} | ||
Line 43: | Line 43: | ||
//define sound speed in cm/uS | //define sound speed in cm/uS | ||
#define SOUND_SPEED 0.034 | #define SOUND_SPEED 0.034 | ||
- | #define CM_TO_INCH 0.393701 | ||
- | #define WIFI_NETWORK "MERCUSYS_DCEE" | + | #define WIFI_NETWORK "WIFI_NAME" |
- | #define WIFI_PASSWORD "74745814" | + | #define WIFI_PASSWORD "WIFI_PASS" |
#define WIFI_TIMEOUT 20000 | #define WIFI_TIMEOUT 20000 | ||
#define API_URL "http://ip-:5000/upload_photo" | #define API_URL "http://ip-:5000/upload_photo" | ||
Line 56: | Line 55: | ||
void setup() { | void setup() { | ||
- | Serial.begin(115200); // Starts the serial communication | + | Serial.begin(115200); |
pinMode(buzzerPin, OUTPUT); | pinMode(buzzerPin, OUTPUT); | ||
- | pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output | + | pinMode(trigPin, OUTPUT); |
- | pinMode(echoPin, INPUT); // Sets the echoPin as an Input | + | pinMode(echoPin, INPUT); |
connectToWifi(); | connectToWifi(); | ||
Line 72: | Line 71: | ||
<code> | <code> | ||
void connectToWifi(){ | void connectToWifi(){ | ||
- | Serial.println("Connecting.. status: " + String(WiFi.status())); | ||
WiFi.mode(WIFI_STA); | WiFi.mode(WIFI_STA); | ||
WiFi.begin(WIFI_NETWORK,WIFI_PASSWORD); | WiFi.begin(WIFI_NETWORK,WIFI_PASSWORD); | ||
Line 144: | Line 142: | ||
makeRequest(); | makeRequest(); | ||
- | // Wait for 1 second | + | // Wait for 5 seconds |
delay(5000); | delay(5000); | ||
noTone(buzzerPin); | noTone(buzzerPin); | ||
Line 179: | Line 177: | ||
conn.close() | conn.close() | ||
</code> | </code> | ||
+ | |||
+ | In order to capture a photo using the web cam, I used OpenCV, a library of functions for real-time computer vision. I implemented 3 endpoints: | ||
+ | |||
+ | 1. upload_photo | ||
+ | When it receives a POST request, a photo will be taken using the web cam and the image will be saved in the database. | ||
+ | |||
+ | 2. image/{id} | ||
+ | Is a GET endpoint and returns a image based on the received id. | ||
+ | |||
+ | 3. image | ||
+ | Is a GET endpoint and returns the latest image in the database. | ||
+ | |||
+ | <code> | ||
+ | from flask import Flask, send_file | ||
+ | import sqlite3 | ||
+ | import cv2 | ||
+ | |||
+ | |||
+ | app = Flask(__name__) | ||
+ | database_path = "./database.db" # SQLite database file | ||
+ | |||
+ | @app.route('/upload_photo', methods=['POST']) | ||
+ | def upload_photo(): | ||
+ | # Connect to database | ||
+ | conn = sqlite3.connect(database_path) | ||
+ | cursor = conn.cursor() | ||
+ | | ||
+ | # Capture a photo | ||
+ | cam = cv2.VideoCapture(0) | ||
+ | ret, frame = cam.read() | ||
+ | |||
+ | if not ret: | ||
+ | print("failed to grab frame") | ||
+ | return | ||
+ | |||
+ | photo_file_path = "opencv_photo.png" | ||
+ | |||
+ | # Read the photo file as binary | ||
+ | with open(photo_file_path, 'rb') as photo_file: | ||
+ | photo_data = photo_file.read() | ||
+ | |||
+ | # Insert the photo in database | ||
+ | cursor.execute("INSERT INTO images (name, image_data) VALUES (?, ?)", (photo_file_path, photo_data)) | ||
+ | |||
+ | conn.commit() | ||
+ | conn.close() | ||
+ | |||
+ | return "Photo was uploaded" | ||
+ | | ||
+ | @app.route('/image') | ||
+ | def get_image(): | ||
+ | # Connect to database | ||
+ | conn = sqlite3.connect(database_path) | ||
+ | cursor = conn.cursor() | ||
+ | |||
+ | # Retrieve the image from the database wih the highest ID | ||
+ | cursor.execute("SELECT image_data FROM images WHERE id= (SELECT MAX(id) from images)") | ||
+ | result = cursor.fetchone() | ||
+ | |||
+ | # Save the image data to a temporary file | ||
+ | image_data = result[0] | ||
+ | temp_file = "tempFile.jpg" # Path to temporary file | ||
+ | with open(temp_file, "wb") as file: | ||
+ | file.write(image_data) | ||
+ | |||
+ | # Close the database connection | ||
+ | conn.close() | ||
+ | |||
+ | # Send the image file | ||
+ | return send_file(temp_file, mimetype='image/jpeg') | ||
+ | | ||
+ | @app.route('/image/<image_id>') | ||
+ | def get_image_id(image_id): | ||
+ | # Connect to the database | ||
+ | conn = sqlite3.connect(database_path) | ||
+ | cursor = conn.cursor() | ||
+ | |||
+ | # Retrieve the image from the database based on the id | ||
+ | cursor.execute("SELECT image_data FROM images WHERE id=?", (image_id,)) | ||
+ | result = cursor.fetchone() | ||
+ | |||
+ | # Save the image data to a temporary file | ||
+ | image_data = result[0] | ||
+ | temp_file = "tempFile.jpg" | ||
+ | with open(temp_file, "wb") as file: | ||
+ | file.write(image_data) | ||
+ | |||
+ | # Close the database connection | ||
+ | conn.close() | ||
+ | |||
+ | # Send the image file | ||
+ | return send_file(temp_file, mimetype='image/jpeg') | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | app.run(host='0.0.0.0', port=5000) | ||
+ | |||
+ | </code> | ||
+ | |||
+ | The last photo can be viewed by accessing the url: raspberry-pi-ip:5000/image | ||
+ | === Demo === | ||
+ | |||
+ | YouTube link: https://www.youtube.com/watch?v=mqfNEk4cIAE | ||
+ | |||
+ | === References === | ||
+ | |||
+ | - [[https://docs.opencv.org/4.x/|OpenCV]] | ||
+ | - [[https://flask.palletsprojects.com/en/2.3.x/|Flask]] | ||
+ | - [[https://projecthub.arduino.cc/Isaac100/getting-started-with-the-hc-sr04-ultrasonic-sensor-7cabe1|HC-SR04]] | ||
+ | - [[https://www.sqlite.org/docs.html|SQLlite]] | ||
+ | |||
+ | |||