Как отследить состояние пина

Maka
Offline
Зарегистрирован: 24.10.2015

Доброго времени суток всем!

Вопрос назрел такой: возможно ли отследить состояние пина, работающего на ВЫХОД?

В какой-то момент происходит digitalWrite(PUMP1_PIN, HIGH);

bool P1;

if (PUMP1_PIN == HIGH) bool P1 = 1; не работает.

вообще PUMP1_PIN == HIGH -  так можно?

 
Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Maka пишет:

Доброго времени суток всем!

Вопрос назрел такой: возможно ли отследить состояние пина, работающего на ВЫХОД?

В какой-то момент происходит digitalWrite(PUMP1_PIN, HIGH);

bool P1;

if (PUMP1_PIN == HIGH) bool P1 = 1; не работает.

вообще PUMP1_PIN == HIGH -  так можно?


Просто отследить элементарно, если у тебя есть свободные пины или мультиметр.
Можно ВЫХОД твоего пина подать на ВХОД аналогово или дискретного, и там прочитать значение.
Дискретный выдаст HIGH/LOW, аналоговый каие-то циферки.
Но можно "прочитать" и взглядом, повесив на выход твоего пина светодид (с резистором).
Как то так...

PS. Но еще лучше контролировать потребляемый ток, напор или струю PUMP_1.
Если, конечно, PUMP_1 это насос.

vk007
Offline
Зарегистрирован: 16.06.2015

Maka пишет:

В какой-то момент происходит digitalWrite(PUMP1_PIN, HIGH);

if (PUMP1_PIN == HIGH) bool P1 = 1; не работает.

вообще PUMP1_PIN == HIGH -  так можно?

Почему же не работает? Работает - условие всегда будет выполняться если работаете с не нулевым пином.

А чтобы прочесть состояние пина тогда уж лучше так:

if (digitalRead(PUMP1_PIN) == HIGH) ...

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

А зачем его читать, он же памятник выход?  Каким назначили таким и будет. Если скетч всё таки забывает, то есть совершенно секретная команда digitalRead(), она поможет установить истину :)

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

vk007 пишет:

Maka пишет:

вообще PUMP1_PIN == HIGH -  так можно?

Почему же не работает? Работает - условие всегда будет выполняться если работаете с не нулевым пином.

Да, ладно! Пошутил?

Не стоит так шутить с начинающими - они ж скорее всего не поймут шутки и воспримут за истину.

Maka
Offline
Зарегистрирован: 24.10.2015

Олег М. пишет:

Maka пишет:

Доброго времени суток всем!

Вопрос назрел такой: возможно ли отследить состояние пина, работающего на ВЫХОД?

В какой-то момент происходит digitalWrite(PUMP1_PIN, HIGH);

bool P1;

if (PUMP1_PIN == HIGH) bool P1 = 1; не работает.

вообще PUMP1_PIN == HIGH -  так можно?


Просто отследить элементарно, если у тебя есть свободные пины или мультиметр.
Можно ВЫХОД твоего пина подать на ВХОД аналогово или дискретного, и там прочитать значение.
Дискретный выдаст HIGH/LOW, аналоговый каие-то циферки.
Но можно "прочитать" и взглядом, повесив на выход твоего пина светодид (с резистором).
Как то так...

PS. Но еще лучше контролировать потребляемый ток, напор или струю PUMP_1.
Если, конечно, PUMP_1 это насос.

Нужно же на мониторе отобразить работу помпы.

vk007
Offline
Зарегистрирован: 16.06.2015

Блин, пока редактировал сообщение и дописывал его появились новые и все коту под хвост - "у вас нет доступа" :(((( Ну что за движок, слов нет.

Ладно, вкратце. Сделайте так:

boolean P1 = HIGH;

digitalWrite(PUMP1_PIN, P1);

P1 будет соответствовать состоянию пина (ведь по нему же его и выставляли).

Maka
Offline
Зарегистрирован: 24.10.2015

Круто! Я не знал, что digitalRead() применима к пину, работающему на выход. Спасибо, буду проверять.

 

Maka
Offline
Зарегистрирован: 24.10.2015

vk007 пишет:

Блин, пока редактировал сообщение и дописывал его появились новые и все коту под хвост - "у вас нет доступа" :(((( Ну что за движок, слов нет.

Ладно, вкратце. Сделайте так:

boolean P1 = HIGH;

digitalWrite(PUMP1_PIN, P1);

P1 будет соответствовать состоянию пина (ведь по нему же его и выставляли).

К сожалению, это просто пример, даже не кусок скетча, Управление тремя пинами происходит внутри функции, по наступлению времени && bool "вкл"

vk007
Offline
Зарегистрирован: 16.06.2015

Лучше воспользуйтесь способом из сообщения #6.

В программе, там где "В какой-то момент происходит digitalWrite(PUMP1_PIN, HIGH);" сначала присваиваете переменной (если она в функции, то сделайте ее глобальной) нужное значение - HIGH или LOW, а потом выставляете пин в состояние, соответствующее значению этой переменной. И лишний раз пины читать на надо будет, а только проверять переменную.

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Maka пишет:
Нужно же на мониторе отобразить работу помпы.

Работу помпы можно контролировать кучей способов:

- потребляемым током;
- напором насоса (давлением на выходе);
- расходом насоса;
- оборотами колеса насоса.
Если измерять какие-то из этих параметров и отображать на мониторе- мне кажется, будет достаточно.

Я планирую установить реле протока на насосе и на выходе из бака.
Ну и светодиоды еще от них запитать.

Как то так...

Maka
Offline
Зарегистрирован: 24.10.2015
unsigned long PumpMillis;

void PumpTimer(byte pin, unsigned long PumpDur, bool act)
{
  if (UTime == PumpStart && act)
  {
    PumpMillis = millis();
    digitalWrite(pin, HIGH);
  }
  if (millis() >= PumpMillis + PumpDur)
    {
      digitalWrite(pin, LOW);
    }
}

void loop(){
  PumpTimer(PUMP1_PIN, Pump1Dur, Pump[0].act);
  PumpTimer(PUMP2_PIN, Pump2Dur, Pump[1].act);
  PumpTimer(PUMP3_PIN, Pump3Dur, Pump[2].act);
}

 

Нужно индицировать состояние каждой помпы (вкл\выкл)
Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Maka пишет:

unsigned long PumpMillis;

void PumpTimer(byte pin, unsigned long PumpDur, bool act)
{
  if (UTime == PumpStart && act)
  {
    PumpMillis = millis();
    digitalWrite(pin, HIGH);
  }
  if (millis() >= PumpMillis + PumpDur)
    {
      digitalWrite(pin, LOW);
    }
}

void loop(){
  PumpTimer(PUMP1_PIN, Pump1Dur, Pump[0].act);
  PumpTimer(PUMP2_PIN, Pump2Dur, Pump[1].act);
  PumpTimer(PUMP3_PIN, Pump3Dur, Pump[2].act);
}

 

Нужно индицировать состояние каждой помпы (вкл\выкл)


Я себе сразу добавил две переменные для учета времени в МИНУТАХ

// Constants won't change :
unsigned int maxOnPump     = 20 ;  // максимальная паспортная непрерывная длительность работы насоса в минутах
unsigned int minOffCooling = 30 ;  // минимальная паспортная длительность остывания насоса в минутах

Как то так...

Maka
Offline
Зарегистрирован: 24.10.2015

Это дозатор жидких удобрений, по прикидкам время работы будет 2 - 5 сек\сутки