Python代码在shell中工作,但在封装在函数

时间:2017-03-17 03:07:30

标签: python arduino

我为Arduino写了一个草图,点亮了一个带有12个LED的Adafruit NeoPixel戒指。如果我使用Arduino IDE中的串行监视器输入数据,它可以正常工作。

它的工作方式是我给它一个字符串,它使用该字符串来确定用于LED的RGB值。例如,如果我输入'r100g0b0w0',LED将永久显示红色。然后我可以输入另一个字符串,例如'r0g0b0w100',为LED提供另一种颜色(在本例中为白色)。

我编写了一个与Arduino接口的python函数(Arduino通过USB连接到我的计算机),使用户能够输入他们想要的颜色并实时显示在Arduino上(即无需上传新草图)到Arduino)。

我遇到的问题是python文件底部的light_LED函数。它应该使用给定的整数red_intensity,green_intensity,blue_intensity和white_intensity来格式化类似于上面给出的字符串。然后它将字符串从UTF转换为字节格式,并将字符串发送到Arduino。

我在windows 10命令提示符下使用了python 3.6 shell。

如果我分别从函数“light_LED”运行每一行(用适当的整数值代替作为参数给出的强度数字),则NeoPixel Ring LED亮起。

但是当我使用整数参数运行函数时,LED不会亮起。因此,如果我通过在命令提示符中键入它来打开python shell:

py -3.6

然后我将它复制粘贴到python shell中:

import serial
import time

red_intensity=100
green_intensity=0
blue_intensity=0
white_intensity=0
ser = serial.Serial('COM6', 115200)
time.sleep(2)
rgb_string = (
    'r' + str(red_intensity) + 'g' + str(green_intensity) + 'b'
    + str(blue_intensity) + 'w' + str(white_intensity)
)
byte_rgb_string = rgb_string.encode()
ser.write(byte_rgb_string)

shell打印出发送的字节数(10),LED按预期亮起。但是如果我通过在Windows命令提示符下键入它来运行包含相同代码的函数:

py -3.6 -i light.py

然后在python shell中:

light_LED(100, 0, 0, 0)

没有打印任何内容,并且AdaFruit设备上的LED指示灯不亮。

这是我的Python文件:

import serial
import time

def light_LED(red_intensity, green_intensity, blue_intensity, white_intensity):
    ser = serial.Serial('COM6', 115200)
    time.sleep(2)
    rgb_string = (
        'r' + str(red_intensity) + 'g' + str(green_intensity) + 'b'
        + str(blue_intensity) + 'w' + str(white_intensity)
    )
    byte_rgb_string = rgb_string.encode()
    ser.write(byte_rgb_string)

如果你想看到它,这是我的Arduino草图:

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 5

#define NUM_LEDS 12

#define BRIGHTNESS 20

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);


void setup() {
  Serial.begin(115200);
  strip.setBrightness(BRIGHTNESS);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  if(Serial.peek() != -1) {
    displayGivenColors();
    // This prevents looping until additional data is sent by the computer.
    // This is necessary because loops seem to interrupt the displayGivenColors function.
    while(Serial.peek() == -1) {
    }
  }
}

void displayGivenColors(){
  // Enter the different color intensities separated by non-integer characters. 
  // The first number represents red, the next represent blue, then green, then white.
  // For example, the entry 'r255b0g0w0' will produce a full intensity red color.
  int redIntensity = Serial.parseInt();
  int blueIntensity = Serial.parseInt();
  int greenIntensity = Serial.parseInt();
  int whiteIntensity = Serial.parseInt();

  setAllPixelsToColor(redIntensity, blueIntensity, greenIntensity, whiteIntensity);
  strip.show();
}

void setAllPixelsToColor(int redNumber, int blueNumber, int greenNumber, int whiteNumber) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, strip.Color(redNumber, blueNumber, greenNumber, whiteNumber) );
  }
}

0 个答案:

没有答案