2014-09-25 7 views
-3

Привет, пользователи 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 сек ..

Итак, как я могу включить желтый и красный светодиод одновременно? (Почему не trafiksignal (redLed & & yellowLed, 1000); работать?)

+2

Имея <10 rep, вы не можете помещать код в вопрос здесь или объяснять, КАК ваш код не работает. –

+0

Извините, я новичок в этом .. Я думаю, что я отредактировал OP, чтобы содержать то, что отсутствует :-) – Akudo

ответ

0

Насколько мне известно & & в С только для логического сравнения.

trafiksignal(redLed && yellowLed, 1000); 

Что эта линия в основном делает это проверка, если redLed и yellowLed являются истинными или ложными, и если они оба истинны он будет посылать 1 или если либо ложны он будет посылать 0. Так как оба они не равны 0, это должно относиться к ним как к истинным, так что вы на самом деле скорее всего говорите, что вывод 1 идет вверх на 1 секунду, а не на контакты 3 и 4.

Несколько простых работ вокруг было бы создать отдельный функция для выключения красного и желтого света или постановки быстрого предложения if внутри функции trafiksignal. Bellow - это быстрый грязный оператор 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); 
     } 
    } 
Смежные вопросы