我正在尝试使用 PySerial 将 int 数字从 Python 发送到 Arduino,使用 .write([data])
通过 Python 和 Serial.read() 发送
或 Serial.readString()
在 Arduino 上接收,然后 .setPixelColor()
和 .show()
点亮 LED 灯矩阵的位置对应于arduino发送的int
(我使用的是Duinofun Neopixel Shield)。
但它似乎无法正常工作,并且我无法使用串行监视器,因为我正在发送数据,因为端口会很忙。
我尝试使用 Serial.readString()
自己输入一个数字,然后将字符串转换为 int,最后放入显示 LED 的函数中。
当我这样做时,它确实工作正常,但是当我发送一些数据时,所有先前点亮的 LED 突然关闭,据我所知,这只能是由 Arduino 板重置引起的。
这是Python代码,它只是发送用户选择的int
import serial
a = int(input('Enter pixel position : '))
ser = serial.Serial("COM16", 9600)
ser.write([a])
这是 Arduino 程序读取传入数据的部分。
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(40, 6, NEO_GRB + NEO_KHZ800);
void setup() {
// put your setup code here, to run once:
pixels.begin();
Serial.begin(9600);
}
void loop() {
String a = Serial.readString();
int b = a.toInt();
pixels.setPixelColor(b, 30,30,30);
pixels.show();
Serial.println(a);
delay(1000);
}
当我发送一些数据时,所有 LED 都会关闭,除了第一个 LED(其位置对应于 .setPixelColor()
函数中使用的 0)。
问题是,LED 应该根据 Python 发送的相应 int 点亮(例如,int 为 4 时点亮第五个 LED)。
最佳答案
您不需要从 Python 脚本发送 int
。只需发送一个字符串,然后在 Arduino 上将其转换回 int
即可。此外,如果接收到的值有效,您可以简单地在 Arduino 代码上验证该数字。
Arduino 代码的另一个问题是您没有检查串行端口可用性,这将通过 Serial.readString()
返回空字符串。
下面显示了一个简单的方法,但您可以将其扩展到其他像素。
Python 脚本:
import serial
ser = serial.Serial("COM16", 9600)
while True:
input_value = input('Enter pixel position: ')
ser.write(input_value.encode())
Arduino 代码:
#define MIN_PIXEL_RANGE 0
#define MAX_PIXEL_RANGE 100
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(40, 6, NEO_GRB + NEO_KHZ800);
void setup()
{
// put your setup code here, to run once:
pixels.begin();
Serial.begin(9600);
}
void loop()
{
if (Serial.available())
{
String a = Serial.readString();
Serial.print("Received Value: ");
Serial.println(a);
int b = a.toInt();
if ((b >= MIN_PIXEL_RANGE) && (b <= MAX_PIXEL_RANGE))
{
pixels.setPixelColor(b, 30, 30, 30);
pixels.show();
delay(1000);
}
}
}
关于python - 如何将 int 从 Python 发送到 Arduino,以便将其用作 neopixel 函数 setPixelcolor() 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56316443/