ARDUINO программирование RS триггера

Рафа

✩✩✩✩✩✩✩
29 Апр 2021
5
0
Подскажите пожалуйста. Триггер для управления реле и др.устройствами от двух реле уровня в баке. Когда оба реле уровня замкнуты открывается клапан. При заполнении сначала размыкается нижнее реле, потом размыкается верхнее реле, тогда клапан закрывается. Сделал переменную start для использования с другими логическими входами, но почему-то выход срабатывает корректно, а переменная start на мониторе нет. При имитации замыкания верхнего датчика start сразу становиться 1, но светодиод на выходе VALVE_V1 при этом не горит (и не должен).
 

Вложения

  • 1.2 KB Просмотры: 7

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
А если так ? Вывод переменной start будет раз в 3 секунды, так же как и опрос датчиков.

C++:
uint32_t myTimer1;

#define HH_LEV 6 // HH level storage tank
#define HL_LEV 7 // HL level storage tank
#define VALVE_V1 8 // V1 valve



// ---SETUP---

void setup() {


  pinMode(HH_LEV, INPUT_PULLUP);
  pinMode(HL_LEV, INPUT_PULLUP);

  pinMode(VALVE_V1, OUTPUT); // V1 valve


  // --Output start inicialisation--

  digitalWrite (VALVE_V1, 0);


  Serial.begin (9600); // serial port initialization
}

// ---LOOP---

void loop() {
  boolean  start, rtrig1, strig1;


  // set/reset trig
  if (millis() - myTimer1 >= 3000) {   // Delay (3 с)
    myTimer1 = millis();              // Timer reset
    strig1 = !digitalRead (HL_LEV) & !digitalRead (HH_LEV); // Set trig for RO ON
    rtrig1 = digitalRead (HL_LEV) & digitalRead (HH_LEV); // Reset trig for RO OFF
 
  if (strig1 == true && rtrig1 == false) {
    start = true;
    digitalWrite (VALVE_V1, HIGH);
  }
  if (rtrig1 == true) {
    start = false;
    digitalWrite (VALVE_V1, LOW);
  }

  Serial.println (start);
}
    
}
 

Рафа

✩✩✩✩✩✩✩
29 Апр 2021
5
0
Избыточное цитирование
А если так ? Вывод переменной start будет раз в 3 секунды, так же как и опрос датчиков.

C++:
uint32_t myTimer1;

#define HH_LEV 6 // HH level storage tank
#define HL_LEV 7 // HL level storage tank
#define VALVE_V1 8 // V1 valve



// ---SETUP---

void setup() {


  pinMode(HH_LEV, INPUT_PULLUP);
  pinMode(HL_LEV, INPUT_PULLUP);

  pinMode(VALVE_V1, OUTPUT); // V1 valve


  // --Output start inicialisation--

  digitalWrite (VALVE_V1, 0);


  Serial.begin (9600); // serial port initialization
}

// ---LOOP---

void loop() {
  boolean  start, rtrig1, strig1;


  // set/reset trig
  if (millis() - myTimer1 >= 3000) {   // Delay (3 с)
    myTimer1 = millis();              // Timer reset
    strig1 = !digitalRead (HL_LEV) & !digitalRead (HH_LEV); // Set trig for RO ON
    rtrig1 = digitalRead (HL_LEV) & digitalRead (HH_LEV); // Reset trig for RO OFF

  if (strig1 == true && rtrig1 == false) {
    start = true;
    digitalWrite (VALVE_V1, HIGH);
  }
  if (rtrig1 == true) {
    start = false;
    digitalWrite (VALVE_V1, LOW);
  }

  Serial.println (start);
}
   
}

Спасибо. Но результат тот же. Почему-то светодиод на выходе загорается правильно, когда обратно закоммутированы оба входа 6 и 7, а вот переменная start на мониторе выдаёт значение 1 при подключении одного входа 6. Хотя по программе они должны вести себя одинаково.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Возможно для вот этого условия:
C++:
if (strig1 == true && rtrig1 == false) {
    start = true;
    digitalWrite (VALVE_V1, HIGH);
  }
