Автоматическая крышка для миски

DeathMentor

✩✩✩✩✩✩✩
20 Май 2023
3
0
Всем привет! Начну с небольшой предыстории. Я живу с двумя кошками, серый канадский сфинкс и бело-рыжая дворняга. У сфинкса есть некоторые проблемы со здоровьем, и ей необходимо соблюдать диету. Соответственно кормить её нужно определённой едой в определённое время. Кошке это не объяснить, она ворует еду у рыжей, по этому было принято решение придумать умную крышку к миске рыжей кошки для предотвращения кражи еды. Так как сам я не программист, я решил воспользоваться не безызвестным chatGPT, и под его руководством я начал пытаться сделать подобную миску. Привело это к созданию двух кодов. Прогуглив все ошибки я их исправил, но беда в том что он всё равно не работает =D
Помогите пожалуйста понять в чём проблема.
Вкратце что у меня есть и как я вижу исход:
Неттоп с web камерой и Bluetooth
Камера смотрит на миски рыжей кошки ровно сверху
Arduino nano 3.0
Hc-05
Sg90
Камера постоянно смотрит на миски рыжей кошки, в момент когда в кадре появляется серый сфинкс, скрипт посылает по bluetooth сигнал на Arduino, который приводит сервопривод в действие. Серый сфинкс из кадра ушёл, миска открылась. Исключение когда рыжая кошка в кадре (сама ест из мисок.), тогда серво в действие не приводим.

Arduino:
<Servo.h>

Servo myservo;  // create servo object

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9
  Serial.begin(9600); // start serial communication at 9600bps
}

void loop() {
  if (Serial.available()){
    char command = Serial.read();
    if(command == '1'){
      myservo.write(90);  // if '1' is received rotate the servo by 90 degree
    } else {
      myservo.write(0);   // otherwise set the servo back to 0 degree
    }
  }
}
Python:
import cv2
import numpy as np
import serial
import time

# Define range of gray color in HSV
lower_gray = np.array([56, 56, 56])
upper_gray = np.array([156, 156, 156])

# Initialize serial port for Bluetooth communication
bluetoothSerial = serial.Serial("COM6", 9600)
time.sleep(2)  # wait for the serial connection to initialize

# Open the webcam
cap = cv2.VideoCapture(0)

# This will keep the program running indefinitely
while True:
    # Capture frame-by-frame
    _, frame = cap.read()

    # Convert the frame to HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # Threshold the HSV image to get only gray colors
    mask = cv2.inRange(hsv, lower_gray, upper_gray)

    # Bitwise-AND mask and original image
    res = cv2.bitwise_and(frame, frame, mask=mask)

    # Detect the contours on the binary image
    contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    # If there are any contours
    if contours:
        # find the largest contour
        largest = max(contours, key=cv2.contourArea)

        # get the area of the largest contour
        area = cv2.contourArea(largest)

        # if the area is above some threshold (you'll have to determine this yourself based on your camera and the size of the cat), then consider it as a cat
        if area > 5000:
            # Send '1' to rotate the servo to 90 degrees
            bluetoothSerial.write(b'1')
        else:
            # Send '0' to rotate the servo to 0 degrees
            bluetoothSerial.write(b'0')

    # Short delay to give time for other processes
    time.sleep(0.01)
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
Разве что на замок закрывать. Мой кот холодильник открывает без проблем. Да и любые незапертые двери. :ROFLMAO:
 
Изменено:

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
На ошейник кошке rfid метку. В миску встроить считыватель.
 

Divin

★★★✩✩✩✩
30 Янв 2021
437
192
@Forgetweb, Кошка не собака, да и не всяка собака в доме с ошейником, а так то да - QR, валидатор, ну Колокольцев в курсе как это работает в метро.
 

DeathMentor

✩✩✩✩✩✩✩
20 Май 2023
3
0
Не мой это вариант ребят, ни одна ни вторая ошейник долго не проносит. Плюс у этих считывателей расстояние работы маленькое. Если встроить в миску, значит кто-то будет по морде получать. Не то что я хочу))
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
Еще вариант - весы. Кошаки вряд ли весят одинаково. Доступ к миске ограничить так, что только стоя на весах до миски можно было добраться. Весы на микроконтроллере естественно и с него же управлять сервой.
Вариант с камерой какой то мутный. Кошки жрут и по ночам, когда камера не работает. Или всегда держать там свет включенным.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
@DeathMentor,
По моему стоит начать с создания видео с возможными ситуациями по наличию, движению кошек, вариантов освещения, и потом отрабатывать на нем скрипт без ардуино, просто с выводом сообщений на экран. Когда будет уверенность, что скрипт нормально распознает кошек, тогда переходить к управлению крышкой.
 

DeathMentor

✩✩✩✩✩✩✩
20 Май 2023
3
0
С весами хорошая идея. Взвесил кошек. Весят почти одинаково. 3.3 и 3.4. Не следил за их весом но думаю что он гуляет в рамках 100 грамм) не подойдёт такой вариант пока кто-то не откормится😂
В целом программа соединяется с ардуино, но то-ли она не шлёт ему ничего, то-ли серво подключён не правильно, то ли камера не реагирует на серый. Я никак не пойму как мне сузить круг поисков и как исправить найденную проблему. Сам предполагаю что не фурычит именно "зрение" у скрипта. Подскажите может почитать где можно как это работает и как настроить.

Если это поможет стимулировать знающих людей, я готов заплатить за помощь))
 
Изменено: