Accelerometer-asingangen die drie RGB-ledstrips aansturen - Trinket Pro 5V

Ik ben op zoek naar de analoogwaarde van de x-, y- en z-as (op pinnen 0, 2 en 4) en als het een bewegingstoestand is, voer dan een regenboog-, cylone- en cascade-ledsequentie uit met de Adafruit Neopixel-bibliotheek.

Met behulp van de seriële verbinding zag ik dat de x-, y- en z-as worden uitgelezen bij waarden van ongeveer 300.

Toen ik de code uitvoerde, voerde het de drie Neopixel-sequenties uit (redPin op pin 3, GreenPin op pin 5 en BluePin op pin 6) en gaat dan verder, zelfs als er geen verandering is in de positie van de versnellingsmeter.

Wat doe ik verkeerd? Ik gebruik Arduino Trinket Pro 5V en werk alleen met de x-as en RGB-strip op pin 3 om te starten.

Dankjewel voor je hulp.

#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
Hebt u geprobeerd om anal.waarde in uw lus af te drukken om te controleren of het zich gedraagt ​​zoals u verwacht?
toegevoegd de auteur mongo, de bron

2 antwoord

Bedankt aan @ nick-gammon voor het debuggen van mijn code.

Ik heb het opgeschoond, dus hieronder is het werkmonster. De X-as van de versnellingsmeter is gerelateerd aan PWM pin 3 RGB LED-strip, Y-as van pin 5 en Z-as aan pin 6.

De LED-sequentie loopt één keer in lentegroene kleur in reactie op de kanteling in richting.

#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
toegevoegd

Het lijkt mij dat je codeert om altijd iets op de LED's weer te geven:

  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
toegevoegd