Как можно избежать явного указания значения уровня напряжения при вызове digitalWrite?

Мы передаем в digitalWrite не конкретное значение HIGH или LOW, а просто булеву переменную ledEnabled. В зависимости от того, какое значение было для нее вычислено, светодиод будет зажигаться или гаситься.

Задания для самостоятельного решения

Измените код так, чтобы светодиод переключался только после отпускания кнопки.

Листинг:

1. #define BUTTON_PIN 3

2. #define LED_PIN 13

3. boolean buttonWasUp = true;

4. boolean ledEnabled = false;

5. void setup()

6. {

7. pinMode(LED_PIN, OUTPUT);

8. pinMode(BUTTON_PIN, INPUT_PULLUP);

9. }

10. void loop()

11. {

12. boolean buttonIsUp = digitalRead(BUTTON_PIN);

13. if (!buttonWasUp && buttonIsUp) {

14. delay(10);

15. buttonIsUp = digitalRead(BUTTON_PIN);

16. if (buttonIsUp)

17. {

18. ledEnabled = !ledEnabled;

19. digitalWrite(LED_PIN, ledEnabled);

20. }

21. }

22. buttonWasUp = buttonIsUp;

23. }

Добавьте в схему еще одну кнопку и доработайте код, чтобы светодиод зажигался только при нажатии обеих кнопок.

Листинг:

1. #define BUTTON_PIN 3

2. #define BUTTON_PIN2 4

3. #define LED_PIN 13

4. boolean buttonWasUp = true;

5. boolean buttonWasUp2 = true;

6. boolean ledEnabled = false;

7. void setup()

8. {

9. pinMode(LED_PIN, OUTPUT);

10. pinMode(BUTTON_PIN, INPUT_PULLUP);

11. pinMode(BUTTON_PIN2, INPUT_PULLUP);

12. }

13. void loop()

14. {

15. boolean buttonIsUp = digitalRead(BUTTON_PIN);

16. boolean buttonIsUp2 = digitalRead(BUTTON_PIN2);

17. if (buttonWasUp && !buttonIsUp) {

18. if (buttonWasUp2 && !buttonIsUp2)

19. delay(10);

20. buttonIsUp = digitalRead(BUTTON_PIN);

21. buttonIsUp2 = digitalRead(BUTTON_PIN2);

22. if (!buttonIsUp && !buttonIsUp2)

23. {

24. ledEnabled = !ledEnabled;

25. digitalWrite(LED_PIN, ledEnabled);

26. }

27. }

28. buttonWasUp = buttonIsUp;

29. buttonWasUp2 = buttonIsUp2;

30. }

Эксперимент 11. Светильник с кнопочным управлением

В этом эксперименте мы добавляем порцию яркости светодиоду одной кнопкой и убавляем другой.

Принципиальная схема

Как можно избежать явного указания значения уровня напряжения при вызове digitalWrite? - student2.ru

Как можно избежать явного указания значения уровня напряжения при вызове digitalWrite? - student2.ru

Код

1. #define PLUS_BUTTON_PIN 2

2. #define MINUS_BUTTON_PIN 3

3. #define LED_PIN 9

4. int brightness = 100;

5. boolean plusUp = true;

6. boolean minusUp = true;

7. void setup()

8. {

9. pinMode(LED_PIN, OUTPUT);

10. pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP);

11. pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP);

12. }

13. void loop()

14. {

15. analogWrite(LED_PIN, brightness);

16. plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +35);

17. minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -35);

18. }

19. boolean handleClick(int buttonPin, boolean wasUp, int delta)

20. {

21. boolean isUp = digitalRead(buttonPin);

22. if (wasUp && !isUp) {

23. delay(10);

24. isUp = digitalRead(buttonPin);

25. if (!isUp)

26. brightness = constrain(brightness + delta, 0, 255);

27. }

28. return isUp;

29. }

Вопросы для проверки себя

1.Что необходимо для определения собственной функции?

Чтобы определить собственную функцию, нам нужно:

· Объявить, какой тип данных она будет возвращать. В нашем случае это boolean. Если функция только выполняет какие-то действия и не возвращает никакого значения, используйте ключевое слово void

· Назначить функции имя — идентификатор. Здесь действуют те же правила, что при именовании переменных и констант. Называть функции принято в том же стиле какПеременные.

· В круглых скобках перечислить передаваемые в функцию параметры, указав тип каждого. Это является объявлением переменных, видимых внутри вновь создаваемой функции, и только внутри нее. Например, если в данном эксперименте мы попробуем обратиться к wasUp или isUp из loop() получим от компилятора сообщение об ошибке. Точно так же, переменные, объявленные в loop, другим функциям не видны, но их значения можно передать в качестве параметров.

· Между парой фигурных скобой написать код, выполняемый функцией

· Если функция должна вернуть какое-то значение, с помощью ключевого слова return указать, какое значение возвращать. Это значение должно быть того типа, который мы объявили.

Наши рекомендации