Официальный сайт компании Arduino по адресу arduino.cc
Глобально инвертировать значение на пинах
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 19/05/2019 - 17:39
После написания прошивки оказалось что блок реле который и управляет всем работает не по HIGH сигналу а по LOW. Т.е реле включится если на пин управления пойдет команда
digitalWrite(pin) = LOW;
и отключится если
digitalWrite(pin) = HIGH;
А так как кроме команд есть еще достаточно всяких проверок
if(digitalRead(pin) == HIGH) { //do_something }
то встает вопрос можно ли поменять глобально на нескольких пинах значения 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; } }
Может кто подскажет другое решение что бы минимизировать движения, покупать другой блок реле не выход)
#define ON LOW
или
#define ON HIGH
#define ON LOW
или
#define ON HIGH
не понял, можно объяснить?
Zara других вариантов нет: либо переписывать участки программы, либо инвертировать сигнал аппаратно.
Предполагается, что люди, задающие вопрос в разделе "программирование", догадаются в гугле поискать #define
А если нет, так и нет.
Предполагается, что люди, задающие вопрос в разделе "программирование", догадаются в гугле поискать #define
А если нет, так и нет.
что оно делает я знаю, не понял почему у вас константа с одним именем имеет разные значения, или это просто для примера
Просто для примера - как инвертируются значения без всяких функций.
Для Zara: всё равно придётся вручную менять в программе HIGH на ON в нужных местах. И это займёт столько же времени, сколько поменять HIGH на LOW. Применить директиву #define имеет смысл если Вы планируете периодически менять модуль реле с другим управляющим логическим уровнем. Если же это нужно сделать однократно, то смысла не имеет.
А просто писать изначально нужно по нормальному, что бы потом не бегать и не менять по всей программе, при этом ещё и забыть где-нибудь. (
Для того, чтобы код был читабельным, его нужно переписать. Тогда и с изменениями проблемы не будет от слова совсем.
Вот скажите, на кой, простите мой французский, хер, Вы включаете реле конструкцией
digitalWrite(pin, HIGH)
Это по-Вашему читабельно?
Всегда делайте по уму:
и везде используйте turnRelayOn и turnRelayOff !
Сравните читабельногсть!
А если и приспичит изменить логику, так в одном месте одну константу поменять и всего делов.
Не ленитесь, перепишите.
Для того, чтобы код был читабельным, его нужно переписать. Тогда и с изменениями проблемы не будет от слова совсем.
Вот скажите, на кой, простите мой французский, хер, Вы включаете реле конструкцией
digitalWrite(pin, HIGH)
Это по-Вашему читабельно?
Всегда делайте по уму:
и везде используйте turnRelayOn и turnRelayOff !
Сравните читабельногсть!
А если и приспичит изменить логику, так в одном месте одну константу поменять и всего делов.
Не ленитесь, перепишите.
Круто, спасибо) по неопытности все)
А просто писать изначально нужно по нормальному, что бы потом не бегать и не менять по всей программе, при этом ещё и забыть где-нибудь. (
Это да, тут вы правы, но нельзя вот взять и написать без опыта что то прям вот хорошее, как нельзя сделать космический корабль если только вчера колесо изобрел
вредный совет:
#define HIGH LOW
вредный совет:
#define HIGH LOW
угу. а классический #define true false ещё круче.
В начале программы опрашиваешь все входы и пихаешь в переменные, потом что-то делаешь, а в конце программы из переменных пихаешь на выходы. В итоге искать по всей программе не нужно. Как пример:
Всегда делайте по уму:
и везде используйте turnRelayOn и turnRelayOff !
Красиво, спасибо, пригодится.
Интересный факт - само имя переменной как бы подразумевает невысказанный программистом вопрос: действительно ли On равно HIGH. Что даже придаёт некий философский смысл функциям, заставляющий задуматься - On или не On...
Ага, толи дело оn(LED), off(LED) - всё ясно как божий день, какие вопросы?
дефайнить конечно удобно, а решение от Евгения П. - вообще красиво. Но что делать с "маленькими хитростями"? Типа тех, что компилятор относится спокойно и к 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() просто передаю второе число из кода управления, удобно, зараза.
А вот как такое задефайнить или перевернуть наоборот? Мне не надо, но просто интерсно.
Какое такое? Что именно перевернуть?
И как раньше люди жили без Ардуино? Да и сейчас). И пишут понятно и лаконично, типа, toggle(LED) что бы инвертировать. Определяя к примеру #define LED B,5,L.)
странно, все "гуру" в отпуск свалили похожу..
где рекомендация работать на прямую с пинами
1 строка кода = сразу 8 пинов обрабатывает! и код минимальный и скоротсь испольнения в сотню раз быстрее и одновременно (в пределах каждых 8 пинов группы)...
один минус - не униварсально и при смене МК может потребовтаься перенайтройка номеров портов
А теперь, внимательно прочитай чо хочет ТС:
После написания прошивки оказалось что блок реле который и управляет всем работает не по HIGH сигналу а по LOW. Т.е реле включится если на пин управления пойдет команда
1
digitalWrite(pin) = LOW;
и отключится если
1
digitalWrite(pin) = HIGH;
А так как кроме команд есть еще достаточно всяких проверок
1
if
(digitalRead(pin) == HIGH) {
2
3
//do_something
4
5
}
то встает вопрос можно ли поменять глобально на нескольких пинах значения HIGH и LOW для того что бы не переписывать и что бы код остался читабельным и логически правильным.
где тут и для чего целый порт?
а ну если человек не знает, что такое "автозамена"
то #define HIGH !HIGH спасет мир
а за это был разговор еще в #13
странно, все "гуру" в отпуск свалили похожу..
Ну, почему все? Ты же остался!