Почему мы не использовали резистор между портом 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. Кнопочный переключатель

В этом эксперименте мы делаем из тактовой кнопки триггер, борясь с «дребезгом».

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

Почему мы не использовали резистор между портом Arduino и затвором транзистора? - student2.ru

Почему мы не использовали резистор между портом Arduino и затвором транзистора? - student2.ru

Код

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 миллисекунд, этого времени достаточно для того чтобы дребезг прекратился, но не достаточно чтобы повторно нажать на кнопку.

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