Перепишите программу без использования инструкции continue

  1. Помогите, пожалуйста! С 2-м заданием: перепишите программу без использования инструкции continue.
    Дана программа:
    #define MOTOR_PIN 9
    #define FIRST_BUTTON_PIN 5
    #define BUTTON_COUNT 3
    #define SPEED_STEP (255 / (BUTTON_COUNT — 1))

    void setup()
    {
    pinMode(MOTOR_PIN, OUTPUT);

    for (int i = 0; i < BUTTON_COUNT; ++i)
    pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
    }

    void loop()
    {
    for (int i = 0; i < BUTTON_COUNT; ++i) {

    if (digitalRead(i + FIRST_BUTTON_PIN))
    continue;

    int speed = i * SPEED_STEP;

    analogWrite(MOTOR_PIN, speed);
    }
    }

    Первым делом, мне как новичку, пришла мысль расписать действие на поступление сигнала для каждой кнопки, например:

    Для второй кнопки:
    if (digitalRead(6))
    analogWrite(MOTOR_PIN, 127);

    Для третей кнопки:
    if (digitalRead(7))
    analogWrite(MOTOR_PIN, 255); и т.д

    Но я считаю, что это громоздко! И наверное не праильно, не этого хотят от меня авторы. Читал вот эту тему:
    http://forum.amperka.ru/threads/Эксперимент-9.4437/#post-35200

    Поэтому же и вопросу, так и не понял, что там хотели сказать. Что значит глобальные переменные? И с использованием их нужно решать это задание, или есть решение которое не выходит за рамки программиста-новичка дошедшего до 9 эксперимента?Программист я очень начинающий, поэтому прошу не судить строго!

  2. Изучайте C++. http://forum.amperka.ru/threads/Книги-для-начинающих.2344/

    Глобальные переменные объявляются вне функций и доступны в любом месте программы, каждый блок от «{» до «}» создает новую область видимости, внутри которой переменные недоступны коду снаружи, т.е. они существуют только между «{» и «}». Блоки могут быть вложенными, соответственно и области видимости переменных.

    Вам намекают на использование if () { … } else {… } вместо continue;

  3. Ух, еле-еле разобрался! Оказывается меня сбивало с толку функция INPUT_PULLUP! Посему на выходе пинов кнопок весит постоянный HIGH, я то думал наоборот мы HIGH подаём с кнопки(хотя и по схеме подключения можно было догадаться!!!). Поэтому всё очень просто организовываем счётчик, организовываем проверку » равен ли сигнал «LOW» на каком-нибудь пине кнопок». Если да, считаем скорость, согласно номеру кнопки, включаем моторчик с этой скоростью. Даже конструкция «else{}» — тут не нужна, только » if{}».
    Код выглядит так(кому-нибудь на будушее!):

    void loop()
    {
    for (int i = 0; i < BUTTON_COUNT; ++i)
    {
    if (digitalRead(i + FIRST_BUTTON_PIN) == LOW)
    {
    int speed = i * SPEED_STEP;
    analogWrite(MOTOR_PIN, speed);

    И не каких глобальных переменных здесь не надо. Зациклился на них и упустил главное!!!

    Спасибо Unixon, за совет — будем изучать!!!

В этом эксперименте мы создаем модель миксера с двумя скоростями работы. Прочтите перед выполнением:

—   Полевой транзистор;

—   Мотор.

СПИСОК ДЕТАЛЕЙ ДЛЯ ЭКСПЕРИМЕНТА

—   1 плата Arduino Uno, беспаечная макетная плата;

—   3 тактовых кнопки;

—   1 коллекторный двигатель;

—   1 выпрямительный диод;

—   1 полевой MOSFET-транзистор;

—   15 проводов «папа-папа».

ДЕТАЛИ ДЛЯ ДОПОЛНИТЕЛЬНОГО ЗАДАНИЯ

—   еще 1 кнопка, еще 2 провода.

ПРИНЦИПИАЛЬНАЯ СХЕМА

СХЕМА НА МАКЕТНОЙ ПЛАТЕ

ОБРАТИТЕ ВНИМАНИЕ

  • Защитный диод нам нужен для того, чтобы ток обратного направления, который начнет создавать двигатель, вращаясь по инерции, не вывел из строя транзистор.
  • Не перепутайте полярность диода, иначе, открыв транзистор, вы устроите короткое замыкание!
  • Причину отсутствия подтягивающих/стягивающих резисторов в схеме вы поймете, ознакомившись с программой.
  • Мы подключили питание схемы к выходу Vin платы микроконтроллера, потому что, в отличие выхода 5V, отсюда можно получить напряжение, подключенное к плате, без изменений и без ограничений по величине тока.

СКЕТЧ

скачать скетч для Arduino IDE
#define MOTOR_PIN 9
#define FIRST_BUTTON_PIN 5
#define BUTTON_COUNT 3
// имена можно давать не только числам, но и целым выражениям.
// Мы определяем с каким шагом (англ. step) нужно менять
// скорость (англ. speed) мотора при нажатии очередной кнопки
#define SPEED_STEP (255 / (BUTTON_COUNT - 1))
 
void setup()
{
 pinMode(MOTOR_PIN, OUTPUT);
 // на самом деле, в каждом пине уже есть подтягивающий
 // резистор. Для его включения необходимо явно настроить пин
 // как вход с подтяжкой (англ. input with pull up)
 for (int i = 0; i < BUTTON_COUNT; ++i)
 pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
}
 
void loop()
{
 for (int i = 0; i < BUTTON_COUNT; ++i) {
 // если кнопка отпущена, нам она не интересна. Пропускаем
 // оставшуюся часть цикла for, продолжая (англ. continue)
 // его дальше, для следующего значения i
 if (digitalRead(i + FIRST_BUTTON_PIN))
 continue;
 
 // кнопка нажата — выставляем соответствующую ей скорость
 // мотора. Нулевая кнопка остановит вращение, первая
 // заставит крутиться в полсилы, вторая — на полную
 int speed = i * SPEED_STEP;
 
 // подача ШИМ-сигнала на мотор заставит его крутиться с
 // указанной скоростью: 0 — стоп машина, 127 — полсилы,
 // 255 — полный вперёд!
 analogWrite(MOTOR_PIN, speed);
 }
}

ПОЯСНЕНИЯ К КОДУ

  • Мы использовали новый режим работы портов: INPUT_PULLUP. На цифровых портах Arduino есть встроенные подтягивающие резисторы, которые можно включить указанным образом одновременно с настройкой порта на вход. Именно поэтому мы не использовали резисторы при сборке схемы.
  • На каждой итерации цикла мы задаем мотору скорость вращения, пропорциональную текущему значению счетчика. Но выполнение инструкций не дойдет до назначения новой скорости, если при проверке нажатия кнопки она окажется отпущенной. Инструкция continue, которая выполнится в этом случае, отменит продолжение данной итерации цикла и выполнение программы продолжится со следующей. А мотор будет крутиться со скоростью, заданной при последнем нажатии на какую-то из кнопок.

ВОПРОСЫ ДЛЯ ПРОВЕРКИ СЕБЯ

  1. Зачем в схеме использован диод?
  2. Почему мы использовали полевой MOSFET-транзистор, а не биполярный?
  3. Почему мы не использовали резистор между портом Arduino и затвором транзистора?
  4. Как работает инструкция continue, использованная в цикле for?

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ

  1. Внесите единственное изменение в программу, после которого максимальной скоростью вращения мотора составит половину от возможной.
  2. Перепишите программу без использования инструкции continue.
  3. Добавьте в схему еще одну кнопку, чтобы у миксера стало три режима. Понадобилось ли изменять что-либо в программе?

С оригиналом статьи вы можете ознакомиться на сайте Amperka.ru


ЭКСПЕРИМЕНТ 8 | ОГЛАВЛЕНИЕ | ЭКСПЕРИМЕНТ 10

Обратите внимание

Ножки тактовой кнопки, расположенные с одной стороны, разомкнуты, когда кнопка не нажата. Ножки, расположенные друг напротив друга на противоположных сторонах макетки находятся на одной «рельсе». Воспользовавшись этим, мы можем расположить резистор с одной стороны макетки, а провод, подключаемый к порту Arduino, с другой стороны.

В данном эксперименте мы подключаем кнопки по схеме с подтягивающим резистором.

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

Скетч

#define BUZZER_PIN

13

// пин с

пищалкой (англ. «buzzer»)

#define

FIRST_KEY_PIN 7

// первый пин с клавишей (англ. «key»)

#define

KEY_COUNT

3

// общее

количество клавиш

void setup()

{

pinMode(BUZZER_PIN, OUTPUT);

}

void loop()

{

// в цикле бежим по всем номерам кнопок от 0-го по 2-й for (int i = 0; i < KEY_COUNT; ++i) {

// на основе номера кнопки вычисляем номер её пина int keyPin = i + FIRST_KEY_PIN;

// считываем значение с кнопки. Возможны всего 2 варианта:

// * высокий сигнал, 5 вольт, истина — кнопка отпущена

// * низкий сигнал, земля, ложь — кнопка зажата boolean keyUp = digitalRead(keyPin);

// проверяем условие «если не кнопка отпущена». Знак «!»

// перед булевой переменной означает отрицание, т.е. «не». if (!keyUp) {

// рассчитываем высоту ноты в герцах в зависимости от

// клавиши, которую рассматриваем на данном этапе цикла.

// Мы получим значение 3500, 4000 или 4500 int frequency = 3500 + i * 500;

// Заставляем пищалку пищать с нужной частотой в течение

// 20 миллисекунд. Если клавиша останется зажатой, пищалка

// вновь зазвучит при следующем проходе loop, а мы услышим

// непрерывный звук tone(BUZZER_PIN, frequency, 20);

}

}

}

Пояснения к коду

Благодаря тому, что в начале программы мы определили FIRST_KEY_PIN и KEY_COUNT, мы можем подключать произвольное количество кнопок к любым идущим друг за другом цифровым пинам, и для корректировки программы нам не придется менять параметры цикла for. Изменить понадобится лишь эти константы:

o цикл в любом случае пробегает от 0 до KEY_COUNT;

oперед считыванием порта мы задаем смещение на номер первого используемого порта —

FIRST_KEY_PIN.

Функция digitalRead(pin) возвращает состояние порта, номер которого передан ей параметром pin. Это может быть состояние HIGH или LOW. Или, выражаясь иначе: высокое напряжение или низкое, 1 или 0, true или false

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

Мы используем логический оператор отрицания «не» !. Если keyUp имеет значение 0,

выражение!keyUp будет иметь значение 1 и наоборот.

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

Действия, описанные в условном выражении if, выполняются, когда его условие имеет значение «истина» (единица). Поэтому для выполнения действия по нажатию, мы инвертируем сигнал с кнопки.

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

1.Почему мы не настраивали порты, к которым подключены кнопки, как INPUT, но устройство работает?

2.Каким образом мы избежали написания отдельного когда для чтения каждой кнопки?

3.Почему разные «ноты», издаваемые пищалкой, звучат с разной громкостью?

4.Для чего мы использовали оператор логического отрицания !?

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

1.Сделайте так, чтобы наше пианино звучало в диапазоне от 2 кГц до 5 кГц.

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

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

Эксперимент 9. Миксер

Список деталей для эксперимента

1 плата Arduino Uno

беспаечная макетная плата

3 тактовых кнопки

1 коллекторный двигатель

1 выпрямительный диод

1 полевой MOSFET-транзистор

15 проводов «папа-папа»

1 клеммник, если вы используете мотор с проводами, которые плохо втыкаются в макетку Для дополнительного задания

еще 1 кнопка

еще 2 провода

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

Схема на макетке

Обратите внимание

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

Не перепутайте полярность диода, иначе, открыв транзистор, вы устроите короткое замыкание!

Причину отсутствия подтягивающих/стягивающих резисторов в схеме вы поймете, ознакомившись с программой.

Мы подключили питание схемы к выходу Vin платы микроконтроллера, потому что, в отличие выхода 5V, отсюда можно получить напряжение, подключенное к плате, без изменений и без ограничений по величине тока.

Скетч

#define MOTOR_PIN

9

#define

FIRST_BUTTON_PIN

5

#define

BUTTON_COUNT

3

//

имена можно давать не

только числам, но и целым выражениям.

//

Мы определяем с каким

шагом (англ. step) нужно менять

// скорость (англ. speed) мотора при нажатии очередной кнопки

#define SPEED_STEP (255 / (BUTTON_COUNT — 1))

void setup()

{

pinMode(MOTOR_PIN, OUTPUT);

// на самом деле, в каждом пине уже есть подтягивающий

// резистор. Для его включения необходимо явно настроить пин

// как вход с подтяжкой (англ. input with pull up)

for (int i = 0; i < BUTTON_COUNT; ++i) pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);

}

