Мультиплексор cd74hc4067

Тема в разделе "Arduino & Shields", создана пользователем REm, 28 июн 2024 в 22:24.

  1. REm

    REm Гик

    Вроде бы несложная микросхема, и цикл работы понятен. Только вот, когда понадобилось использовать её, то ряд вопросов возник.
    Не выходит спрятать алгоритм в отдельный цикл без delay
    Не выходит считывать каждый адрес и значение для использования в связки с реле. (допустим, 1,2 адрес и их значения)
    Пример позволяет только в монитор значение закидывать.
    Кто-то делал нечто похожее?

    Код (C++):
    #
    define EN 3
    #define S0 4
    #define S1 5
    #define S2 6
    #define S3 7
    #define SIG A0


    void setup(){
      Serial.begin(9600);
     
      pinMode(S0, OUTPUT);
      pinMode(S1, OUTPUT);
      pinMode(S2, OUTPUT);
      pinMode(S3, OUTPUT);  

      digitalWrite(S0, LOW);
      digitalWrite(S1, LOW);
      digitalWrite(S2, LOW);
      digitalWrite(S3, LOW);

      pinMode(EN, OUTPUT);
      digitalWrite(EN, LOW);

     
    }


    void loop(){

      //Loop through and read all 16 values
      //Reports back Value at channel 6 is: 346
      for(int i = 0; i < 16; i ++){
    //    Serial.print("Value at channel ");
    //    Serial.print(i);
    //    Serial.print(": ");
        Serial.print(readMux(i));
        Serial.print(". ");
       
      }
      Serial.println();
      delay(100);
    }


    int readMux(int channel){
      int controlPin[] = {S0, S1, S2, S3};

      int muxChannel[16][4]={
        {0,0,0,0}, //channel 0
        {1,0,0,0}, //channel 1
        {0,1,0,0}, //channel 2
        {1,1,0,0}, //channel 3
        {0,0,1,0}, //channel 4
        {1,0,1,0}, //channel 5
        {0,1,1,0}, //channel 6
        {1,1,1,0}, //channel 7
        {0,0,0,1}, //channel 8
        {1,0,0,1}, //channel 9
        {0,1,0,1}, //channel 10
        {1,1,0,1}, //channel 11
        {0,0,1,1}, //channel 12
        {1,0,1,1}, //channel 13
        {0,1,1,1}, //channel 14
        {1,1,1,1}  //channel 15
      };

      //loop through the 4 sig
      for(int i = 0; i < 4; i ++){
        digitalWrite(controlPin[i], muxChannel[channel][i]);
      }

      //read the value at the SIG pin
      int val = analogRead(SIG);

      //return the value
      return val;
    }
     
     
  2. a1000

    a1000 Гуру

    А что тут непонятного? В приведенном вами примере есть готовая функция readMux для работы с мультиплексором. Скармливайте ей номер канала, а она вернёт вам значение.
     
  3. ostrov

    ostrov Гуру

    Создавайте функцию с входом по таймеру, а ссылку на нее в луп. Так же можно делать вообще для всего, что должно выполняться в какие-то промежутки времени, при этом не останавливая остальную работу.

    Пример:
    Код (C++):
    void setup() {}

    void loop() {
      timeFoo();
    }

    void timeFoo() {
      static unsigned long timer = 0;
      if (timer + 250 > millis()) return;  // тут время, в примере 250 мс
      // тут сама функция
      timer = millis();
    }
     

    И зачем массив состояний пинов? Адрес это биты в полубайте, в вашем случае перевернутом. Не надо никаких библиотек, которые не пойми как работают. Освойте битовые операции, пригодятся еще миллион раз.
     
  4. ИгорьК

    ИгорьК Гуру

    Код (C++):
    if (timer + 250 > millis()) return;  // тут время, в примере 250 мс
    Кажись время проверять надо не так, или я давно ардуину не включал...