3つのRGB LEDストリップを駆動する加速度計の軸入力 - Trinket Pro 5V

私はx、y、z軸のanalogRead Value(ピン0,2,4)を取りたいと思っています。動きの状態であれば、Adafruit Neopixelライブラリを使って、虹色、サイクロン、カスケードLEDシーケンスを実行します。

シリアル接続を使用して、x、y、z軸が約300の値で読み取られることがわかりました。

コードを実行すると、3つのNeopixelシーケンス(ピン3のredPin、ピン5のGreenPin、およびピン6のBluePin)が実行され、加速度計位置の変更がなくても継続します。

私は間違って何をしていますか? 私はArduino Trinket Pro 5Vを使用しており、ピン3でx軸とRGBストリップを使用して作業を開始します。

ご協力ありがとうございました。

#include 
#include "WS2812_Definitions.h"

#define PIN1 3
#define LED_COUNT1 5
#define PIN2 5
#define LED_COUNT2 5
#define PIN3 6
#define LED_COUNT3 5

// Create an instance of the Adafruit_NeoPixel class called "leds".
// That'll be what we refer to from here on...
Adafruit_NeoPixel RedPin = Adafruit_NeoPixel(LED_COUNT1, PIN1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel GreenPin = Adafruit_NeoPixel(LED_COUNT2, PIN2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel BluePin = Adafruit_NeoPixel(LED_COUNT3, PIN3, NEO_GRB + NEO_KHZ800);

const int sensorPinRed = A0;
const int sensorPinGreen = A2;
const int sensorPinBlue = A4;

int analogValue = 0;

void setup()
{

  RedPin.begin(); //Call this to start up the LED strip.
  //GreenPin.begin();
  //BluePin.begin();
  clearLEDs();  //This function, defined below, turns all LEDs off...
  RedPin.show();  //...but the LEDs don't actually update until you call this.
  //GreenPin.show();
  //BluePin.show()}

void loop()
{
  do{
   analogValue = analogRead(sensorPinRed);
 //Ride the Rainbow Road
  for (int i=0; i<10; i++)
  {
   //cylon function: first param is color, second is time (in ms) between cycles
    cylon(INDIGO, 500); //Indigo cylon eye!
  }

 //A light shower of spring green rain
 //This will run the cascade from top->bottom 20 times
  for (int i=0; i<20; i++)
  {
   //First parameter is the color, second is direction, third is ms between falls
    cascade(MEDIUMSPRINGGREEN, TOP_DOWN, 100); 
  }
  } while (analogValue>300);
}

// Implements a little larson "cylon" sanner.
// This'll run one full cycle, down one way and back the other
void cylon(unsigned long color, byte wait)
{
 //weight determines how much lighter the outer "eye" colors are
  const byte weight = 4;  
 //It'll be easier to decrement each of these colors individually
 //so we'll split them out of the 24-bit color value
  byte red = (color & 0xFF0000) >> 16;
  byte green = (color & 0x00FF00) >> 8;
  byte blue = (color & 0x0000FF);

 //Start at closest LED, and move to the outside
  for (int i=0; i<=LED_COUNT1-1; i++)
  {
    clearLEDs();
    RedPin.setPixelColor(i, red, green, blue); //Set the bright middle eye
   //Now set two eyes to each side to get progressively dimmer
    for (int j=1; j<3; j++)
    {
      if (i-j >= 0)
        RedPin.setPixelColor(i-j, red/(weight*j), green/(weight*j), blue/(weight*j));
      if (i-j <= LED_COUNT1)
        RedPin.setPixelColor(i+j, red/(weight*j), green/(weight*j), blue/(weight*j));
    }
    RedPin.show(); //Turn the LEDs on
    delay(wait); //Delay for visibility
  }

 //Now we go back to where we came. Do the same thing.
  for (int i=LED_COUNT1-2; i>=1; i--)
  {
    clearLEDs();
    RedPin.setPixelColor(i, red, green, blue);
    for (int j=1; j<3; j++)
    {
      if (i-j >= 0)
        RedPin.setPixelColor(i-j, red/(weight*j), green/(weight*j), blue/(weight*j));
      if (i-j <= LED_COUNT1)
        RedPin.setPixelColor(i+j, red/(weight*j), green/(weight*j), blue/(weight*j));
      }

    RedPin.show();
    delay(wait);
  }
}

// Cascades a single direction. One time.
void cascade(unsigned long color, byte direction, byte wait)
{
  if (direction == TOP_DOWN)
  {
    for (int i=0; i=0; i--)
    {
      clearLEDs();
      RedPin.setPixelColor(i, color);
      RedPin.show();
      delay(wait);
    }
  }
}

// Sets all LEDs to off, but DOES NOT update the display;
// call leds.show() to actually turn them off after this.
void clearLEDs()
{
  for (int i=0; iorange->green->...->violet for 0-191.
    RedPin.setPixelColor(i, rainbowOrder((rainbowScale * (i + startPosition)) % 192));
  }
 //Finally, actually turn the LEDs on:
  RedPin.show();
}
1
追加された
ビュー: 1
ループの analogValue の印刷を試して、期待通りに動作していることを確認しましたか?
追加された 著者 mongo,

2 答え

私のコードをデバッグするための@ nick-gammonに感謝します。

私はそれを掃除したので、下の作業サンプルです。加速度計のX軸は、PWMピン3のRGB LEDストリップ、ピン5のY軸、ピン6のZ軸に関連しています。

LEDシーケンスは、方向の傾きに応答して春の緑色に一度カスケード接続されます。

#include 
#include "WS2812_Definitions.h"

#define PIN1 3
#define LED_COUNT1 5
#define PIN2 5
#define LED_COUNT2 5
#define PIN3 6
#define LED_COUNT3 5

// Create an instance of the Adafruit_NeoPixel class called "XPin", "YPin" and "ZPin".
// That'll be what we refer to from here on...
Adafruit_NeoPixel XPin = Adafruit_NeoPixel(LED_COUNT1, PIN1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel YPin = Adafruit_NeoPixel(LED_COUNT2, PIN2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel ZPin = Adafruit_NeoPixel(LED_COUNT3, PIN3, NEO_GRB + NEO_KHZ800);

const int sensorPinX = A0;
const int sensorPinY = A2;
const int sensorPinZ = A4;

int analogValueX = 0;
int analogValueY = 0;
int analogValueZ = 0;

void setup()
{

  XPin.begin(); //Call this to start up the LED strip.
  YPin.begin();
  ZPin.begin();
  clearLEDs();  //This function, defined below, turns all LEDs off...

}

void loop()
{
   analogValueX = analogRead(sensorPinX);
   analogValueY = analogRead(sensorPinY);
   analogValueZ = analogRead(sensorPinZ);
   if ((analogValueX > 400) || (analogValueY > 400) || (analogValueZ > 400) )
   {

 //A light shower of spring green rain
 //This will run the cascade from top->bottom i times
  for (int i=0; i<1; i++)
  {
   //First parameter is the color, second is direction, third is ms between falls
    cascade(MEDIUMSPRINGGREEN, TOP_DOWN, 100); 
  }
   }
   else
   {
     clearLEDs();//Turn all LEDs off
   }
}

// Cascades a single direction. One time.
void cascade(unsigned long color, byte direction, byte wait)
{
  if (direction == TOP_DOWN)
  {
    for (int i=0; i=0; i--)
    {
      clearLEDs();
      XPin.setPixelColor(i, color);
      XPin.show();
      delay(wait);
    }

    for (int i=LED_COUNT2-1; i>=0; i--)
    {
      clearLEDs();
      YPin.setPixelColor(i, color);
      YPin.show();
      delay(wait);
    }

    for (int i=LED_COUNT3-1; i>=0; i--)
    {
      clearLEDs();
      ZPin.setPixelColor(i, color);
      ZPin.show();
      delay(wait);
    }
  }
}

// Sets all LEDs to off, but DOES NOT update the display;
// call leds.show() to actually turn them off after this.
void clearLEDs()
{
  for (int i=0; i
1
追加された

あなたは常にLEDに何かを表示するようにコーディングしているようです。

  void loop()
  {
    do {
      analogValue = analogRead(sensorPinRed);
     //display stuff
    } while (analogValue > 300);
  }

Assuming that you want the LEDs off when analogValue is <= 300, you have the test in the wrong place. That always does the loop at least once. How about:

  void loop()
    {
    analogValue = analogRead(sensorPinRed);
    if (analogValue > 300) 
      {
     //display stuff
      }
    else
      {
      clearLEDs();  //Turn all LEDs off...
      RedPin.show(); 
      BluePin.show(); 
      GreenPin.show(); 
      }
    }
1
追加された