void loop()

{

for (int i = 0; i < BUTTON_COUNT; ++i) {

// если кнопка отпущена, нам она не интересна. Пропускаем

// оставшуюся часть цикла for, продолжая (англ. continue) // его дальше, для следующего значения i

if (digitalRead(i + FIRST_BUTTON_PIN)) continue;

// кнопка нажата — выставляем соответствующую ей скорость

// мотора. Нулевая кнопка остановит вращение, первая

// заставит крутиться в полсилы, вторая — на полную int speed = i * SPEED_STEP;

// подача ШИМ-сигнала на мотор заставит его крутиться с

// указанной скоростью: 0 — стоп машина, 127 — полсилы,

// 255 — полный вперёд! analogWrite(MOTOR_PIN, speed);

}

}

Пояснения к коду

Мы использовали новый режим работы портов: INPUT_PULLUP. На цифровых портах Arduino есть встроенные подтягивающие резисторы, которые можно включить указанным образом одновременно с настройкой порта на вход. Именно поэтому мы не использовали резисторы при сборке схемы.

На каждой итерации цикла мы задаем мотору скорость вращения, пропорциональную текущему значению счетчика. Но выполнение инструкций не дойдет до назначения новой скорости, если при проверке нажатия кнопки она окажется отпущенной.

Инструкция continue, которая выполнится в этом случае, отменит продолжение данной итерации цикла и выполнение программы продолжится со следующей. А мотор будет крутиться со скоростью, заданной при последнем нажатии на какую-то из кнопок.

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