надо сделать вариант в противном случае:
C++:
if (strig1 == true && rtrig1 == false) {
    start = true;
    digitalWrite (VALVE_V1, HIGH);
  }
else
{
    start = false;
    digitalWrite (VALVE_V1, LOW);
}
В текущих условиях есть неопределенность когда strig1 == false && rtrig1 == false
 

Рафа

✩✩✩✩✩✩✩
29 Апр 2021
5
0
Пришлось сделать через битики. Иначе переменная true/false не держит.

Код:
byte myFlags = 0; // все флаги в false

uint32_t myTimer1;

#define HH_LEV 6 // HH level storage tank
#define HL_LEV 7 // HL level storage tank
#define VALVE_V1 8 // V1 valve

#define STRIG1 0 // set trigger
#define RTRIG1 1 // reset trigger
#define FLAG3 2 // 
#define FLAG4 3
#define FLAG5 4
#define START 5 // START
#define FLAG7 6 // FLAG6 HH_LEV
#define FLAG8 7 // FLAG7 HL_LEV


// ---SETUP---

void setup() {


  pinMode(HH_LEV, INPUT_PULLUP);
  pinMode(HL_LEV, INPUT_PULLUP);

  pinMode(VALVE_V1, OUTPUT); // V1 valve


  // --Output start inicialisation--

  digitalWrite (VALVE_V1, 0);

  Serial.begin (9600); // serial port initialization
}

// ---LOOP---

void loop() {
   

  // set/reset trig
  if (millis() - myTimer1 >= 3000) {   // Delay (3 с)
    myTimer1 = millis();              // Timer reset

    bitWrite (myFlags, STRIG1, !digitalRead (HL_LEV) && !digitalRead (HH_LEV)); // set bit in myFlafs
    bitWrite (myFlags, RTRIG1, digitalRead (HL_LEV) && digitalRead (HH_LEV)); // set bit in myFLAGS
 
   if (bitRead(myFlags, STRIG1) == true && bitRead (myFlags, RTRIG1) == false) {

      bitSet (myFlags, START);
  }
  
   if (bitRead (myFlags, RTRIG1) == true) {
      bitClear (myFlags, START);
   }


  Serial.println (myFlags, BIN);
}

}
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Пришлось сделать через битики. Иначе переменная true/false не держит.
вообще, если делать "через битики". то логичнее сравнивать с 0 и 1, а не тру/фалс
C++:
   if (bitRead(myFlags, STRIG1) == 1 && bitRead (myFlags, RTRIG1) == 0)
хотя для Мк это одно и тоже
 

Рафа

✩✩✩✩✩✩✩
29 Апр 2021
5
0
@Рафа, там микроконтроллеру вообще нечего делать, есть реле с таймером
Это просто часть программы которую я хочу сделать. Думал переменная bool будет запускать часть кода (режим установки), при её изменении установка уходит в режим ожидания ещё через один режим. Я только начал изучать этот конструктор, наткнулся на эту мелочь. Для меня до конца всё же не понятно, почему переменная bool и DO ведут себя по разному при абсолютно идентичном присваивании. bool = FALSE, DO = LOW. И DO остаётся в LOW, а bool на мониторе становится 1 при изменении одного DI. Если пишу в бит этого не происходит.
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
почему переменная bool и DO ведут себя по разному при абсолютно идентичном присваивании. bool = FALSE, DO = LOW
простите, у вас правда переменная так называется - bool ? или это вы просто так написали?
А вообще, обсуждать что-то без кода бессмысленно
 

Рафа

✩✩✩✩✩✩✩
29 Апр 2021
5
0
простите, у вас правда переменная так называется - bool ? или это вы просто так написали?
А вообще, обсуждать что-то без кода бессмысленно
Это тип переменной. В самом верху обсуждения приаттачен файл.