Справка по последовательному входу

Привет, ребята, у меня есть светодиодная лента с 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'); }

}

, 👍1

Обсуждение

Можно ли вручную зажечь светодиод? То есть напишите более простой код, который просто включает этот светодиод и ничего больше., @Majenko


1 ответ


Лучший ответ:

0

Ваша проблема заключается в положении закрывающей скобки первого оператора 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