1.Зачем в схеме использован диод?

2.Почему мы использовали полевой MOSFET-транзистор, а не биполярный?

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

4.Как работает инструкция continue, использованная в цикле for?

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

1.Внесите единственное изменение в программу, после которого максимальной скоростью вращения мотора составит половину от возможной.

2.Перепишите программу без использования инструкции continue.

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

Эксперимент 10. Кнопочный переключатель

Список деталей для эксперимента

1 плата Arduino Uno

1 беспаечная макетная плата

1 тактовая кнопка

1 резистор номиналом 220 Ом

1 светодиод

5 проводов «папа-папа» Для дополнительного задания

еще 1 кнопка

еще 2 провода

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

Схема на макетке

Обратите внимание

Мы могли бы один из контактов кнопки соединить проводом напрямую с одним из входов GND, но мы сначала «раздали» «землю» на длинную рельсу макетки. Если мы работаем с макетной платой, так поступать удобнее, т.к. в схеме могут появляться новые участки, которые тоже нужно будет соединить с «землей»

Также полезно руководствоваться соображениями аккуратности изделия, поэтому катод светодиода мы соединяем с другим входом GND отдельным проводом, который не мешает нам работать в середине макетки.

Скетч

#define

BUTTON_PIN

3

#define

LED_PIN

