Opencv считывает LCD и не обеспечивает последовательную связь с arduino

Я создавал проект, в котором следующая часть кода считывает определенную область дисплея(которой я поделился с мобильного телефона)

import cv2 as cv
import numpy as np
from PIL import ImageGrab
import serial
arduinodata = serial.Serial('com5',9600)

def led_on():
    arduinodata.write(b'1')

def led_off():
    arduinodata.write(b'0')
i=1

while True:
    screen = np.array(ImageGrab.grab(bbox=(0,0,1920,1080)))
    #define the screen resulation
    screen_res = 1920, 1080
    scale_width = screen_res[0] / screen.shape[1]
    scale_height = screen_res[1] / screen.shape[0]
    scale = min(scale_width, scale_height)
    #resized window width and height
    window_width = int(screen.shape[1] * scale)
    window_height = int(screen.shape[0] * scale)
    #cv.namedWindow('Resized Window', cv.WINDOW_NORMAL)
    cv.resizeWindow('Resized Window', window_width, window_height)
    resized = screen.resize()
    health_bar = screen[262:268, 142:365]    
    
    health_grayed = cv.cvtColor(health_bar, cv.COLOR_BGR2GRAY)
    count1 = cv.countNonZero(health_grayed)

if i==1:
    e =count1
    i=0

if e>count1:
    led_on()
    e=count1

if e<count1:
    
    e=count1

и всякий раз, когда значение переменной count1 уменьшается, я хочу, чтобы светодиод Arduino был включен

это был код arduino

char serialData;

void setup() {
  // put your setup code here, to run once:
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
  Serial.begin(9600);

}

void loop() 
  // put your main code here, to run repeatedly:
{
  if(Serial.available() >0)
  {
    digitalWrite(13,HIGH);
    delay(1000);
    digitalWrite(13,LOW);
    
   
   }

  
}

Но светодиод включается, но не выключается . Я не знаю, почему

кто-нибудь может мне помочь, пожалуйста

, 👍1


1 ответ


Лучший ответ:

0

Это происходит потому, что вы не читаете из сериала.

Когда вы отправляете данные в Arduino, они помещаются в последовательный буфер. Функция Serial.available() затем возвращает количество байтов в буфере. Байты удаляются из буфера с помощью функции Serial.read (), которой вы не делаете. Поскольку вы не удаляете байты из буфера, функция Serial.available() всегда будет возвращать число, большее нуля, с момента поступления первого байта. После задержки вы выключаете светодиод с помощью digitalWrite(13,НИЗКИЙ);, но на следующей итерации цикла оператор if снова выполняется (как описано выше). Это происходит так быстро, что вы думаете, что индикатор просто остается включенным. На самом деле он выключается, может быть, на несколько микросекунд, а затем включается снова.

Вы отправляете один байт для того, чтобы светодиод отреагировал. Таким образом, самым простым решением было бы просто прочитать один байт из буфера внутри оператора if. Результат может быть отброшен.

void loop()
{
  if(Serial.available() >0)
  {
    digitalWrite(13,HIGH);
    delay(1000);
    digitalWrite(13,LOW);
    Serial.read();  
   }
}

Функция Serial.read() удаляет один байт из буфера и возвращает его (поэтому здесь он отбрасывается). Таким образом, светодиод мигает для каждого байта, который Arduino получает по последовательномуканалу.


Примечание: В зависимости от того, как быстро вы отправляете данные, вы, возможно, захотите уточнить, что у вас есть отдельные байты. С помощью приведенного выше кода индикатор будет гореть в течение 3 секунд подряд, если вы отправите 3 байта (относительно) быстро (то есть последовательные байты с интервалом менее секунды). Чтобы было более ясно, что у вас есть 3 отдельных байта, вы можете добавить вызов delay() после выключения светодиода. Это дает вам возможность на самом деле увидеть, как он выключается.

,