我为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指示灯不亮。
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)
#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) );
}
}