Справка по последовательному входу
Привет, ребята, у меня есть светодиодная лента с 6 светодиодами. (Я управляю ими через Kinect и обработку. Он отправляет 1,2,3,4,5,6 на Arduino. Кажется, это работает нормально.)
В Arduino LED0,LED1,LED2,LED3,LED4 работают отлично, но последний не работает. он вообще не светится.
Кто-нибудь знает, что происходит?
#include <FastLED.h>
#define LED_PIN 13
#define NUM_LEDS 6
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
int incomingByte = Serial.read();
//1
if(incomingByte=='1'){
leds[0] = CRGB(255, 0, 0);
FastLED.show();}
if(incomingByte=='2'){
leds[0] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='3'){
leds[0] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='4'){
leds[0] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='5'){
leds[0] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='6'){
leds[0] = CRGB(0, 0, 0);
FastLED.show();}
//2
if(incomingByte=='1'){
leds[1] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='2'){
leds[1] = CRGB(255, 0, 0);
FastLED.show();}
if(incomingByte=='3'){
leds[1] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='4'){
leds[1] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='5'){
leds[1] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='6'){
leds[1] = CRGB(0, 0, 0);
FastLED.show();}
//3
if(incomingByte=='1'){
leds[2] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='2'){
leds[2] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='3'){
leds[2] = CRGB(255, 0, 0);
FastLED.show();}
if(incomingByte=='4'){
leds[2] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='5'){
leds[2] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='6'){
leds[2] = CRGB(0, 0, 0);
FastLED.show();}
//4
if(incomingByte=='1'){
leds[3] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='2'){
leds[3] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='3'){
leds[3] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='4'){
leds[3] = CRGB(255, 0, 0);
FastLED.show();}
if(incomingByte=='5'){
leds[3] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='6'){
leds[3] = CRGB(0, 0, 0);
FastLED.show();}
//5
if(incomingByte=='1'){
leds[4] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='2'){
leds[4] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='3'){
leds[4] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='4'){
leds[4] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='5'){
leds[4] = CRGB(255, 0, 0);
FastLED.show();}
if(incomingByte=='6'){
leds[4] = CRGB(0, 0, 0);
FastLED.show();}
//6
if(incomingByte=='1'){
leds[5] = CRGB(0, 0, 0);
FastLED.show();
if(incomingByte=='2'){
leds[5] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='3'){
leds[5] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='4'){
leds[5] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='5'){
leds[5] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='6'){
leds[5] = CRGB(255, 0, 0);
FastLED.show();}
}
}
}
вот код обработки:
float x = 100;
float y = 50;
float w = 150;
float h = 80;
import org.openkinect.freenect.*;
import org.openkinect.processing.*;
import processing.serial.*;
// События kinect происходят в другом классе
KinectTracker tracker;
Kinect kinect;
Serial myPort;
void setup() {
size(512, 424);
kinect = new Kinect(this);
tracker = new KinectTracker();
String portName = Serial.list()[3]; //изменяем 0 на 1 или 2 и т.д., чтобы соответствовать вашему порту
myPort = new Serial(this, portName, 9600);
}
void draw() {
tracker.track();
tracker.display();
PVector v1 = tracker.getPos();
fill(50, 100, 250, 200);
noStroke();
ellipse(v1.x, v1.y, 50, 50);
//1
if (v1.x > 0 && v1.x < 50 ){
println('1');
//прямоугольник(0,200,200,200);
myPort.write('1'); }
//println('0'); }
//2
if (v1.x > 50 && v1.x < 100){
println('2');
myPort.write('2'); }
//3
if (v1.x > 100 && v1.x < 150 ){
println('3');
myPort.write('3'); }
//4
if (v1.x > 150 && v1.x < 200 ){
println('4');
myPort.write('4'); }
//5
if (v1.x > 200 && v1.x < 250 ){
println('5');
myPort.write('5'); }
//6
if (v1.x > 250 && v1.x < 300 ){
println('6');
myPort.write('6'); }
}
@Juriaan , 👍1
Обсуждение1 ответ
Лучший ответ:
Ваша проблема заключается в положении закрывающей скобки первого оператора if для светодиода 6:
//6
if(incomingByte=='1'){
leds[5] = CRGB(0, 0, 0);
FastLED.show(); // здесь отсутствует закрывающая скобка
if(incomingByte=='2'){
leds[5] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='3'){
leds[5] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='4'){
leds[5] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='5'){
leds[5] = CRGB(0, 0, 0);
FastLED.show();}
if(incomingByte=='6'){
leds[5] = CRGB(255, 0, 0);
FastLED.show();}
} // это недостающая закрывающая скобка
}
}
Это означает, что весь этот блок будет выполнен только тогда, когда incomingByte
имеет значение '1'
. Это также означает, что последний оператор if никогда не будет выполнен. Исправьте положение отмеченной закрывающей скобки, и все должно работать.
Кроме того, ваш код представляет собой очень сложный способ сделать это. Почему бы просто не переключить incomingByte
? Кроме того, чтобы писать меньше кода и сделать его более понятным, используйте функцию для выключения всех светодиодов («сброса» их):
void reset_LEDs(){
for(int i=0;i<NUM_LEDS;i++){
leds[i] = 0;
}
}
void loop(){
if (Serial.available() > 0) {
int incomingByte = Serial.read();
switch(incomingByte){
case '1':
reset_LEDs();
leds[0] = CRGB(255, 0, 0);
break;
case '2':
reset_LEDs();
leds[1] = CRGB(255, 0, 0);
break;
...
}
FastLED.show();
}
}
Когда вы придерживаетесь таких простых условий, вы можете оптимизировать больше:
int incomingByte = Serial.read() - '0'; //Преобразуем значение символа ASCII в десятичное целое число, вычитая нулевое значение ASCII
if(incomingByte > 0 && incomingByte <= NUM_LEDS){ //Проверяем, находится ли incomingByte между 1 и NUM_LEDS, включая
reset_LEDs();
leds[incomingByte - 1] = CRGB(255, 0, 0); // -1, поскольку отсчет массива начинается с 0, мы начинаем отсчет с 1
FastLED.show();
}
Для обеих версий вы экономите время, поскольку мы вызываем FastLED.show() только один раз, когда происходит изменение, а не несколько раз.
Спасибо тебе за это!, @Juriaan
Если это ответ на ваш вопрос, вы можете принять его как правильный. Спасибо, @chrisl
- Отправка информации (например, строки) через цифровые контакты
- Акцептант векселей ИКТ
- Отправка mouseX и mouseY из обработки в Arduino
- Как заставить Arduino реагировать на последовательную информацию?
- Как отправить 2 данных на обработку с Arduino
- Мне нужна помощь в передаче голоса через VLC
- ОБНОВЛЕНИЕ: ошибка в коде обработки - не получает правильные данные от Arduino
- Использование MouseX в обработке для управления светодиодами. Ошибка в коде - светодиоды не горят
Можно ли вручную зажечь светодиод? То есть напишите более простой код, который просто включает этот светодиод и ничего больше., @Majenko