Почему мы не использовали резистор между портом Arduino и затвором транзистора?
Мы использовали режим работы портов: INPUT_PULLUP. На цифровых портах Arduino есть встроенные подтягивающие резисторы, которые можно включить указанным образом одновременно с настройкой порта на вход. Именно поэтому мы не использовали резисторы при сборке схемы.
Как работает инструкция continue, использованная в цикле for?
Инструкция continue, которая выполнится в этом случае, отменит продолжение данной итерации цикла и выполнение программы продолжится со следующей. А мотор будет крутиться со скоростью, заданной при последнем нажатии на какую-то из кнопок.
Задания для самостоятельного решения
Внесите единственное изменение в программу, после которого максимальной скоростью вращения мотора составит половину от возможной.
Листинг:
1. #define MOTOR_PIN 9
2. #define FIRST_BUTTON_PIN 5
3. #define BUTTON_COUNT 3
4. #define SPEED_STEP (127 / (BUTTON_COUNT - 1))
5. void setup() {
6. pinMode(MOTOR_PIN, OUTPUT);
7. for (int i = 0; i < BUTTON_COUNT; ++i){
8. pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
9. }
10. }
11. void loop()
12. {
13. for (int i = 0; i < BUTTON_COUNT; ++i) {
14. if (digitalRead(i + FIRST_BUTTON_PIN))
15. continue;
16. int speed = i * SPEED_STEP;
17. analogWrite(MOTOR_PIN, speed);
18. }}
Перепишите программу без использования инструкции continue.
Листинг:
1. #define MOTOR_PIN 9
2. #define FIRST_BUTTON_PIN 5
3. #define BUTTON_COUNT 3
4. #define SPEED_STEP (255 / (BUTTON_COUNT - 1))
5. void setup() {
6. pinMode(MOTOR_PIN, OUTPUT);
7. for (int i = 0; i < BUTTON_COUNT; ++i) {
8. pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
9. }
10. }
11. void loop()
12. {
13. for (int i = 0; i < BUTTON_COUNT; ++i) {
14. if (!digitalRead(i + FIRST_BUTTON_PIN)) {
a. int speed = i * SPEED_STEP;
b. analogWrite(MOTOR_PIN, speed);
15. }
16. }
17. }
Добавьте в схему еще одну кнопку, чтобы у миксера стало три режима. Понадобилось ли изменять что-либо в программе?
Листинг:
1. #define MOTOR_PIN 9
2. #define FIRST_BUTTON_PIN 5
3. #define BUTTON_COUNT 4
4. #define SPEED_STEP (255 / (BUTTON_COUNT - 1))
5. void setup() {
6. pinMode(MOTOR_PIN, OUTPUT);
7. for (int i = 0; i < BUTTON_COUNT; ++i){
8. pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
9. }
10. }
11. void loop()
12. {
13. for (int i = 0; i < BUTTON_COUNT; ++i) {
14. if (digitalRead(i + FIRST_BUTTON_PIN))
15. continue;
16. int speed = i * SPEED_STEP;
17. analogWrite(MOTOR_PIN, speed);
18. }
19. }
Эксперимент 10. Кнопочный переключатель
В этом эксперименте мы делаем из тактовой кнопки триггер, борясь с «дребезгом».
Принципиальная схема
Код
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.В каком случае оператор && возвращает значение «истина»?
Логический оператор && («и») возвращает значение «истина» только в случае истинности обоих его операндов.
Что такое «дребезг»?
Это многократные неконтролируемые замыкания и размыкания контактов за счет упругости материалов и деталей контактной системы — некоторое время контакты «подпрыгивают» при соударениях, размыкая и замыкая электрическую цепь.
Как мы с ним боремся в программе?
Дважды проверяем состояние кнопки, второй раз по истечении 10 миллисекунд, этого времени достаточно для того чтобы дребезг прекратился, но не достаточно чтобы повторно нажать на кнопку.