Что произойдет если создать директиву define high low
Перейти к содержимому

Что произойдет если создать директиву define high low

  • автор:

Что будет если подключить светодиод без резистора?

Через светодиод потечёт ток, больше допустимого значения, и светодиод может выйти из строя. Это также может вывести из строя порт микроконтроллера.

Зачем нужна встроенная функция pinMode? Какие параметры она принимает?

Функция pinMode настраивает определённый порт на режим выхода или входа. Соответственно она принимает параметры pin(номер порта) и value(INPUT, OUTPUT).

Зачем нужна встроенная функция digitalWrite? Какие параметры она принимает?

Функция digitalWrite не возвращает никакого значения и принимает два параметра:

Pin – номер цифрового порта на который мы отправляем сигнал

Value – значение которое мы отправляем на порт (HIGH, LOW).

С помощью какой встроенной функции можно заставить микроконтроллер ничего не делать?

С помощью функции delay можно остановить работу микроконтроллера на определённый промежуток времени.

В каких единицах задается длительность паузы для этой функции?

Длительность паузы для функции delay задаётся в миллисекундах.

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

Сделайте так, чтобы маячок светился полсекунды, а пауза между вспышками была равна одной секунде

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

Эксперимент 2. Маячок с нарастающей яркостью

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

Схема

Код

#define LED_PIN 9

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

Какие из следующих идентификаторов корректны и не вызовут ошибку?

Так как идентификаторы могут состоять только из латинских букв, цифр и символов подчеркивания_, и при этом не могут начинаться с цифр, то ошибки не вызовут идентификаторы:

Что произойдет, если создать директиву #define HIGH LOW?

Деректива заменит все значения LOW на HIGH, таким образом мы не сможем задавать нулевое значение на выходах микроконтроллера.

Почему мы не сможем регулировать яркость светодиода, подключенного к порту 7?

Вывод 7 не поддерживает ШИМ-сигнал, то есть на нём нельзя регулировать напряжение.

Какое усреднённое напряжение мы получим на пине 6, если вызовем функцию analogWrite(6, 153)?

На 6 пине получим напряжение 3В.

Какое значение параметра value нужно передать функции analogWrite, чтобы получить усреднённое напряжение 2 В?

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

Отключите питание, отключите светодиод от 9-го порта и подключите к 11-му. Измените программу так, чтобы схема снова заработала

#define LED_PIN 11

Измените код программы так, чтобы в течение секунды на светодиод последовательно подавалось усреднённое напряжение 0, 1, 2, 3, 4, 5 В

Что произойдет если создать директиву define high low

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2023. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Эксперимент 2. Маячок с нарастающей яркостью

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

Видеоурок

Прочтите перед выполнением

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

1 беспаечная макетная плата
1 резистор номиналом 220 Ом

Для дополнительного задания

еще 1 светодиод
еще 1 резистор номиналом 220 Ом
еще 2 провода

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

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

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

Не любой порт Arduino поддерживает широтно-импульсную модуляцию, если вы хотите регулировать напряжение, вам подойдут пины, помеченные символом тильда «~». Для Arduino Uno это пины 3, 5, 6, 9, 10, 11

Скетч

// даём разумное имя для пина №9 со светодиодом // (англ. Light Emitting Diode или просто «LED») // Так нам не нужно постоянно вспоминать куда он подключён #define LED_PIN 9 void setup() { // настраиваем пин со светодиодом в режим выхода, // как и раньше pinMode(LED_PIN, OUTPUT); } void loop() { // выдаём неполное напряжение на светодиод // (он же ШИМ-сигнал, он же PWM-сигнал). // Микроконтроллер переводит число от 0 до 255 к напряжению // от 0 до 5 В. Например, 85 — это 1/3 от 255, // т.е. 1/3 от 5 В, т.е. 1,66 В. analogWrite(LED_PIN, 85); // держим такую яркость 250 миллисекунд delay(250); // выдаём 170, т.е. 2/3 от 255, или иными словами — 3,33 В. // Больше напряжение — выше яркость! analogWrite(LED_PIN, 170); delay(250); // все 5 В — полный накал! analogWrite(LED_PIN, 255); // ждём ещё немного перед тем, как начать всё заново delay(250); }

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

Идентификаторы переменных, констант, функций (в этом примере идентификатор LED_PIN ) являются одним словом (т.е. нельзя создать идентификатор LED PIN ).

Идентификаторы могут состоять из латинских букв, цифр и символов подчеркивания _ . При этом идентификатор не может начинаться с цифры.

