Переключение реле с помощью одной команды

digiben
Offline
Зарегистрирован: 29.11.2016

Доброго дня, у меня есть реле и есть команда для переключения его состояний.

if (incomingByte == 'H') 
{
digitalWrite(Relay, HIGH);
}

if (incomingByte == 'L') 
{
digitalWrite(Relay, LOW);
}

Подскажите как заставить изменять его состояние с вкл. на выкл. и обратно с помощью одной команды? Например послал команду Light и он в зависимости от состояния переключался бы

if (incomingByte == 'H') 
{
digitalWrite(Relay, HIGH);
}

 

valera678
Offline
Зарегистрирован: 04.11.2016
Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

digiben пишет:
Подскажите как заставить изменять его состояние с вкл. на выкл. и обратно с помощью одной команды?
Запоминать текущее состояние реле и по команде менять на противоположное. Типа:

if (incomingByte == 'H') 
{
  if(RelayStat^=TRUE) digitalWrite(Relay, HIGH); else digitalWrite(Relay, LOW); 
}

 

digiben
Offline
Зарегистрирован: 29.11.2016

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

[quote=digiben]

...проблема в том что я не могу связать/quote]

Возможно это поможет?

digiben
Offline
Зарегистрирован: 29.11.2016

шутеечки за 300

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
int r_01 =LOW;
if (incomingByte == 'H') 
{
r_01=!r_01;
digitalWrite(Relay, r_01);
}

Может так?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
digitalWrite(Relay, ! digitalRead(Relay));

И забудьте о перхоти.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну от перхоти может помочь патентованое средство Гильотена. Прежде всего есть переменная Relay и Relay_pin. Первое это состояние реле, а второе номер пина для подключения реле. Но если новички так норовят пройти по дороге из грабель, то я сбегаю за коробкой поп-корна.

// мне очень не нравится такая конструкция и прежде все неопределенностью. Например вывод Ардуины закорочен на землю
 digitalWrite(Relay, ! digitalRead(Relay));
// если вы делаете такую команду
 digitalWrite(Relay_pin, 0);
// или
digitalWrite(Relay_pin, 1);
// то лучше замените их на эти
digitalWrite(Relay_pin, Relay=0);
digitalWrite(Relay_pin, Relay=1);
предварительно задав  глобальной переменную
bool Relay;// состояние реле.

Тогда команда инвертирования будет выглядить так
 digitalWrite(Relay_pin, Relay=! Relay);


 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

И чем отличается от того, что я написал, тем что в конечном коде ассемблерная вставка по инвертированию значения будет по другому смещению? По объёму кода думаю будет одно и тоже

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Я не программист, мне хаос  по дзену положен...
К чему я это... для обучения акупункуре применяется медная статуя и в ней порядка 700 отверстий, обучаемый должен точно иголкой попасть в нужное место, как учат опустим, но для проверки отверстия замазывают воском и их не видно...
Некоторые продвинутые утверждают, что точек акупунктуры 74 тысячи, я не знаю, не считал, но то что их не 700, а знАААчительно больше знаю "руками"... обучить можно ремеслу и тогда у нас будет ремесленник...а Тихоновых-Козловых природа матушка даёт )))

Но то, что порядок приятнее бардака соглашусь )))

ЗЫ А у Ершова в Рапира переменные можно было по русски называть )))
 

digiben
Offline
Зарегистрирован: 29.11.2016

Большое, Вам, человеческое спасибо.

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

qwone пишет:

// мне очень не нравится такая конструкция и прежде все неопределенностью. Например вывод Ардуины закорочен на землю

 digitalWrite(Relay, ! digitalRead(Relay));
// если вы делаете такую команду
 digitalWrite(Relay_pin, 0);
// или
digitalWrite(Relay_pin, 1);
// то лучше замените их на эти
digitalWrite(Relay_pin, Relay=0);
digitalWrite(Relay_pin, Relay=1);
предварительно задав  глобальной переменную
bool Relay;// состояние реле.

Тогда команда инвертирования будет выглядить так
 digitalWrite(Relay_pin, Relay=! Relay);

Уважаемый, не могли бы Вы пояснить свою мысль.

Насколько я понимаю, Вы против широко распростанённой конструкции инвертирования

digitalWrite(pin, ! digitalRead(pin));

на том основании, что в случае заземленного пина, она может подать туда HIGH и вызвать КЗ.

И предлагаете вместо неё использовать нечто вроде

bool Relay;// состояние реле.
...
digitalWrite(Relay_pin, Relay=0);
digitalWrite(Relay_pin, Relay=1);
...
 digitalWrite(Relay_pin, Relay=! Relay);

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

Можете объясниить, что помешает Вашей конструкции устроить КЗ на заземлённом пине? Молитва Пресвятой Деве?

А если ничто не помешает, то чем она (конструкция) лучше того, чем пользуются все (приведено в начале)?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ЕвгенийП.  Вам что нехватает памяти под переменные. Я считаю, что если установили на выход 0 или 1, то лучше потом зафиксировать ее в отведеной переменной. Тем более извлекать из переменной быстрее, чем считывать с вывода. Разумеется я говорю по получаемому коду, а не исходнику. 

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

 

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

qwone пишет:

я убедился в правильности такого подхода.

Это глубоко Ваша проблема. Но в ходе дискуссии Вы публично обвинили меня в том, что мой код имеет неопределённое поведение, и может спалить устройство ("мне очень не нравится такая конструкция и прежде все неопределенностью. Например вывод Ардуины закорочен на землю"), а сами привели код с точно такой же "неопределённостью". Вам это не кажется не совсем корректным? Вы не хотите также публично сказать. "да, я погорячился насчёт неопределённости"?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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

Вы не хотите также публично сказать. "да, я погорячился насчёт неопределённости"?

Хорошо, я погорячился. Другим я не советую так делать, но вам я РАЗРЕШАЮ делать так как вы хотите.