python - 在英雄联盟中控制由健康栏百分比领导
问题描述
我编写了一个代码来控制英雄联盟中由健康百分比变化引起的变化。我使用 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);
}
}
}
在此处输入代码
解决方案
Serial.read()
只读取 1 个字节的数据。如果在您的 过程中有更多字节进入delay()
,仍然会读取最旧的字节。这意味着您的串行端口可能完全填充了大于 80 的值。您应该执行以下 2 项操作:
- 分解您的 arduino 程序,以确保您在合理的时间内实际接收并评估端口上的正确值。
- 不让 LED 闪烁
delay()
。这是如何做到这一点的众多教程之一:https ://www.forward.com.au/pfod/ArduinoProgramming/TimingDelaysInArduino.html
推荐阅读
- c# - 将 DUO WEB 与 .NET 核心集成
- python - Numpy 数组对象或数据结构
- c# - 单击以打开面板并在面板打开时再次单击以关闭 unity2d ui c#
- azure-devops - Azure Devops Web 扩展用户首选项/设置存储
- java - Java Spring管道远程文件成分段上传
- android - 如何从 chrome://sync-internal 调用的转储中破译访问 URL 的时间
- swift - 如何在 ForEach 循环中获取计数变量
- postman - PostMan 中的 Docusign 身份验证 API 配置
- python - CountVectorizer() 不适用于单字母词
- python - python - 当我的函数中的全局变量没有改变时,如何更改它?