13

boolean buttonWasUp = true; // была ли кнопка отпущена? boolean ledEnabled = false; // включен ли свет?

void setup()

{

pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop()

{

// определить момент «клика» несколько сложнее, чем факт того,

// что кнопка сейчас просто нажата. Для определения клика мы

// сначала понимаем, отпущена ли кнопка прямо сейчас…

boolean buttonIsUp = digitalRead(BUTTON_PIN);

// …если «кнопка была отпущена и (&&) не отпущена сейчас»…

if (buttonWasUp && !buttonIsUp) {

// …может это «клик», а может и ложный сигнал (дребезг),

// возникающий в момент замыкания/размыкания пластин кнопки,

// поэтому даём кнопке полностью «успокоиться»…

delay(10);

// …и считываем сигнал снова buttonIsUp = digitalRead(BUTTON_PIN);

if (!buttonIsUp) { // если она всё ещё нажата…

// …это клик! Переворачиваем сигнал светодиода ledEnabled = !ledEnabled;

digitalWrite(LED_PIN, ledEnabled);

}

}

// запоминаем последнее состояние кнопки для новой итерации

buttonWasUp = buttonIsUp;

}

Пояснения к коду

Поскольку мы сконфигурировали вход кнопки как INPUT_PULLUP, при нажатии на кнопку на данном входе мы будем получать 0. Поэтому мы получим значение true («истина») в булевой переменнойbuttonIsUp («кнопка отпущена»), когда кнопка отпущена.

Логический оператор && («и») возвращает значение «истина» только в случае истинности обоих его операндов. Взглянем на так называемую таблицу истинности для

выражения buttonWasUp && !buttonIsUp («кнопка была отпущена и кнопка не отпущена»):

buttonWasUpbuttonIsUp!buttonIsUpbuttonWasUp && !buttonIsUp

0

0

1

0

0

1

0

0

1

0

1

1

1

1

0

0

Здесь рассмотрены все возможные сочетания предыдущего и текущего состояний кнопки и мы видим, что наш условный оператор if сработает только в случае, когда кнопка нажата только что: предыдущее состояние 1 («была отпущена»), а текущее 0 («не отпущена»).

Через 10 миллисекунд мы проверяем еще раз, нажата ли кнопка: этот интервал больше, чем длительность «дребезга», но меньше, чем время, за которое человек успел бы дважды нажать на кнопку. Если кнопка всё еще нажата, значит, это был не дребезг.

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

Последняя инструкция в buttonWasUp = buttonIsUp сохраняет текущее состояние кнопки в переменную предыдущего состояния, ведь на следующей итерации loop текущее состояние уже станет историей.

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

1.В каком случае оператор && возвращает значение «истина»?

2.Что такое «дребезг»?

3.Как мы с ним боремся в программе?

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

I have written a code as below:

a=5:-1:-2;

i=1;

while(1)

if(a(i)<0)

break;

end

b=a(i)*2;

i=i+1;

if(b>=4)

continue;

end

disp(‘b<4’)

end

disp(‘end of computation’)

The script includes continue and break statements. Note that break will exit the innermost enclosing of while or for loop; while continue will jump to the end of the innermost enclosing while or for loop.

I wish to rewrite my code by removing break and continue so that it looks nicer. Any suggestions? Thank you.


Подборка по базе: МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ДЛЯ ВЫПОЛНЕНИЯ ПРАКТИЧЕСКИХ РАБОТ ПО Д, Конспект проведения видеолектория в среде студенческой молодёжи., Курсовая программирование .docx, 6-синф программирование мисаллар.docx, Практическое задание Программирование.docx, Лекции по безопасной среде (хирургия) (2).doc, Методические указания по курсовой работе — дисц. Программирован, Проблемные ситуации в объектах и городской среде с точки зрения , Технологическая карта урока. Информатика . 8 В класс. ФГОС. Форм, ФОС МДК 03.01. Технология разработки программного обеспечения дл


2. Какой результат работы устройства будет получен, если свет от светодиода будет падать на фоторезистор?

Ответ: светодиод начнет мигать.

3. Если все же фоторезистор установлен между аналоговым входом иземлей (как сказано в первом вопросе), то каким образом нужно изменитьпрограмму, чтобы устройство работало верно?

Ответ: изменитьстрочку: intlightness = 1023 — analogRead(LDR_PIN);

4. Допустим, у нас есть код if (условие) {действие;}В каких случаях будет выполнено действие?

Ответ: действие будет выполнено, если условие является истинным.

5. При каких значениях y выражение x+y>0 будет истинным, еслиx>0?

Ответ: у> -x

6. Обязательно ли указывать, какие инструкции выполнять, если условие в операторе if ложно?

Ответ: если условие всегда ложно, то достаточно написать код из ветки else.

7. Чем отличается оператор == от оператора =?

Ответ: первый логическое равно, второй присвоение.

8. Если используется конструкцияif (условие) действие1;else действие2;может ли быть ситуация, когда ни одно из действий не выполнится?Почему?

Ответ: нет так как логическое условие может быть истиной или ложью.

Вывод: Сегодня я научилсяуправлять включением светодиода, подключенного к платеArduino, в зависимости от уровня освещенности фоторезистора и порога,заданного потенциометром

Упражнение №6. Пульсар

Цель: программное управление яркостью свечения светодиодной шкалы, подключенного к плате Arduino через транзистор.

На рисунке 6.1 представлена схема электрическая принципиальная.

Рисунок 6.1 – Схема электрическая принципиальная

На рисунке 6.2 представлена схема, собранная в программной среде SimulIDE.

Рисунок 6.2 – Схема, собранная в программной среде SimulIDE

1. Изменена программа так, чтобы яркость шкалы росла только до половины от максимальной.

#defineCONTROL_PIN 9

int brightness = 0;

voidsetup() {pinMode(CONTROL_PIN, OUTPUT);}

voidloop()

{ brightness = (brightness + 1) % 128;

analogWrite(CONTROL_PIN, brightness);

delay(10);}

Листинг 6.2 – Листинг программы

2. Изменена программа так, чтобы шкала становилась максимально яркой в три раза быстрее, без изменения функции delay().

#defineCONTROL_PIN 9

int brightness = 0;

voidsetup() {pinMode(CONTROL_PIN, OUTPUT);}

voidloop()

{ brightness = (brightness + 3) % 256;

analogWrite(CONTROL_PIN, brightness);

delay(10);}

Листинг 6.3 – Листинг программы

3. Изменена программа так, чтобы такой же результат был получен без использования операции %.

#defineCONTROL_PIN 9

int brightness = 0;

voidsetup() {pinMode(CONTROL_PIN, OUTPUT);}

voidloop()

{ brightness = (brightness<256) ? (brightness + 1) : 0;

analogWrite(CONTROL_PIN, brightness);

delay(10);}

Листинг 6.4 – Листинг программы

Ответы на вопросы:

1. Почему у светодиодной шкалы на 10 сегментов 20 ножек?

Ответ: потому что это 10 анодов и 10 катодов

2. Зачем в схеме биполярный транзистор? Какой он проводимости?

Ответ: Без транзистора такое количество светодиодов будет потреблять больше тока, чем 40 мА, которые может себе позволить цифровой порт платы, на который установлен БТ, для управления большим током с помощью малого.

3. За счет чего увеличивается яркость шкалы?

Ответ: за счет использования ШИМ на 9 пине.

4. Почему после достижения значения 255 переменная brightnessобнуляется?

Ответ: analogWrite принимает значение в диапазоне от 0 до 255, поэтому мы получаем остаток от деления на 256.

Вывод: Я освоил программное управление яркостью свечения светодиодной шкалы, подключенного к плате Arduino через транзистор

Упражнение №7. Бегущий огонек

Цель: организация эффекта «бегущий огонь» на светодиодной шкале,подключенной к плате Arduino.

На рисунке 7.1 представлена схема электрическая принципиальная.

Рисунок 7.1 – Схема электрическая принципиальная

На рисунке 7.2 представлена схема, собранная в программной среде SimulIDE.

Рисунок 7.2 – Схема, собранная в программной среде SimulIDE

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

#defineFIRST_LED_PIN 2

#defineLAST_LED_PIN 11

voidsetup()

{for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++)

pinMode(pin, OUTPUT);}

