Глобально инвертировать значение на пинах

Zara
Offline
Зарегистрирован: 12.12.2018

После написания прошивки оказалось что блок реле который и управляет всем работает не по 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;
}
}

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

sadman41
Offline
Зарегистрирован: 19.10.2016

#define ON LOW

или

#define ON HIGH

Zara
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

#define ON LOW

или

#define ON HIGH

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

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

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

sadman41
Offline
Зарегистрирован: 19.10.2016

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

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

Zara
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

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

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

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

sadman41
Offline
Зарегистрирован: 19.10.2016

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

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

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

Green
Offline
Зарегистрирован: 01.10.2015

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

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

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

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 !

Сравните читабельногсть!

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

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

Zara
Offline
Зарегистрирован: 12.12.2018

ЕвгенийП пишет:

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

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

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

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 !

Сравните читабельногсть!

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

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

 

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

Zara
Offline
Зарегистрирован: 12.12.2018

Green пишет:

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

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

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

вредный совет:

#define HIGH LOW

SLKH
Offline
Зарегистрирован: 17.08.2015

DetSimen пишет:

вредный совет:

#define HIGH LOW

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

anatoli_nik
Offline
Зарегистрирован: 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(); //пишем выходы
 }

andycat
andycat аватар
Offline
Зарегистрирован: 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) { digitalWrite(pin, ! bRealyOn); }

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

 

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

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Green
Offline
Зарегистрирован: 01.10.2015

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

kostyamat
Offline
Зарегистрирован: 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() просто передаю второе число из кода управления, удобно, зараза.

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

Green
Offline
Зарегистрирован: 01.10.2015

Какое такое? Что именно перевернуть?
И как раньше люди жили без Ардуино? Да и сейчас). И пишут понятно и лаконично, типа, toggle(LED) что бы инвертировать. Определяя к примеру #define LED B,5,L.)

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

странно, все "гуру" в отпуск свалили похожу..

где рекомендация работать на прямую с пинами

1 строка кода = сразу 8 пинов обрабатывает! и код минимальный и скоротсь испольнения в сотню раз быстрее и одновременно (в пределах каждых 8 пинов группы)...

 

один минус - не униварсально и при смене МК может потребовтаься перенайтройка номеров портов

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

А теперь, внимательно прочитай чо хочет ТС: 

После написания прошивки оказалось что блок реле который и управляет всем работает не по HIGH сигналу а по LOW. Т.е реле включится если на пин управления пойдет команда 

1 digitalWrite(pin) = LOW;

и отключится если

1 digitalWrite(pin) = HIGH;

А так как кроме команд есть еще достаточно всяких проверок

1 if(digitalRead(pin) == HIGH) {
2  
3 //do_something
4  
5 }

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

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

где тут и для чего целый порт? 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

а ну если человек не знает, что такое "автозамена"

то #define HIGH !HIGH спасет мир

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

а за это был разговор еще в #13

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ELITE пишет:

странно, все "гуру" в отпуск свалили похожу..

Ну, почему все? Ты же остался!