在另一个函数中根据值更改函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在另一个函数中根据值更改函数相关的知识,希望对你有一定的参考价值。

我有一个Adafruit Flora V3。我想更改通过红外遥控器连接到PIN 6的LED。

我需要Arduino在功能中时不断寻找新的IR命令,然后跳至新选择的功能。

起初,我尝试通过创建变量来解决它。在函数的最后,假设虹虹,获取变量,然后加1。在虹虹检查开始时,当变量= 10时,执行irdecoder()。这导致我的电路板循环,并实际上使IDE上的串行监视器崩溃。

我接下来尝试做的是像在网上找到的以下代码一样编辑我的代码,但是没有用。

void loop()
{
        int blink = 0 /* if you initialize incomingByte somewhere else, you should probably move this one there too */

        while (1) /* loop forever */
        {
                if (Serial.available()) /* read and process commands on the serial line */
                {
                        incomingByte = Serial.read();

                        switch (incomingByte)
                        {
                                case '1' : /* enable blinking */
                                {
                                        blink = 1;
                                        break;
                                }
                                case '2' : /* disable blinking */
                                {
                                        blink = 0;
                                        break;
                                }
                        }
                }

                if (blink) /* when enabled, blink leds */
                {
                        digitalWrite(led2, HIGH);
                        delay(300);
                        digitalWrite(led2, LOW);
                        digitalWrite(led1, HIGH);
                        delay(300)
                        digitalWrite(led1, LOW);
                }
        }
}

打开板子时,彩虹会自动启动,并在几秒钟后切换到弹跳球功能,而无需按遥控器上的任何按钮。

这是我当前的代码:

#include <Adafruit_NeoPixel.h>
#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

int NUM_LEDS = 29;
int IR_PIN = 9;
int LED_PIN = 6;
IRrecv irrec(IR_PIN);
decode_results hexdump;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

void rainbowCycle(int SpeedDelay) {
  byte *c;
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< NUM_LEDS; i++) {
      c=Wheel(((i * 256 / NUM_LEDS) + j) & 255);
      setPixel(i, *c, *(c+1), *(c+2));
    }
    showStrip();
    delay(SpeedDelay);
    }
}

byte * Wheel(byte WheelPos) {
  static byte c[3];

  if(WheelPos < 85) {
   c[0]=WheelPos * 3;
   c[1]=255 - WheelPos * 3;
   c[2]=0;
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   c[0]=255 - WheelPos * 3;
   c[1]=0;
   c[2]=WheelPos * 3;
  } else {
   WheelPos -= 170;
   c[0]=0;
   c[1]=WheelPos * 3;
   c[2]=255 - WheelPos * 3;
  }

  return c;
}

void BouncingBalls(byte red, byte green, byte blue, int BallCount) {
  float Gravity = -9.81;
  int StartHeight = 1;

  float Height[BallCount];
  float ImpactVelocityStart = sqrt( -2 * Gravity * StartHeight );
  float ImpactVelocity[BallCount];
  float TimeSinceLastBounce[BallCount];
  int   Position[BallCount];
  long  ClockTimeSinceLastBounce[BallCount];
  float Dampening[BallCount];

  for (int i = 0 ; i < BallCount ; i++) {  
    ClockTimeSinceLastBounce[i] = millis();
    Height[i] = StartHeight;
    Position[i] = 0;
    ImpactVelocity[i] = ImpactVelocityStart;
    TimeSinceLastBounce[i] = 0;
    Dampening[i] = 0.90 - float(i)/pow(BallCount,2);
  }

  while (true) {
    for (int i = 0 ; i < BallCount ; i++) {
      TimeSinceLastBounce[i] =  millis() - ClockTimeSinceLastBounce[i];
      Height[i] = 0.5 * Gravity * pow( TimeSinceLastBounce[i]/1000 , 2.0 ) + ImpactVelocity[i] * TimeSinceLastBounce[i]/1000;

      if ( Height[i] < 0 ) {                      
        Height[i] = 0;
        ImpactVelocity[i] = Dampening[i] * ImpactVelocity[i];
        ClockTimeSinceLastBounce[i] = millis();

        if ( ImpactVelocity[i] < 0.01 ) {
          ImpactVelocity[i] = ImpactVelocityStart;
        }
      }
      Position[i] = round( Height[i] * (NUM_LEDS - 1) / StartHeight);
    }

    for (int i = 0 ; i < BallCount ; i++) {
      setPixel(Position[i],red,green,blue);
    }

    showStrip();
    setAll(0,0,0);
  }
}