PRINT // верно PRINT_3D // верно MY_PRINT_3D // верно _PRINT_3D // верно 3D_PRINT // ошибка ПЕЧАТЬ_3Д // ошибка PRINT:3D // ошибка

Регистр букв в идентификаторе имеет значение. Т.е. LED_PIN , LED_pin и led_pin с точки зрения компилятора — различные идентификаторы

Идентификаторы, создаваемые пользователем, не должны совпадать с предопределенными идентификаторами и стандартными конструкциями языка; если среда разработки подсветила введенный идентификтор каким-либо цветом, замените его на другой

Директива #define просто говорит компилятору заменить все вхождения заданного идентификатора на значение, заданное после пробела (здесь 9 ), эти директивы помещают в начало кода. В конце данной директивы точка с запятой ; не допустима

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

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

// однострочный комментарий следует после двойного слеша до конца строки /* многострочный комментарий помещается между парой слеш-звездочка и звездочка-слеш */

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

Функция analogWrite(pin, value) не возвращает никакого значения и принимает два параметра:
pin — номер порта, на который мы отправляем сигнал

value — значение скважности ШИМ, которое мы отправляем на порт. Он может принимать целочисленное значение от 0 до 255, где 0 — это 0%, а 255 — это 100%

Arduino.ru

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

if(digitalRead(pin) == invertFunc(HIGH)) < //do_something >invertFunc(arg) < if(arg==HIGH) < arg=LOW; return arg; >if(arg==LOW) < arg=HIGH; return arg; >>

Может кто подскажет другое решение что бы минимизировать движения, покупать другой блок реле не выход)

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 17:42
Зарегистрирован: 19.10.2016

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 17:43
Зарегистрирован: 12.12.2018
sadman41 пишет:

не понял, можно объяснить?

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 17:46

Jeka_M аватар

Зарегистрирован: 06.07.2014

Zara других вариантов нет: либо переписывать участки программы, либо инвертировать сигнал аппаратно.

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 17:47
Зарегистрирован: 19.10.2016

Предполагается, что люди, задающие вопрос в разделе «программирование», догадаются в гугле поискать #define

А если нет, так и нет.

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 17:49
Зарегистрирован: 12.12.2018
sadman41 пишет:

Предполагается, что люди, задающие вопрос в разделе «программирование», догадаются в гугле поискать #define

А если нет, так и нет.

что оно делает я знаю, не понял почему у вас константа с одним именем имеет разные значения, или это просто для примера

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 17:58
Зарегистрирован: 19.10.2016

Просто для примера — как инвертируются значения без всяких функций.

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 21:04

Jeka_M аватар

Зарегистрирован: 06.07.2014

Для Zara: всё равно придётся вручную менять в программе HIGH на ON в нужных местах. И это займёт столько же времени, сколько поменять HIGH на LOW. Применить директиву #define имеет смысл если Вы планируете периодически менять модуль реле с другим управляющим логическим уровнем. Если же это нужно сделать однократно, то смысла не имеет.

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 18:32
Зарегистрирован: 01.10.2015

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

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 18:56

ЕвгенийП аватар

Зарегистрирован: 25.05.2015
Zara пишет:

можно ли поменять глобально на нескольких пинах значения HIGH и LOW для того что бы не переписывать и что бы код остался читабельным

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

Вот скажите, на кой, простите мой французский, хер, Вы включаете реле конструкцией

Это по-Вашему читабельно?

Всегда делайте по уму:

static const bool bRealyOn = HIGH; inline void turnRelayOn(const int8_t pin) < digitalWrite(pin, bRealyOn); >inline void turnRelayOff(const int8_t pin)

и везде используйте turnRelayOn и turnRelayOff !

А если и приспичит изменить логику, так в одном месте одну константу поменять и всего делов.

Не ленитесь, перепишите.

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 21:03
Зарегистрирован: 12.12.2018
ЕвгенийП пишет:
Zara пишет:

можно ли поменять глобально на нескольких пинах значения HIGH и LOW для того что бы не переписывать и что бы код остался читабельным

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

Вот скажите, на кой, простите мой французский, хер, Вы включаете реле конструкцией

Это по-Вашему читабельно?

Всегда делайте по уму:

static const bool bRealyOn = HIGH; inline void turnRelayOn(const int8_t pin) < digitalWrite(pin, bRealyOn); >inline void turnRelayOff(const int8_t pin)

и везде используйте turnRelayOn и turnRelayOff !

А если и приспичит изменить логику, так в одном месте одну константу поменять и всего делов.

Не ленитесь, перепишите.

Круто, спасибо) по неопытности все)

  • Войдите на сайт для отправки комментариев

