首页 > 解决方案 > 在英雄联盟中控制由健康栏百分比领导

问题描述

我编写了一个代码来控制英雄联盟中由健康百分比变化引起的变化。我使用 python 和 OCR 来检测健康状况并将健康状况数字发送到 Arduino 以控制 LED,使其在健康状况 > 80% 时延迟 3 秒闪烁,当健康状况 < 80% 时延迟闪烁 1 秒。

问题在于,对于所有健康百分比,LED 仅以 3 秒延迟闪烁。我该怎么办 ?提前谢谢

Python代码:

 import serial
import time
import numpy as np
import cv2
from PIL import ImageGrab, Image
import os
import pytesseract

ser = serial.Serial('COM3', 9600)
#This loop allows opencv to capture the screen continuously
while True:

  img = ImageGrab.grab(bbox=[840, 1020, 940, 1050 ])

  
  img_np = np.array(img)

  frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY)
  text = pytesseract.image_to_string(frame)
 
  v3=-1
  if "/" in text:
    x = text.split("/")
    try:
        v1 = int(x[0])
        v2 = int(x[1])
        v3 = int((v1/v2)*100) 
        if v3<=100: 
           print(str(v3))
           v4= str(abs(v3))
           ser.write(b'v4')
           time.sleep(0.1)
           time.sleep(2)
           

          
    except:
        pass
   
  
  
  cv2.imshow("Screen", frame)

  if cv2.waitKey(1) == 27:
    break

cv2.destroyAllWindows()

Arduino代码

const int led=8;
String value;
int i;

void setup() 
   { 
      Serial.begin(9600); 
      pinMode(led, OUTPUT);
      Serial.println("Connection established...");
   }
 
void loop() 
   {
     while (Serial.available())
        {
             value = Serial.read();
             i = value.toInt();
             if (100 >= i > 80)
             {
                digitalWrite(led, HIGH);    
                delay(3000);
                digitalWrite(led, LOW);
             }
             else if (0 <= i < 80)
             {
                digitalWrite(led, HIGH);    
                delay(500);
                digitalWrite(led, LOW);
             }
             else { digitalWrite(led, LOW);
             }
        }
     
   }

在此处输入代码

标签: pythonarduinoserial-portocrtesseract

解决方案


Serial.read()只读取 1 个字节的数据。如果在您的 过程中有更多字节进入delay(),仍然会读取最旧的字节。这意味着您的串行端口可能完全填充了大于 80 的值。您应该执行以下 2 项操作:

  1. 分解您的 arduino 程序,以确保您在合理的时间内实际接收并评估端口上的正确值。
  2. 不让 LED 闪烁delay()。这是如何做到这一点的众多教程之一:https ://www.forward.com.au/pfod/ArduinoProgramming/TimingDelaysInArduino.html

推荐阅读