函数参数中的多个引脚

时间:2014-09-25 21:36:32

标签: c arduino

Hello Stackoverflow用户!

行trafiksignal(redLed&& yellowLed,1000);我无法开始工作,我正在尝试使用函数创建一个交通信号,我的想法是将此图片用作指南:http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Traffic_lights_4_states.png/220px-Traffic_lights_4_states.png (由于代表< 10而无法发布图片)

我的代码:http://pastebin.com/MTGsYeXs


/* 
* @Author: Kristian Nymann
* @Date:   2014-09-25 22:46:39
* @Last Modified by:   Kristian Nymann
* @Last Modified time: 2014-09-25 23:23:19
* @Description: Lav et program der får de tre lysdioder til at skifte som et trafiklys. Du kan brugeprogrammet "Blink" som eksempel.
*/

const byte greenLed = 2;
const byte yellowLed = 3;
const byte redLed = 4;

void setup() {
pinMode(greenLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(redLed, OUTPUT);
}

void loop() {
    trafiksignal(redLed, 3000);
    trafiksignal(redLed && yellowLed, 1000);
    trafiksignal(greenLed, 3000);
    trafiksignal(yellowLed, 1000);
}

void trafiksignal(byte pin, unsigned int duration)
{
    digitalWrite(pin, HIGH);
    delay(duration);
    digitalWrite(pin, LOW);
}

现在正在发生的事情是: 红色指示灯亮起持续3秒..然后绿色指示灯亮起3秒钟,然后黄色指示灯亮起1秒钟。

那么如何让黄色和红色Led同时打开? (为什么没有trafiksignal(redLed&& yellowLed,1000);工作?)

1 个答案:

答案 0 :(得分:0)

据我所知&&在C中仅用于逻辑比较。

trafiksignal(redLed && yellowLed, 1000);

这条线基本上做的是检查redLed和yellowLed是真还是假,如果它们都为真,它将发送1或如果其中任何一个为假,它将发送0.因为它们都是不是0它应该把它们视为真实,所以你实际上最有可能告诉引脚1高1秒而不是引脚3和4。

一些简单的解决方法是创建一个单独的函数来关闭红色和黄色灯,或者在trafiksignal函数中放置一个快速if子句。 Bellow是一个快速的if if语句,可以添加到trafiksignal,它可以帮助你使用当前的代码。

if (pin == 1) {
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  delay(duration)
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
 }
else {
  digitalWrite(pin, HIGH);
  delay(duration);
  digitalWrite(pin, LOW);
}

从我的ipad输入代码,因此我会在复制和粘贴之前对其进行校对。

从我的电脑编辑:

一个更好的解决方案是将引脚作为阵列发送到功能,我在普通C中没有超级经验,所以我不确定我所做的下面是100%准确,但应该相当接近。

const byte greenLed = 2;
const byte yellowLed = 3;
const byte redLed = 4;
const byte redYellow[2] = {redLed, yellowLed} // create an array of 2 pins


void setup() {
pinMode(greenLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(redLed, OUTPUT);
}

    void loop() {
    // the middle number is the number of LEDs the function will need to control.
        trafiksignal(redLed, 1, 3000);
        trafiksignal(redYellow, 2, 1000);
        trafiksignal(greenLed, 1, 3000);
        trafiksignal(yellowLed, 1, 1000);
    }

    void trafiksignal(byte pin[], unsigned int numberOfLeds, unsigned int duration)
    {
      for (int i =0; i < numberOfLeds; ++i {
        digitalWrite(pin[i], HIGH);
      }
        delay(duration);
       for (int i = 0; i < numberOfLeds; ++i) {
        digitalWrite(pin[i], LOW);
       }
    }