Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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]]
 +
 +
  
  
iothings/proiecte/2022sric/motion-detection.1685668656.txt.gz · Last modified: 2023/06/02 04:17 by denis.zoican
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0