Чем отличаются инструкции continue и break?
Сontinue пропускает оставшиеся операторы в текущем шаге цикла. Вместо них выполняется проверка условного выражения цикла, а break используется для принудительного выхода из циклов do, for или while, не дожидаясь завершения цикла по условию.
Задания для самостоятельного решения
1.Сделайте напряженный вариант игры: пусть интервал между сигналами будет в диапазоне от 10 до 15 секунд.
Листинг:
1. #defineBUZZER_PIN 12 // порт с пьезодинамиком
2. #define PLAYER_COUNT 2 // количество игроков-ковбоев
3. // вместо перечислени¤ всех портов по-одному, мы объ¤вл¤ем пару
4. // списков: один с номерами портов с кнопками, другой Ч со
5. // светодиодами. —писки также называют массивами (англ. array)
6. int buttonPins[PLAYER_COUNT] = {2, 3};
7. int ledPins[PLAYER_COUNT] = {9, 11};
8. void setup()
9. {
10. pinMode(BUZZER_PIN, OUTPUT);
11. for (int player = 0; player < PLAYER_COUNT; ++player) {
12. // при помощи квадратных скобок получают значение в массиве
13. // под указанным в них номером.Ќумераци¤ начинаетс¤ с нул¤
14. pinMode(ledPins[player], OUTPUT);
15. pinMode(buttonPins[player], INPUT_PULLUP);
16. }
17. }
18. void loop()
19. {
20. // даем сигнал Ђпли!ї, выждав случайное врем¤ от 2 до 7 сек
21. delay(random(10000, 15000));
22. tone(BUZZER_PIN, 3000, 250); // 3 килогерца, 250 миллисекунд
23. for (int player = 0; ; player = (player + 1) % PLAYER_COUNT) {
24. // если игрок номер Ђplayerї нажал кнопку...
25. if (!digitalRead(buttonPins[player])) {
26. // ...включаем его светодиод и сигнал победы на 1 сек
27. digitalWrite(ledPins[player], HIGH);
28. tone(BUZZER_PIN, 4000, 1000);
29. delay(1000);
30. digitalWrite(ledPins[player], LOW);
31. }
32. }
33.}
3.Добавьте в игру еще двух ковбоев!
Листинг:
1. #defineBUZZER_PIN 13 // порт с пьезодинамиком
2. #define PLAYER_COUNT 4 // количество игроков-ковбоев
3. // вместо перечислени¤ всех портов по-одному, мы объ¤вл¤ем пару
4. // списков: один с номерами портов с кнопками, другой Ч со
5. // светодиодами. —писки также называют массивами (англ. array)
6. int buttonPins[PLAYER_COUNT] = {2, 3, 4, 5};
7. int ledPins[PLAYER_COUNT] = {9, 10, 11, 12};
8. void setup()
9. {
10. pinMode(BUZZER_PIN, OUTPUT);
11. for (int player = 0; player < PLAYER_COUNT; ++player) {
12. // при помощи квадратных скобок получают значение в массиве
13. // под указанным в них номером. Ќумераци¤ начинаетс¤ с нул¤
14. pinMode(ledPins[player], OUTPUT);
15. pinMode(buttonPins[player], INPUT_PULLUP);
16. }
17. }
18. void loop()
19. {
20. // даем сигнал Ђпли!ї, выждав случайное врем¤ от 2 до 7 сек
21. delay(random(10000, 15000));
22. tone(BUZZER_PIN, 3000, 250); // 3 килогерца, 250 миллисекунд
23. for (int player = 0; ; player = (player + 1) % PLAYER_COUNT)
24. {
25. // если игрок номер Ђplayerї нажал кнопку...
26. if (!digitalRead(buttonPins[player])) {
27. // ...включаем его светодиод и сигнал победы на 1 сек
28. digitalWrite(ledPins[player], HIGH);
29. tone(BUZZER_PIN, 4000, 1000);
30. delay(1000);
31. digitalWrite(ledPins[player], LOW);
32. }
33. }
34. }
Эксперимент 13. Секундомер
В этом эксперименте мы создаем секундомер, который считает до 10.
Принципиальная схема
Код
1. #define FIRST_SEGMENT_PIN 2
2. #define SEGMENT_COUNT 7
3. byte numberSegments[10] = {
4. 0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
5. 0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
6. };
7. void setup()
8. {
9. for (int i = 0; i < SEGMENT_COUNT; ++i)
10. pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
11. }
12. void loop()
13. {
14. int number = (millis() / 1000) % 10;
15. int mask = numberSegments[number];
16. for (int i = 0; i < SEGMENT_COUNT; ++i) {
17. boolean enableSegment = bitRead(mask, i);
18. digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
19. }
20. }
Вопросы для проверки себя