Почему у светодиодной шкалы на 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;
3. void setup() {
4. pinMode(CONTROL_PIN, OUTPUT);
5. Serial.begin(9600);
6. }
7. void loop() {
8. brightness = (brightness +1)%128;
9. Serial.println(brightness);
10. analogWrite(CONTROL_PIN, brightness);
11. delay(10);
12. }
Измените программу так, чтобы шкала становилась максимально яркой в три раза быстрее, без изменения функции delay.
Листинг:
1. #define CONTROL_PIN 9
2. int brightness = 0;
3. void setup() {
4. pinMode(CONTROL_PIN, OUTPUT);
5. Serial.begin(9600);
6. }
7. void loop() {
8. brightness = (brightness +3)%256;
9. Serial.println(brightness);
10. analogWrite(CONTROL_PIN, brightness);
11. delay(10);
12. }
3.Измените исходную программу так, чтобы такой же результат был получен без использования операции %, но с применением условного оператора if.
Листинг:
1. #define CONTROL_PIN 9
2. int brightness = 0;
3. void setup() {
4. pinMode(CONTROL_PIN, OUTPUT);
5. Serial.begin(9600);
6. }
7. void loop() {
8. brightness = (brightness +3);
9. Serial.println(brightness);
10. if (brightness == 255){
11. brightness=0;
12. }
13. analogWrite(CONTROL_PIN, brightness);
14. delay(10);
15. }
Эксперимент 7. Бегущийогонёк
В этом эксперименте мы заставляем огонёк бежать по светодиодной шкале.
Принципиальная схема
Код
1. #define FIRST_LED_PIN 2
2. #define LAST_LED_PIN 11
3. void setup() {
4. for(int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++){
5. pinMode(pin, OUTPUT);
6. }
7. }
8. void loop() {
9. unsigned int ms = millis();
10. int pin = FIRST_LED_PIN + (ms/120)%10;
11. digitalWrite(pin,HIGH);
12. delay(10);
13. digitalWrite(pin,LOW);
14. }
Вопросы для проверки себя
Почему в данном эксперименте мы подключаем светодиодную шкалу, не используя транзистор?
Так как светодиоды в шкале будут включаться не все вместе, а по отдельности, и не будут потреблять большой ток.
Если бы мы включали светодиоды только на портах 5, 6, 7, 8, 9, что нужно было бы изменить в программе?
Листинг:
1. #define FIRST_LED_PIN 5
2. #define LAST_LED_PIN 9
3. void setup()
4. {
5. for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
6. pinMode(pin, OUTPUT);
7. }
8. void loop()
9. {
10. unsigned int ms = millis();
11. int pin = FIRST_LED_PIN + (ms / 120) % 5;
12. digitalWrite(pin, HIGH);
13. delay(10);
14. digitalWrite(pin, LOW);
15. }
3.С помощью какой другой инструкции можно выполнить действие, эквивалентное ++pin?
pin = pin + 1
В чем разница между переменными типов int и unsigned int?
Тип данных unsigned int используют для хранения целых чисел без знака, т.е. только неотрицательных. За счет лишнего бита, который теперь не используется для хранения знака, мы можем хранить в переменной такого типа значения до 65 535.