voidloop()

{ unsignedint ms = millis();

int pin = FIRST_LED_PIN + (ms / 1000) % 10;

digitalWrite(pin, HIGH); delay(10);

digitalWrite(pin, LOW);}

Листинг 7.2 – Листинг программы

2. Без выключения портов сделано так, чтобы огонек бежал только по средним четырем делениям шкалы.

#defineFIRST_LED_PIN 2

#defineLAST_LED_PIN 11

voidsetup(){

for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++)pinMode(pin, OUTPUT);}

voidloop()

{ unsignedint ms = millis();

int pin = (ms / 120) % 4 + 5;

digitalWrite(pin, HIGH);

delay(10);

digitalWrite(pin, LOW);}

Листинг 7.3 – Листинг программы

3. Программа изменена: вместо intpin = FIRST_LED_PIN + (ms / 120) % 10 перемещением огонька управляет цикл for.

#defineFIRST_LED_PIN 2

#defineLAST_LED_PIN 11

voidsetup()

{ for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++)

pinMode(pin, OUTPUT);}

voidloop()

{ for (int pin = 2; pin<12; pin++)

{ digitalWrite(pin, HIGH);

delay(120);

digitalWrite(pin, LOW); }}

Листинг 7.4 – Листинг программы

4. Неменяяместамипровода, изменена программатак, чтобы огонек бегал в обратном направлении.

