правого. Компилятор не знает наших намерений и ошибку не выдаст, а мы можем нечаянно изменить значение какой-нибудь переменной и затем долго разыскивать ошибку. Условный оператор if («если») — один из ключевых в большинстве языков программирования.
С его помощью мы можем выполнять не только жестко заданную последовательность действий, но принимать решения, по какой ветви алгоритма идти, в зависимости от неких условий. У логического выражения lightness < threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод» С таким же успехом мы могли бы сказать «если освещенность меньше порогового уровня, то включить светодиод», т.е. передать в if всё логическое выражение: if ( lightness < threshold ) < // . > За условным оператором if обязательно следует блок кода, который выполняется в случае истинности логического выражения.
Не забывайте про обе фигурные скобки <> ! Если в случае истинности выражения нам нужно выполнить только одну инструкцию, ее можно написать сразу после if (…) без фигурных скобок: if ( lightness < threshold ) digitalWrite ( LED_PIN, HIGH ) ; Оператор if может быть расширен конструкцией else («иначе»). Блок кода или единственная инструкция, следующий за ней, будет выполнен только если логическое выражение в if имеет значение false , «ложь».
Как увеличить максимальную яркость на айфоне 13 | максимальная яркость на iPhone 13 pro / pro max
Правила, касающиеся фигурных скобок, такие же. В нашем эксперименте мы написали «если слишком темно, включить светодиод, иначе выключить светодиод». Вопросы для проверки себя 1. Если мы установим фоторезистор между аналоговым входом и землей, наше устройство будет работать наоборот: светодиод будет включаться при увеличении количества света. Почему? 2. Какой результат работы устройства мы получим, если свет от светодиода будет падать на фоторезистор?
3. Если мы все же установили фоторезистор так, как сказано в предыдущем вопросе, как нам нужно изменить программу, чтобы устройство работало верно? 4. Допустим, у нас есть код if (условие) <действие;>.
В каких случаях будет выполнено действие ? 5. При каких значениях y выражение x + y > 0 будет истинным, если x > 0 ? 6. Обязательно ли указывать, какие инструкции выполнять, если условие в операторе if ложно? 7. Чем отличается оператор == от оператора = ? 8. Если мы используем конструкцию if (условие) действие1; else действие2; , может ли быть ситуация, когда ни одно из действий не выполнится? Почему?
Задания для самостоятельного решения 1. Перепишите программу без использования переменной tooDark с сохранением функционала устройства. 2. Добавьте в схему еще один светодиод. Дополните программу так, чтобы при падении освещенности ниже порогового значения включался один светодиод, а при падении освещенности ниже половины от порогового значения включались оба светодиода. 3. Измените схему и программу так, чтобы светодиоды включались по прежнему принципу, но светились тем сильнее, чем меньше света падает на фоторезистор.
Как увеличить или уменьшить яркость экрана ноутбука.Пропала яркость на ноутбуке.Экран стал тусклым
Эксперимент 6. Пульсар Список деталей для эксперимента 1 плата Arduino Uno 1 беспаечная макетная плата 1 биполярный транзистор 1 светодиодная шкала 1 резистор номиналом 1 кОм 10 резисторов номиналом 220 Ом 13 проводов «папа-папа» Принципиальная схема Схема на макетке
Обратите внимание Светодиодная шкала — это несколько светодиодов в одном корпусе. Нам нужно чтобы питание шло к их анодам, а катоды направлялись к земле. Скорее всего на вашей шкале аноды находятся со стороны маркировки. Если шкала не светится, когда должна, попробуйте перевернуть ее. База биполярного транзистора — это его средняя ножка.
Если повернуть транзистор плоской стороной к себе, ножками вниз, то левая ножка это коллектор, а правая — эмиттер. Если эту схему собрать без резистора между базой транзистора и портом Arduino, мы практически устроим короткое замыкание порта на землю. Рано или поздно это выведет из строя транзистор или ножку микроконтроллера. Зачем здесь вообще транзистор?
Без него такое количество светодиодов будет потреблять больше тока, чем 40 мА, которые может себе позволить цифровой пин платы. Поэтому мы берем питание из порта 5V, рассчитанного на ток до 500 мА, а на цифровой порт ставим транзистор, чтобы с помощью малого тока управлять большим. В данном случае мы включили 10 светодиодов параллельно, каждый через отдельный резистор.
Включать их через один резистор неправильно: даже светодиоды из одной партии имеют минимальный разброс вольт-амперных характеристик, вследствие чего они: o Светились бы с различной яркостью o Из-за минимальной разницы во времени включения, больший ток, прошедший через первый включившийся светодиод, мог бы вывести его из строя. И так по цепочке. Скетч #define CONTROL_PIN 9 // переменные верхнего уровня, т.е. объявленные вне функций, // называют глобальными. Их значения сохраняются всё время, // пока работает микроконтроллер int brightness = 0 ; void setup () < pinMode ( CONTROL_PIN, OUTPUT ) ; >void loop () < // увеличиваем значение яркости на единицу, чтобы нарастить // яркость. Однако яркость не должна быть более 255, поэтому // используем операцию остатка от деления, чтобы при // достижении значения 255, следующим значением снова стал 0 // Y % X — это остаток от деления Y на X; // плюс, минус, делить, умножить, скобки — как в алгебре. brightness = ( brightness + 1 ) % 256 ;
// подаём вычисленный ШИМ-сигнал яркости на пин с базой // управляющего транзистора analogWrite ( CONTROL_PIN, brightness ) ; // ждём 10 мс перед следующим наращиванием яркости. Таким // образом, полный накал будет происходить в течение // 256×10 = 2560 мс delay ( 10 ) ; > Пояснения к коду Как мы уже знаем, analogWrite(pin, value) в качестве value принимает значения от 0 до 255.
Если передать значение из-за пределов этого диапазона, функция сработает, но в общем случае вы получите неожиданный результат. Оператор X % Y дает остаток от деления X на Y . Если X меньше Y , т.е. целая часть результата деления равна 0, оператор % будет возвращать X . Таким образом: o Пока brightness + 1 меньше 256, в brightness записывается значение brightness + 1 o Как только brightness + 1 принимает значение 256, результатом (brightness + 1) % 256 становится 0 и на следующей итерации loop() всё начинается сначала. Оператор % работает только с целыми операндами. В выражении (brightness + 1) % 256 скобки используются для назначения порядка действий. Операция % имеет больший приоритет, чем + , а сложение нам нужно выполнять раньше.
С операциями умножения и деления оператор взятия остатка имеет одинаковый приоритет. Вопросы для проверки себя 1. Почему у светодиодной шкалы на 10 сегментов 20 ножек? 2. Зачем в схеме биполярный транзистор? 3. За счет чего увеличивается яркость шкалы? 4. Почему после достижения значения 255 переменная brightness обнуляется?
Задания для самостоятельного решения 1. Измените программу так, чтобы яркость шкалы росла только до половины от максимальной. 2. Измените программу так, чтобы шкала становилась максимально яркой в три раза быстрее, без изменения функции delay . 3. Измените исходную программу так, чтобы такой же результат был получен без использования операции % , но с применением условного оператора if .
Эксперимент 7. Бегущий огонёк Список деталей для эксперимента 1 плата Arduino Uno 1 беспаечная макетная плата 1 светодиодная шкала 10 резисторов номиналом 220 Ом 11 проводов «папа-папа» Принципиальная схема Схема на макетке Обратите внимание Обратите внимание, что в данном эксперименте резисторы установлены между катодами и землей в отличие от эксперимента пульсар .
o Инициализировать переменную-счетчик, присвоив ей первоначальное значение. В нашем случае: int pin = FIRST_LED_PIN o Указать условие, до достижения которого будет повторяться цикл. В нашем случае: pin <= LAST_LED_PIN o Определить правило, по которому будет изменяться счетчик.
В нашем случае ++pin (см. ниже об операторе ++ ). Например, можно сделать цикл for (int i = 10; i >0; i = i — 1) . В этом случае: o Переменной i присваивается значение 10 o Это значение удовлетворяет условию i > 0 o Поэтому блок кода, помещенный в цикл, выполняется первый раз o Значение i уменьшается на единицу, согласно заданному правилу, и принимает значение 9 o Блок кода выполняется второй раз. o Всё повторяется снова и снова вплоть до значения i равного 0 o Когда i станет равна 0, условие i > 0 не выполнится, и выполнение цикла закончится o Контроллер перейдет к коду, следующему за циклом for Помещайте код, который нужно зациклить, между парой фигурных скобок <> , если в нем больше одной инструкции. Переменная-счетчик, объявляемая в операторе for , может использоваться внутри цикла. Например, в данном эксперименте pin последовательно принимает значения от 2 до 11 и, будучи переданной в pinMode , позволяет настроить 10 портов одной строкой, помещенной в цикл. Переменные-счетчики видны только внутри цикла.
Т.е. если обратиться к pin до или после цикла, компилятор выдаст ошибку о необъявленной переменной. Конструкция i = i — 1 в пояснении выше не является уравнением! Мы используем оператор присваивания = для того, чтобы в переменную i поместить значение, равное текущему значению i , уменьшенному на 1. Выражение ++pin — это т.н. оператор инкремента , примененный к переменной pin . Эта инструкция даст тот же результат, что pin = pin + 1 Аналогично инкременту работает оператор декремента — , уменьшающий значение на единицу. Подробнее об этом в статье про арифметические операции . Тип данных unsigned int используют для хранения целых чисел без знака, т.е. только неотрицательных . За счет лишнего бита, который теперь не используется для хранения знака, мы можем хранить в переменной такого типа значения до 65 535. Функция millis возвращает количество миллисекунд, прошедших с момента включения или перезагрузки микроконтроллера. Здесь мы используем ее для отсчета времени между переключениями светодиодов.
С помощью выражения (ms / 120) % 10 мы определяем, который из 10 светодиодов должен гореть сейчас. Перефразируя, мы определяем какой отрезок длиной в 120 мс идет сейчас и каков его номер внутри текущего десятка.
Мы добавляем порядковый номер отрезка к номеру того порта, который в текущем наборе выступает первым. То, что мы гасим светодиод с помощью digitalWrite(pin, LOW) всего через 10 мс после включения не заметно глазу, т.к. очень скоро будет вновь вычислено, какой из светодиодов включать, и он будет включен — только что погашенный или следующий. Вопросы для проверки себя 1. Почему в данном эксперименте мы подключаем светодиодную шкалу, не используя транзистор?
2. Если бы мы включали светодиоды только на портах 5, 6, 7, 8, 9, что нужно было бы изменить в программе? 3. С помощью какой другой инструкции можно выполнить действие, эквивалентное ++pin ? 4. В чем разница между переменными типов int и unsigned int ? 5. Что возвращает функция millis() ? 6. Как в данном эксперименте мы вычисляем номер порта, на котором нужно включить светодиод? Задания для самостоятельного решения 1. Измените код так, чтобы светодиоды переключались раз в секунду. 2. Не выключая порты, сделайте так, чтобы огонёк бежал только по средним четырем делениям шкалы. 3. Переделайте программу так, чтобы вместо int pin = FIRST_LED_PIN + (ms / 120) % 10 перемещением огонька управлял цикл for 4. Не меняя местами провода, измените программу так, чтобы огонёк бегал в обратном направлении.
Эксперимент 8. Мерзкое пианино Список деталей для эксперимента 1 плата Arduino Uno 1 беспаечная макетная плата 1 пьезопищалка 3 тактовых кнопки 3 резистора номиналом 10 кОм 10 проводов «папа-папа» Для дополнительного задания еще 2 кнопки еще 2 резистора номиналом 10 кОм еще 2 провода Принципиальная схема Схема на макетке
Источник: studfile.net
Ответы на вопросы (6 Эксперимент)
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.77 KB | None | 0 0
1. Почему у светодиодной шкалы на 10 сегментов 20 ножек?
1)20 ножек,потому что у каждого светодиода есть анод и катод.
2. Зачем в схеме биполярный транзистор?
2)Без него такое кол-во светодиодов будет потреблять больше тока.
3. За счет чего увеличивается яркость шкалы?
Потому что в скетче введена команда brightness=(brightness + 1)% 256;
4. Почему после достижения значения 255 переменная brightness обнуляется?
4)потому что value принимает значения от 0 до 255.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement
Python | 55 sec ago | 0.49 KB
GetText | 7 min ago | 0.23 KB
Lua | 8 min ago | 1.61 KB
PHP | 12 min ago | 0.42 KB
Python | 18 min ago | 0.52 KB
HTML | 32 min ago | 0.07 KB
Python | 1 hour ago | 0.59 KB
JSON | 1 hour ago | 123.16 KB
Advertisement
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
Источник: pastebin.com
Почему у светодиодной шкалы на 10 сегментов 20 ножек?
Без него такое количество светодиодов будет потреблять больше тока, чем 40 мА, которые может себе позволить цифровой пин платы. Поэтому мы берем питание из порта 5V, рассчитанного на ток до 500 мА, а на цифровой порт ставим транзистор, чтобы с помощью малого тока управлять большим.
За счет чего увеличивается яркость шкалы?
За счёт прибавления единицы к int brightness = 0, каждый раз яркость будет увеличиваться на единицу.
Почему после достижения значения 255 переменная rightness обнуляется?
Оператор X % Y дает остаток от деления X на Y. Если X меньше Y, т.е. целая часть результата деления равна 0, оператор % будет возвращать X. Таким образом:
· Пока brightness + 1 меньше 256, в brightness записывается значение brightness + 1
· Как только brightness + 1 принимает значение 256, результатом (brightness + 1) % 256становится 0 и на следующей итерации loop() всё начинается сначала.
Задания для самостоятельного решения
Измените программу так, чтобы яркость шкалы росла только до половины от максимальной.
1. #define CONTROL_PIN 9
2. int brightness = 0;
4. pinMode(CONTROL_PIN, OUTPUT);
8. brightness = (brightness +1)%128;
10. analogWrite(CONTROL_PIN, brightness);
Измените программу так, чтобы шкала становилась максимально яркой в три раза быстрее, без изменения функции delay.
1. #define CONTROL_PIN 9
2. int brightness = 0;
4. pinMode(CONTROL_PIN, OUTPUT);
8. brightness = (brightness +3)%256;
10. analogWrite(CONTROL_PIN, brightness);
3.Измените исходную программу так, чтобы такой же результат был получен без использования операции %, но с применением условного оператора if.
1. #define CONTROL_PIN 9
2. int brightness = 0;
4. pinMode(CONTROL_PIN, OUTPUT);
8. brightness = (brightness +3);
10. if (brightness == 255)
13. analogWrite(CONTROL_PIN, brightness);
Эксперимент 7. Бегущийогонёк
В этом эксперименте мы заставляем огонёк бежать по светодиодной шкале.
Принципиальная схема
Код
1. #define FIRST_LED_PIN 2
2. #define LAST_LED_PIN 11
4. for(int pin = FIRST_LED_PIN; pin
5. pinMode(pin, OUTPUT);
9. unsigned int ms = millis();
10. int pin = FIRST_LED_PIN + (ms/120)%10;
Вопросы для проверки себя
Почему в данном эксперименте мы подключаем светодиодную шкалу, не используя транзистор?
Так как светодиоды в шкале будут включаться не все вместе, а по отдельности, и не будут потреблять большой ток.
Если бы мы включали светодиоды только на портах 5, 6, 7, 8, 9, что нужно было бы изменить в программе?
1. #define FIRST_LED_PIN 5
2. #define LAST_LED_PIN 9
5. for (int pin = FIRST_LED_PIN; pin
6. pinMode(pin, OUTPUT);
10. unsigned int ms = millis();
11. int pin = FIRST_LED_PIN + (ms / 120) % 5;
12. digitalWrite(pin, HIGH);
14. digitalWrite(pin, LOW);
3.С помощью какой другой инструкции можно выполнить действие, эквивалентное ++pin?
В чем разница между переменными типов int и unsigned int?
Тип данных unsigned int используют для хранения целых чисел без знака, т.е. только неотрицательных. За счет лишнего бита, который теперь не используется для хранения знака, мы можем хранить в переменной такого типа значения до 65 535.
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим.
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ — конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой.
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.
Папиллярные узоры пальцев рук — маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни.
Источник: cyberpedia.su