Как отправить int из Python в Arduino, чтобы использовать его в качестве аргумента для функции neopixel setPixelcolor ()? - PullRequest
1 голос
/ 26 мая 2019

Я пытаюсь отправить int номер из Python на Arduino, используя PySerial, используя .write([data]) для отправки с Python и Serial.read() или Serial.readString() для получения на Arduino, затем .setPixelColor() и .show() для зажгите светодиод на матрице, положение которой соответствует int, посылаемому Arduino (я использую Duopofun Neopixel Shield).

Но, похоже, он не работает должным образом, и я не могу использовать Serial Monitor, так как отправляю свои данные, так как порт будет занят.

Я попытался ввести число самостоятельно, используя Serial.readString(), затем преобразовать строку в int и, наконец, вставить в мою функцию, которая отображает светодиод.

Когда я делаю это, он работает правильно, но когда я посылаю некоторые данные, все ранее светящиеся светодиоды внезапно отключаются, что может быть вызвано только сбросом платы 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);

}

Все светодиоды выключаются при отправке некоторых данных, кроме первого светодиода, положение которого соответствует 0, используемому в функции .setPixelColor().

Проблема в том, что светодиод должен загореться до соответствующего int, отправленного Python (например, загорится пятый светодиод для целого числа 4).

1 Ответ

0 голосов
/ 27 мая 2019

Вам не нужно отправлять int из вашего скрипта Python.Просто отправьте строку и затем конвертируйте ее обратно в int на вашем Arduino.Кроме того, вы можете проверить число просто на вашем коде 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...