#defineFIRST_LED_PIN 2

#defineLAST_LED_PIN 11

voidsetup(){

for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++) pinMode(pin, OUTPUT);}

voidloop()

{ unsignedint ms = millis();

int pin = LAST_LED_PIN — (ms / 120) % 10;

digitalWrite(pin, HIGH);

delay(10);

digitalWrite(pin, LOW);}

Листинг 7.5 – Листинг программы

Ответы на вопросы:

1. Почему в данном упражнении светодиодная шкала подключается безиспользования транзистора?

Ответ: потому что здесь для каждого светодиода мы используем собственный пин.

2. Если бы светодиоды были бы подключены только к портам 5, 6, 7, 8и 9, что нужно было бы изменить в программе?

Ответ: #defineFIRST_LED_PIN 5

#defineLAST_LED_PIN 9

3. С помощью какой другой инструкции можно выполнить действие,эквивалентное ++pin?

Ответ: pin = pin + 1

4. В чем разница между переменными типов int и unsigned int?

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

5. Что возвращает функция millis()?

Ответ: время в миллисекундах, прошедшее с момента включения микроконтроллера

6. Как в данном упражнении вычисляется номер порта, на которомнужно включить светодиод?

Ответ: int pin = FIRST_LED_PIN + (ms / 120) % 10;

Вывод: Произведенаорганизация эффекта «бегущий огонь» на светодиодной шкале,подключенной к плате Arduino

Упражнение №8. Мерзкое пианино

Цель: управление частотой пьезодинамика в зависимости от нажатойкнопки.

Рисунок 8.1 – Схема электрическая принципиальная

Рисунок 8.2 – Схема, собранная в программной среде SimulIDE

1. Пианино звучит в диапазоне от 2 кГц до 5 кГц.

#defineBUZZER_PIN 13

#defineFIRST_KEY_PIN 7

#defineKEY_COUNT 3

voidsetup(){pinMode(BUZZER_PIN, OUTPUT);}

voidloop(){for (int i = 0; i

int keyPin = i + FIRST_KEY_PIN;

boolean keyUp = digitalRead(keyPin);

if(!keyUp) {int frequency = 2000 + i * 1500;

tone(BUZZER_PIN, frequency, 20);

}}}

Листинг 8.2 – Листингпрограммы

2. Добавлено еще 2 кнопки и изменена программатак, чтобы можно было извлечь 5 различных нот.

