在另一个函数中根据值更改函数
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