void NewKITT(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay){  
  RightToLeft(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  LeftToRight(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  OutsideToCenter(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  CenterToOutside(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  LeftToRight(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  RightToLeft(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  OutsideToCenter(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  CenterToOutside(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
}

void CenterToOutside(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
  for(int i =((NUM_LEDS-EyeSize)/2); i>=0; i--) {
    setAll(0,0,0);

    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue);
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);

    setPixel(NUM_LEDS-i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(NUM_LEDS-i-j, red, green, blue);
    }
    setPixel(NUM_LEDS-i-EyeSize-1, red/10, green/10, blue/10);

    showStrip();
    delay(SpeedDelay);
  }
  delay(ReturnDelay);
}

void OutsideToCenter(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
  for(int i = 0; i<=((NUM_LEDS-EyeSize)/2); i++) {
    setAll(0,0,0);

    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue);
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);

    setPixel(NUM_LEDS-i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(NUM_LEDS-i-j, red, green, blue);
    }
    setPixel(NUM_LEDS-i-EyeSize-1, red/10, green/10, blue/10);

    showStrip();
    delay(SpeedDelay);
  }
  delay(ReturnDelay);
}

void LeftToRight(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
  for(int i = 0; i < NUM_LEDS-EyeSize-2; i++) {
    setAll(0,0,0);
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue);
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    showStrip();
    delay(SpeedDelay);
  }
  delay(ReturnDelay);
}

void RightToLeft(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
  for(int i = NUM_LEDS-EyeSize-2; i > 0; i--) {
    setAll(0,0,0);
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue);
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    showStrip();
    delay(SpeedDelay);
  }
  delay(ReturnDelay);
}

void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue);
  }
  showStrip();
}

void setup()
{
  Serial.begin(9600);
  irrec.enableIRIn();
  strip.begin();
  strip.show();
}

void loop() {
  irdecoder();
}
void irdecoder(){
  int irval = 0;
  int rainbow = 0;
  int balls = 0;
  int kitt = 0;
  int off = 0;
  while(1)
  {
  if (irrec.decode(&hexdump))
    {
     Serial.println(hexdump.value);
     irval = hexdump.value;
     irrec.resume();
    }
  switch (irval)
  {
  case 16724175: //1
  rainbow = 1;
  break;
  case 16718055: //2
  rainbow = 0;
  break;
  case 16743045: //3
  balls = 1;
  break;
  case 16716015: //4
  balls = 0;
  break;
  case 16726215: //5
  kitt = 1;
  break;
  case 16734885: //6
  kitt = 0;
  break;
  }

  if (rainbow = 1) {
    rainbowCycle(9);
  }
  if (rainbow = 0) {
    strip.begin();
    strip.show();
  }
  if (balls = 1) {
    BouncingBalls(255,255,255, 3);
  }
  if (balls = 0) {
    strip.begin();
    strip.show();
  }
  if (kitt = 1) {
    NewKITT(200, 0, 200, 5, 25, 50);
  }
  if (kitt = 0) {
    strip.begin();
    strip.show();
    }
  }
}
答案

只要您有类似的代码

if (rainbow = 1)

该代码实际上将变量rainbow的值sets设置为1。因为如果rainbow为1,您想检查,所以需要这样的代码:

if (rainbow == 1)

注意双倍=

以上是关于在另一个函数中根据值更改函数的主要内容,如果未能解决你的问题,请参考以下文章

检查列中是不是存在值并根据不同条件在另一个 Pandas 中更改:Pandas

在另一个计算属性上调用 getter 不是测试中的函数

根据在 Spinner 中选择的数字,相同的片段应该出现在另一个之下。如何?

为啥在一个函数中声明的联合类型在另一个函数中使用无效?

从片段函数更改 TextView 的值

我想在另一个函数中使用一个函数的返回值,而无需再次运行该函数。 (Python)