#defineBUZZER_PIN 13

#defineFIRST_KEY_PIN 7

#defineKEY_COUNT 5

voidsetup(){pinMode(BUZZER_PIN, OUTPUT);}

voidloop(){

for (int i = 0; i

int keyPin = i + FIRST_KEY_PIN;

boolean keyUp = digitalRead(keyPin);

if(!keyUp) {

int frequency = 2000 + i * 500;

tone(BUZZER_PIN, frequency, 20);

}}}

Листинг 8.3 – Листингпрограммы

Рисунок 8.3 – Схема, собранная в программной среде SimulIDE

3. Подключены кнопки по схеме с подтягивающим к земле резистором.

Рисунок 8.4 – Схема, собранная в программной среде SimulIDE

#defineBUZZER_PIN 13

#defineFIRST_KEY_PIN 7

#defineKEY_COUNT5

voidsetup(){pinMode(BUZZER_PIN, OUTPUT);}

voidloop()

{ for (int i = 0; i

int keyPin = i + FIRST_KEY_PIN;

boolean keyUp = digitalRead(keyPin);

if (keyUp) {

int frequency = 2000 + i * 500;

tone(BUZZER_PIN, frequency, 20);}}}

Листинг 8.3 – Листингпрограммы

Ответы на вопросы:

1. Почему порты, к которым подключены кнопки, не настраивались какINPUT, но устройство работает?

Ответ: потому что, они по умолчанию INPUTдля digitalRead.

2. Каким образом удалось избежать написания отдельного кода длячтения каждой кнопки?

Ответ: благодаря использованию цикла, который «проходит» по всем кнопкам от FIRST_KEY_PIN до KEY_COUNT

3. Почему разные «ноты», издаваемые пьезодинамиком, звучат с разной громкостью?

Ответ: у нот разные частоты, а чем выше частота, тем громче она звучит.

4. С какой целью в этом упражнении используется оператор логического отрицания !?

Ответ: Поскольку мы собрали схему с подтягивающим резистором, при нажатии кнопки мы будем получать на соответствующем порте 0.

Вывод: Теперь я умею реализовыватьуправление частотой пьезодинамика в зависимости от нажатойкнопки.

Упражнение №9. Миксер

Цель: создать модель миксера с двумя скоростями работы на основеплаты Arduino.

Рисунок 9.1 – Схема электрическая принципиальная

Рисунок 9.2 – Схема, собранная в программной среде TinkerCAD
#defineMOTOR_PIN 9

#defineFIRST_BUTTON_PIN 5

#defineBUTTON_COUNT 3

#defineSPEED_STEP (255 / (BUTTON_COUNT — 1))
voidsetup()

{

pinMode(MOTOR_PIN, OUTPUT);

for (int i = 0; i

pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);

}
voidloop()

{

for (int i = 0; i

if (digitalRead(i + FIRST_BUTTON_PIN))

continue;

int speed = i * SPEED_STEP;

analogWrite(MOTOR_PIN, speed);

}

}

Листинг 9.1 – Листингпрограммы

1. Внесено единственное изменение в программу, после которого максимальная скорость вращения мотора составит половину от возможной.

#defineMOTOR_PIN 9

#defineFIRST_BUTTON_PIN 5

#defineBUTTON_COUNT 3

#defineSPEED_STEP (127 / (BUTTON_COUNT — 1))
voidsetup()

{

pinMode(MOTOR_PIN, OUTPUT);

for (int i = 0; i

pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);

}
voidloop()

{

for (int i = 0; i < BUTTON_COUNT; ++i) {

if (digitalRead(i + FIRST_BUTTON_PIN))

continue;

int speed = i * SPEED_STEP;

analogWrite(MOTOR_PIN, speed);

}

}

Листинг 9.2 – Листингпрограммы
2. Переписана программа без использования инструкции continue.

#defineMOTOR_PIN 9

#defineFIRST_BUTTON_PIN 5

#defineBUTTON_COUNT 3

#defineSPEED_STEP(127 / (BUTTON_COUNT — 1))

voidsetup()

{ pinMode(MOTOR_PIN, OUTPUT);

for (int i = 0; i

pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);

}
voidloop()

{ for (int i = 0; i

if(!digitalRead(i + FIRST_BUTTON_PIN))

{

int speed = i * SPEED_STEP;

analogWrite(MOTOR_PIN, speed);

}

}

}

Листинг 9.3 – Листингпрограммы

3. Добавлена в схему еще одну кнопка, у миксера теперь три режима.

Рисунок 9.3 – Схема, собранная в программной среде TinkerCad
#defineMOTOR_PIN 9

#defineFIRST_BUTTON_PIN 4

