Invisible Mess Glasses
A project that makes your wish of not seeing a messy room come true.
Components and supplies
1
Arduino® UNO™ Q 2GB
1
10 Red LED 5mm
1
Relay Module
1
Smart Dimming Film
Tools and machines
1
3DPrinter
1
Web camera
Apps and platforms
Arduino App Lab
Project description
Code
main.py
python
Detects room clutter from an IP camera
1from arduino.app_utils import * 2import time 3import cv2 4import numpy as np 5 6IP = "your IP camera adress " 7 8VIDEO_URL = f"http://{IP}/video" 9 10 11EDGE_FRACTION_THRESHOLD = 0.030 12 13 14CONFIRM_N = 2 15 16SLEEP_SEC = 0.25 17 18 19def mon(s: str): 20 21 Bridge.call("log", s) 22 23 24def clutter_score(frame_bgr: np.ndarray) -> float: 25 # 軽量化 26 h, w = frame_bgr.shape[:2] 27 scale = 640 / max(w, h) 28 if scale < 1.0: 29 frame_bgr = cv2.resize(frame_bgr, (int(w * scale), int(h * scale))) 30 31 gray = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2GRAY) 32 gray = cv2.GaussianBlur(gray, (5, 5), 0) 33 edges = cv2.Canny(gray, 60, 160) 34 return float(np.count_nonzero(edges)) / edges.size 35 36 37confirmed_label = None 38candidate_label = None 39candidate_count = 0 40tick = 0 41 42 43def loop(): 44 global confirmed_label, candidate_label, candidate_count, tick 45 46 mon("[py] start (state-on-arduino mode)") 47 cap = cv2.VideoCapture(VIDEO_URL) 48 if not cap.isOpened(): 49 mon(f"[cam] failed to open") 50 return 51 52 53 ok, frame = cap.read() 54 if not ok or frame is None: 55 mon("[cam] first read failed") 56 return 57 58 mon(f"[cam] Opened video") 59 60 while True: 61 ok, frame = cap.read() 62 if not ok or frame is None: 63 mon("[cam] Frame read failed. retry...") 64 time.sleep(0.5) 65 continue 66 67 score = clutter_score(frame) 68 now_label = "MESS" if score >= EDGE_FRACTION_THRESHOLD else "CLEAR" 69 70 71 if now_label == candidate_label: 72 candidate_count += 1 73 else: 74 candidate_label = now_label 75 candidate_count = 1 76 77 sent = False 78 79 if candidate_count >= CONFIRM_N and candidate_label != confirmed_label: 80 confirmed_label = candidate_label 81 82 83 want_on = (confirmed_label == "CLEAR") 84 85 86 Bridge.call("set_state", bool(want_on)) 87 sent = True 88 89 tick += 1 90 cur = Bridge.call("get_state", True) 91 mark = " *" if sent else "" 92 mon( 93 f"score={score:.3f} now={now_label:<5} cand={candidate_label:<5}({candidate_count}) " 94 f"CONF={str(confirmed_label):<5} state={'ON' if cur else 'OFF'}{mark} thr={EDGE_FRACTION_THRESHOLD:.2f}" 95 ) 96 97 time.sleep(SLEEP_SEC) 98 99 100App.run(user_loop=loop)
sketch.ino
cpp
Detects room clutter from an IP camera
1#include <Arduino_RouterBridge.h> 2 3static const int RELAY_PIN = D9; 4static const int LED_PIN = D10; 5 6static const bool RELAY_ACTIVE_LOW = true; 7 8 9static const int PULSE_MS = 200; 10 11 12static bool relay_is_on = false; 13 14 15static void writeRelayLevel(bool on) { 16 if (RELAY_ACTIVE_LOW) digitalWrite(RELAY_PIN, on ? LOW : HIGH); 17 else digitalWrite(RELAY_PIN, on ? HIGH : LOW); 18} 19 20 21static void pulseToggle() { 22 23 Monitor.println("PULSE!"); 24 writeRelayLevel(true); 25 delay(PULSE_MS); 26 writeRelayLevel(false); 27} 28 29 30static void applyLed() { 31 digitalWrite(LED_PIN, relay_is_on ? LOW : HIGH); 32} 33 34 35bool set_state(bool want_on) { 36 if (want_on != relay_is_on) { 37 pulseToggle(); 38 relay_is_on = want_on; 39 } 40 applyLed(); 41 return relay_is_on; 42} 43 44// ログ用 45bool get_state(bool _ignored) { 46 return relay_is_on; 47} 48 49 50String log_msg(String s) { 51 Monitor.println(s); 52 return s; 53} 54 55void setup() { 56 57 pinMode(RELAY_PIN, OUTPUT); 58 writeRelayLevel(false); 59 60 pinMode(LED_PIN, OUTPUT); 61 digitalWrite(LED_PIN, LOW); 62 63 Bridge.begin(); 64 Monitor.begin(); 65 66 Bridge.provide("set_state", set_state); 67 Bridge.provide("get_state", get_state); 68 Bridge.provide("log", log_msg); 69 70 delay(2000); 71 Monitor.println("READY"); 72 Monitor.println(String("STATE(init)=") + (relay_is_on ? "ON" : "OFF")); 73} 74 75void loop() { 76 delay(50); 77}
Comments
Only logged in users can leave comments