16-канальный аналоговый мультиплексор CD74HC4067

Аналоговый цифровой преобразователь позволяет преобразовывать аналоговый мир в цифровой. Все сигналы, обнаруженные и обработанные человеком, являются аналоговыми сигналами


Платы Arduino обычно имеют встроенный цифровой аналоговый преобразователь далее (АЦП), но здесь мы имеем больше функций и больше разрешение. Например, у Arduino UNO есть 6 10-битных АЦП, но здесь мы имеем 16-битное разрешение.
При использовании внешнего АЦП мы освобождаем процессор.
У ESP8266 есть только 1 10-разрядный АЦП, который измеряет в диапазоне 0 В и 1 В. Это делает преобразование зависимым от сопротивлений, которые используются для делителя напряжения. Используя внешний АЦП, мы получим большую точность и качество преобразования.


Связь между внешним АЦП и Arduino или ESP8266 осуществляется через I2C.


Управляющие входы модуля S0-S3 подключаем на любые свободные выходы arduino.
Вход ЕN модуля соединяем с массой или подключаем на выход arduino чтобы иметь возможность выключать микросхему. 
SIG сигнальный вход\выход мультиплексора подключаем на аналоговый вход arduino.
Выходы датчиков подключаем  к выходам С0-С15. 

Код для Arduino


#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(){
  for(int i = 0; i < 16; i ++){
    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
  };
  for(int i = 0; i < 4; i ++){
    digitalWrite(controlPin[i], muxChannel[channel][i]);
  }
  int val = analogRead(SIG);
  return val;
}


Подробнее тут

Комментарии

Популярные сообщения из этого блога

Motor Shield L293D + Arduino

Перенос Armbian на SSD

Радиореле 220В 433МГц c кодировкой сигнала eV1527