#defineBUTTON_COUNT 4

#defineSPEED_STEP (255 / (BUTTON_COUNT — 1))

voidsetup()

{

pinMode(MOTOR_PIN, OUTPUT);

for (int i = 0; i

pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);

}
voidloop()

{

for (int i = 0; i

if (digitalRead(i + FIRST_BUTTON_PIN))

continue;

int speed = i * SPEED_STEP;

analogWrite(MOTOR_PIN, speed);

}

}

Листинг 9.4 – Листингпрограммы

1. Зачем в схеме использован диод?

Ответ: Защитный диод в цепи транзистора нужен для того, чтобы ток обратного направления, который начнет создавать двигатель, вращаясь поинерции, не вывел транзистор из строя.

2. Почему использован полевой MOSFET-транзистор, а не биполярный?

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

3. Почему между портом Arduino и затвором транзистора не установлен резистор?

Ответ: потому что использован режим работы портов: INPUT_PULLUP

4. Как работает инструкция continue, использованная в цикле for?

Ответ: continue – оператор безусловного перехода к следующей итерации цикла for.

Вывод:Создана модель миксера с двумя скоростями работы на основеплаты Arduino.

Упражнение №10. Кнопочныйпереключатель

Цель: программная реализация триггера с предотвращением эффекта«дребезга контактов» кнопки, подключенной к плате Arduino.

Рисунок 10.1 – Схема электрическая принципиальная

Рисунок 10.2 – Схема, собранная в программной среде SimulIDE

  1. Код изменён: светодиод переключается толькопосле отпускания кнопки.

#defineBUTTON_PIN 3

#defineLED_PIN 13

boolean buttonWasUp = true;

boolean ledEnabled = false;

voidsetup()

{ pinMode(LED_PIN, OUTPUT);

pinMode(BUTTON_PIN, INPUT_PULLUP);}

voidloop()

{ boolean buttonIsUp = digitalRead(BUTTON_PIN);

if(!buttonWasUp&& buttonIsUp) {delay(10);

buttonIsUp = digitalRead(BUTTON_PIN);

if (buttonIsUp)

{ledEnabled = !ledEnabled;

digitalWrite(LED_PIN, ledEnabled);}}

buttonWasUp = buttonIsUp;}

Листинг 10.2 – Листинг программы

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

Рисунок 10.3 – Схема, собранная в программной среде SimulIDE

#define BUTTON_PIN3

#define BUTTON_PIN25

#define LED_PIN13

boolean buttonWasUp = true; boolean button2WasUp = true;

boolean ledEnabled = false; boolean button1 = false; boolean button2 = false;

void setup() { pinMode(LED_PIN, OUTPUT);

pinMode(BUTTON_PIN, INPUT_PULLUP);

pinMode(BUTTON_PIN2, INPUT_PULLUP); }

void loop() { boolean buttonIsUp = digitalRead(BUTTON_PIN);

boolean button2IsUp = digitalRead(BUTTON_PIN2);

if (buttonWasUp && !buttonIsUp) { delay(10);

buttonIsUp = digitalRead(BUTTON_PIN);

if (!buttonIsUp) button1 = !button1; }

if (button2WasUp && !button2IsUp) { delay(10);

button2IsUp = digitalRead(BUTTON_PIN2);

if (!button2IsUp) button2 = !button2; }

if ((button1 * button2) ==1) {

ledEnabled = true;

digitalWrite(LED_PIN, ledEnabled);

}

else ledEnabled = false;

digitalWrite(LED_PIN, ledEnabled);

buttonWasUp = buttonIsUp;

button2WasUp = button2IsUp;

}

Листинг 10.3 – Листингпрограммы

Ответы на вопросы:

2. Результатом выполнения данной программы будет число 22.

3. Основные особенности использования инструкции continue в этом примере:

Код сначала использует функцию map и split, чтобы преобразовать введенную пользователем строку в два целых числа n и k.

Затем используется цикл for для итерации от n до k+1.

Внутри цикла for используется условный оператор if, чтобы проверить, делится ли текущее число на 3 без остатка.

Если число делится на 3 без остатка, используется инструкция continue, чтобы пропустить это число и перейти к следующей итерации цикла.

Если число не делится на 3 без остатка, программа продолжает работу и выводит это число на экран.

4. for i in range(20, 51):

   if i % 4 == 0:

       print(i)

Понравилась статья? Поделить с друзьями:
  • Жалоба на руководство высшему руководству
  • Toyota corolla levin скачать руководство
  • Аквадетрим водный раствор 500 ме инструкция
  • Как открыть ип через сайт налоговой инструкция
  • Престиж фунгицид инструкция по применению на картофеле