Вс, 19/05/2019 — 21:07
Зарегистрирован: 12.12.2018
Green пишет:

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

Это да, тут вы правы, но нельзя вот взять и написать без опыта что то прям вот хорошее, как нельзя сделать космический корабль если только вчера колесо изобрел

  • Войдите на сайт для отправки комментариев

Пнд, 20/05/2019 — 09:37

ЕвгенийП аватар

Зарегистрирован: 25.05.2015
Zara пишет:
нельзя сделать космический корабль если только вчера колесо изобрел

Ну, если изобрёл, то всё в итоге получится. Хуже, когда за космических корабль берутся люди никогда ничего не изобретшие и не способные изобрести.

  • Войдите на сайт для отправки комментариев

Пнд, 20/05/2019 — 10:54

DetSimen аватар

Зарегистрирован: 25.01.2017

#define HIGH LOW

  • Войдите на сайт для отправки комментариев

Пнд, 20/05/2019 — 11:34
Зарегистрирован: 17.08.2015
DetSimen пишет:

#define HIGH LOW

угу. а классический #define true false ещё круче.

  • Войдите на сайт для отправки комментариев

Пнд, 20/05/2019 — 12:01
anatoli_nik
Зарегистрирован: 17.01.2019

В начале программы опрашиваешь все входы и пихаешь в переменные, потом что-то делаешь, а в конце программы из переменных пихаешь на выходы. В итоге искать по всей программе не нужно. Как пример:

#define pin_knopka_pusk 2 #define pin_knopka_stop 3 #define pin_puskatel 4 boolean knopka_pusk; boolean knopka_stop; boolean puskatel; //************************ void inputRead() < knopka_pusk=!digitalRead(pin_knopka_pusk); //инверсное чтение для удобства восприятия knopka_stop=!dgitalRead( pin_knopka_stop); //инверсное чтение для удобства восприятия >void outputWrite() < digitalWrite(pin_puskatel, puskatel); //прямой вывод //digitalWrite(pin_puskatel, !puskatel); //инверсный вывод >//*************************** void setup() < pinMode(pin_knopka_pusk, INPUT_PULLUP); pinMode(pin_knopka_stop, INPUT_PULLUP); pinMode(pin_puskatel, OUTPUT); >void loop() < inputRead(); //читаем входы //что-то делаем if (knopka_pusk&&(!knopka_stop)) puskatel = HIGH; else if (knopka_stop) puskatel = LOW; outputWrite(); //пишем выходы >
  • Войдите на сайт для отправки комментариев

Пнд, 20/05/2019 — 12:13

andycat аватар

Зарегистрирован: 07.09.2017
ЕвгенийП пишет:

Всегда делайте по уму:

static const bool bRealyOn = HIGH; inline void turnRelayOn(const int8_t pin) < digitalWrite(pin, bRealyOn); >inline void turnRelayOff(const int8_t pin)

и везде используйте turnRelayOn и turnRelayOff !

Красиво, спасибо, пригодится.

  • Войдите на сайт для отправки комментариев

Пнд, 20/05/2019 — 12:23
Зарегистрирован: 19.10.2016

Интересный факт — само имя переменной как бы подразумевает невысказанный программистом вопрос: действительно ли On равно HIGH. Что даже придаёт некий философский смысл функциям, заставляющий задуматься — On или не On.

  • Войдите на сайт для отправки комментариев

Пнд, 20/05/2019 — 18:08
Зарегистрирован: 01.10.2015

Ага, толи дело оn(LED), off(LED) — всё ясно как божий день, какие вопросы?

  • Войдите на сайт для отправки комментариев

Сб, 01/06/2019 — 19:41
Зарегистрирован: 16.11.2017

дефайнить конечно удобно, а решение от Евгения П. — вообще красиво. Но что делать с «маленькими хитростями»? Типа тех, что компилятор относится спокойно и к HIGH и к true, и к любому числу больше 0.

К примеру, digitalWrite(led, true), digitalWrite(led, HIGH), digitalWrite(led, 8) — засветит светодиод, а digitalWrite(led, false), digitalWrite(led, LOW), digitalWrite(led, 0) — погасит. Очень удобно использовать без доп. обработки или доп.переменных в коде. Если нужно перевернуть, работает даже такое digitalWrite(led, !8) — выключит, а digitalWrite(led, !0) — включит.

У меня в одном проекте управление DTMF так сделано — 0 выключить, а 9 — включить. В digitalWrite() просто передаю второе число из кода управления, удобно, зараза.

А вот как такое задефайнить или перевернуть наоборот? Мне не надо, но просто интерсно.

  • Войдите на сайт для отправки комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *