Можно ли опросить сенсоры и включать реле через один multiplexer ?

mitiya
Offline
Зарегистрирован: 27.03.2013

Пытаюсь сделать автоматическую поливалку )))

На 8 каналов. То есть у меня есть модуль реле на 8 реле, и 8 датчиков влажности почвы. И 1 мультиплексер на 16 каналов (74HC4067) . Я то думал. Буду опрашивать (8-15) каналы в цикле. Найду канал на котором сработал датчик, переключу режим пина в OUTPUT поставлю HIGH и переключу мултиплексер на один из каналов (0-7). Включу нужное рэле. Подожду. Выключу. Переведу пин в INPUT. И продолжу опрос. Но после при опросе натыкаюсь на датчик, начинается какая-то ерунда. Дальше начинает все срабатывать.

int pin_Out_S0 = 2;
int pin_Out_S1 = 3;
int pin_Out_S2 = 4;
int pin_Out_S3 = 5;

int reley[] = {0b0000, 0b0001, 0b0010, 0b0011, 0b0100, 0b0101, 0b0110, 0b0111};
int sensor[] = {0b1000, 0b1001, 0b1010, 0b1011, 0b1100, 0b1101, 0b1110, 0b1111};

int SIG = 12;
int REL = 11;


void setup() {
  Serial.begin(9600);
  Serial.println("Hello Computer");


  pinMode(pin_Out_S0, OUTPUT);
  pinMode(pin_Out_S1, OUTPUT);
  pinMode(pin_Out_S2, OUTPUT);
  pinMode(pin_Out_S3, OUTPUT);
  pinMode(SIG, INPUT);
  pinMode(REL, OUTPUT);

}

void loop() {
  for (int i = 0; i <= 7; i++) {

    int sensor = SensorSel(i);

    Serial.println(sensor);



    if (sensor == 0) {
      RelaySel(i);
      Serial.println("if");

    }
    delay(500);
  }
}

void RelaySel(int N) {
  digitalWrite(REL, HIGH);
  digitalWrite(pin_Out_S0, bitRead(reley[N], 0));
  digitalWrite(pin_Out_S1, bitRead(reley[N], 1));
  digitalWrite(pin_Out_S2, bitRead(reley[N], 2));
  digitalWrite(pin_Out_S3, bitRead(reley[N], 3));
  delay(500);
  digitalWrite(SIG, LOW);
}

int SensorSel(int N) {
  pinMode(SIG, INPUT);
  digitalWrite(pin_Out_S0, bitRead(sensor[N], 0));
  digitalWrite(pin_Out_S1, bitRead(sensor[N], 1));
  digitalWrite(pin_Out_S2, bitRead(sensor[N], 2));
  digitalWrite(pin_Out_S3, bitRead(sensor[N], 3));
  int out = digitalRead(SIG);
  return out;
}

 

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

74HC4067 не регистр. Это только переключатель.Да можно с помощью него вкл реле, но только 1 и больше другие реле не получится включить и не получится опросить другие датчики. 

ПС: на вопрос темы - нет , нельзя.

T.Rook
Offline
Зарегистрирован: 05.03.2016

mitiya пишет:

Пытаюсь сделать автоматическую поливалку )))

На 8 каналов. То есть у меня есть модуль реле на 8 реле, и 8 датчиков влажности почвы. И 1 мультиплексер на 16 каналов (74HC4067) . Я то думал. Буду опрашивать (8-15) каналы в цикле. Найду канал на котором сработал датчик, переключу режим пина в OUTPUT поставлю HIGH и переключу мултиплексер на один из каналов (0-7). Включу нужное рэле. Подожду. Выключу. Переведу пин в INPUT. И продолжу опрос. Но после при опросе натыкаюсь на датчик, начинается какая-то ерунда. Дальше начинает все срабатывать.


int SIG = 12;
int REL = 11;

****


void RelaySel(int N) {
  digitalWrite(REL, HIGH);
  digitalWrite(pin_Out_S0, bitRead(reley[N], 0));
  digitalWrite(pin_Out_S1, bitRead(reley[N], 1));
  digitalWrite(pin_Out_S2, bitRead(reley[N], 2));
  digitalWrite(pin_Out_S3, bitRead(reley[N], 3));
  delay(500);
  digitalWrite(SIG, LOW);
}

Так то оно так, только почему в коде включается REL:

void RelaySel(int N) {
  digitalWrite(REL, HIGH);

а выключается SIG:

  delay(500);
  digitalWrite(SIG, LOW);
}

??

mitiya
Offline
Зарегистрирован: 27.03.2013

Так то оно так, только почему в коде включается REL:

а выключается SIG:

Опачки )))

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

mitiya
Offline
Зарегистрирован: 27.03.2013

На самом деле я походу сюда не совсем тот код скопировал. Вот код , вроде без ошибок, а не работает. В моем случае, сейчас, датчик подключён на 12пин мультиплексора, это вроде как должно бы означать что при переборе он не должен щелкнуть 4м реле. Но после того как он доходит до 4го, она и следующими не щелкает, причем аж до 0го, то есть до аж включая начало следующего цикла. 

int pin_Out_S0 = 2;
int pin_Out_S1 = 3;
int pin_Out_S2 = 4;
int pin_Out_S3 = 5;

int reley[] = {0b0000, 0b0001, 0b0010, 0b0011, 0b0100, 0b0101, 0b0110, 0b0111};
int sensor[] = {0b1000, 0b1001, 0b1010, 0b1011, 0b1100, 0b1101, 0b1110, 0b1111};

int SIG = 12;


void setup() {
  Serial.begin(9600);
  Serial.println("Hello Computer");


  pinMode(pin_Out_S0, OUTPUT);
  pinMode(pin_Out_S1, OUTPUT);
  pinMode(pin_Out_S2, OUTPUT);
  pinMode(pin_Out_S3, OUTPUT);

}

void loop() {
  for (int i = 0; i <= 7; i++) {

    int sensor = SensorSel(i);

    Serial.println(sensor);



    if (sensor == 0) {
      RelaySel(i);
      Serial.println("if");

    }
    delay(500);
  }
}

void RelaySel(int N) {
  digitalWrite(SIG, HIGH);
  digitalWrite(pin_Out_S0, bitRead(reley[N], 0));
  digitalWrite(pin_Out_S1, bitRead(reley[N], 1));
  digitalWrite(pin_Out_S2, bitRead(reley[N], 2));
  digitalWrite(pin_Out_S3, bitRead(reley[N], 3));
  delay(500);
  digitalWrite(SIG, LOW);
}

int SensorSel(int N) {
  pinMode(SIG, INPUT);
  digitalWrite(pin_Out_S0, bitRead(sensor[N], 0));
  digitalWrite(pin_Out_S1, bitRead(sensor[N], 1));
  digitalWrite(pin_Out_S2, bitRead(sensor[N], 2));
  digitalWrite(pin_Out_S3, bitRead(sensor[N], 3));
  int out = digitalRead(SIG);
  return out;
}