Глобально инвертировать значение на пинах
- Войдите на сайт для отправки комментариев
Вс, 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)
Это по-Вашему читабельно?
Всегда делайте по уму:
static const bool bRealyOn = HIGH; inline void turnRelayOn(const int8_t pin) { digitalWrite(pin, bRealyOn); } inline void turnRelayOff(const int8_t pin) { digitalWrite(pin, ! bRealyOn); }и везде используйте turnRelayOn и turnRelayOff !
Сравните читабельногсть!
А если и приспичит изменить логику, так в одном месте одну константу поменять и всего делов.
Не ленитесь, перепишите.
Для того, чтобы код был читабельным, его нужно переписать. Тогда и с изменениями проблемы не будет от слова совсем.
Вот скажите, на кой, простите мой французский, хер, Вы включаете реле конструкцией
digitalWrite(pin, HIGH)
Это по-Вашему читабельно?
Всегда делайте по уму:
static const bool bRealyOn = HIGH; inline void turnRelayOn(const int8_t pin) { digitalWrite(pin, bRealyOn); } inline void turnRelayOff(const int8_t pin) { digitalWrite(pin, ! bRealyOn); }и везде используйте turnRelayOn и turnRelayOff !
Сравните читабельногсть!
А если и приспичит изменить логику, так в одном месте одну константу поменять и всего делов.
Не ленитесь, перепишите.
Круто, спасибо) по неопытности все)
А просто писать изначально нужно по нормальному, что бы потом не бегать и не менять по всей программе, при этом ещё и забыть где-нибудь. (
Это да, тут вы правы, но нельзя вот взять и написать без опыта что то прям вот хорошее, как нельзя сделать космический корабль если только вчера колесо изобрел
вредный совет:
#define HIGH LOW
вредный совет:
#define HIGH LOW
угу. а классический #define true false ещё круче.
В начале программы опрашиваешь все входы и пихаешь в переменные, потом что-то делаешь, а в конце программы из переменных пихаешь на выходы. В итоге искать по всей программе не нужно. Как пример:
#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(); //пишем выходы }Всегда делайте по уму:
static const bool bRealyOn = HIGH; inline void turnRelayOn(const int8_t pin) { digitalWrite(pin, bRealyOn); } inline void turnRelayOff(const int8_t pin) { digitalWrite(pin, ! bRealyOn); }и везде используйте 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. Т.е реле включится если на пин управления пойдет команда
1digitalWrite(pin) = LOW;и отключится если
1digitalWrite(pin) = HIGH;А так как кроме команд есть еще достаточно всяких проверок
1if(digitalRead(pin) == HIGH) {23//do_something45}то встает вопрос можно ли поменять глобально на нескольких пинах значения HIGH и LOW для того что бы не переписывать и что бы код остался читабельным и логически правильным.
где тут и для чего целый порт?
а ну если человек не знает, что такое "автозамена"
то #define HIGH !HIGH спасет мир
а за это был разговор еще в #13
странно, все "гуру" в отпуск свалили похожу..
Ну, почему все? Ты же остался!