Как можно избежать явного указания значения уровня напряжения при вызове 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. Светильник с кнопочным управлением
В этом эксперименте мы добавляем порцию яркости светодиоду одной кнопкой и убавляем другой.
Принципиальная схема
Код
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 указать, какое значение возвращать. Это значение должно быть того типа, который мы объявили.