Справка по последовательному входу
Привет, ребята, у меня есть светодиодная лента с 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
- Как заставить светодиоды включаться в соответствии с непрерывным вводом Python?
- Мне нужна помощь в передаче голоса через VLC
- Почему номера COM-портов между Arduino и Processing не совпадают?
Можно ли вручную зажечь светодиод? То есть напишите более простой код, который просто включает этот светодиод и ничего больше., @Majenko