赞
踩
模拟引脚用于测量传感器值。与仅提供开/关状态的数字引脚相比,它可以记录广泛的值。按照传统方法,微控制器测量的每个模拟输入引脚只允许连接一个传感器并进行测量。如果您需要测量两个传感器的值(例如温度和阳光强度),则需要占用微控制器上的 2 个模拟输入引脚。
NodeMCU是一款非常著名的内置WiFi模块的微控制器板。它不仅是一款经济实惠的微控制器,而且还可以做很多事情,特别是对于物联网(IOT)应用。两种最常见的物联网应用是智能家居自动化,例如通过远程执行和监控按钮控制负载。物联网也因实时传感器值在线显示而闻名,同时将数据记录在网络服务器上的历史值,我们可以随时访问这些数据。
然而,NodeMCU 板的最大缺点是它只有一个模拟引脚。换句话说,它只能从 1 个传感器进行测量。如果我们的项目需要多个传感器,我们将需要找到另一个具有更多模拟引脚的微控制器,例如 Arduino UNO 或 MEGA。但这些主板通常不包含内置 WiFi 模块,可能需要额外的接线和 WiFi 模块。
今天我们将使用另一种方法,即使用称为模拟多路复用器模块的扩展板。它是一个微芯片,需要 2 至 4 个数字引脚和 1 个模拟引脚来转换多达 16 个模拟引脚。一开始听起来可能很复杂,但是一旦我们知道它是如何工作的,应用起来就会很容易。
16通道模拟多路复用器模块CD74HC4067
该模块是一个扩展板,允许微控制器有更多的模拟引脚用于传感器测量。这对于 NodeMCU 来说非常重要,因为它只有一个模拟引脚。
多路复用器模块是一种微芯片,需要1 个模拟引脚和 2 至 4 个数字引脚,以允许微控制器监控更多模拟引脚以获取传感器读数。1 个模拟引脚的要求实际上是所有扩展模拟引脚共享的输出引脚。该模块每次只允许 1 个模拟通道或传感器值连接到输出模拟引脚,因此它们轮流运行。
为了确定要打开哪个模拟通道,NodeMCU 等微控制器需要通过数字引脚向模块发送二进制命令(开/关或高/低的组合),以便允许选择要激活的通道在特定时间。二进制命令由高/低电压操作,每个模拟通道都有自己独特的二进制组合。例如,下面是一个 16 通道模拟多路复用器及其二进制命令:
例如,如果我们想要测量通道 C15,我们可以将 4 个数字引脚高 (5V) 输出编程到多路复用器。实际上,我们对 NodeMCU 进行编程,以轮换输出命令,同时使用相同的模拟输入 A0 测量每个通道输出。整个过程发生得非常快,我们可以从模块获取所有 16 个通道的读数。
在将代码上传到 NodeMCU 之前,如果这是 您第一次使用 NodeMCU,您需要添加 ESP8266 支持文件 并将 NodeMCU 板库添加 到 IDE 软件中。要添加 ESP8266 支持文件,请打开 Arduino IDE 软件,转至 files>preferences>Additional Boards Manager URLs, 将此链接 http://arduino.esp8266.com/stable/package_esp8266com_index.json 粘贴到黑色空间,然后单击 OK。
完成此步骤后,进入 工具 > 开发板 > 开发板管理器并通过 ESP8266 社区下载 ESP8266 库
完成后,您可以开始下载下面的 .ino 代码文件并上传到 NodeMCU 板。
- /* 0- General */
-
- #define S0 D0 /* Assign Multiplexer pin S0 connect to pin D0 of NodeMCU */
- #define S1 D1 /* Assign Multiplexer pin S1 connect to pin D1 of NodeMCU */
- #define S2 D2 /* Assign Multiplexer pin S2 connect to pin D2 of NodeMCU */
- #define S3 D3 /* Assign Multiplexer pin S3 connect to pin D3 of NodeMCU */
- #define SIG A0 /* Assign SIG pin as Analog output for all 16 channels of Multiplexer to pin A0 of NodeMCU */
-
- int decimal = 2; // Decimal places of the sensor value outputs
- int sensor0; /* Assign the name "sensor0" as analog output value from Channel C0 */
- int sensor1; /* Assign the name "sensor1" as analog output value from Channel C1 */
- int sensor2; /* Assign the name "sensor2" as analog output value from Channel C2 */
- int sensor3; /* Assign the name "sensor3" as analog output value from Channel C3 */
- int sensor4; /* Assign the name "sensor4" as analog output value from Channel C4 */
- int sensor5; /* Assign the name "sensor5" as analog output value from Channel C5 */
- int sensor6; /* Assign the name "sensor6" as analog output value from Channel C6 */
- int sensor7; /* Assign the name "sensor7" as analog output value from Channel C7 */
- int sensor8; /* Assign the name "sensor8" as analog output value from Channel C8 */
- int sensor9; /* Assign the name "sensor9" as analog output value from Channel C9 */
- int sensor10; /* Assign the name "sensor10" as analog output value from Channel C10 */
- int sensor11; /* Assign the name "sensor11" as analog output value from Channel C11 */
- int sensor12; /* Assign the name "sensor12" as analog output value from Channel C12 */
- int sensor13; /* Assign the name "sensor13" as analog output value from Channel C13 */
- int sensor14; /* Assign the name "sensor14" as analog output value from Channel C14 */
- int sensor15; /* Assign the name "sensor15" as analog output value from Channel C15 */
-
-
- void setup() { /* Put your codes here to run only once during micro controller startup */
-
- /* 0- General */
-
- pinMode(S0,OUTPUT); /* Define digital signal pin as output to the Multiplexer pin SO */
- pinMode(S1,OUTPUT); /* Define digital signal pin as output to the Multiplexer pin S1 */
- pinMode(S2,OUTPUT); /* Define digital signal pin as output to the Multiplexer pin S2 */
- pinMode(S3,OUTPUT); /* Define digital signal pin as output to the Multiplexer pin S3 */
- pinMode(SIG, INPUT); /* Define analog signal pin as input or receiver from the Multiplexer pin SIG */
-
- Serial.begin(9600); /* to display readings in Serial Monitor at 9600 baud rates */
-
- }
-
- void loop() { /* Put your codes here to run over and over again endlessly */
-
- /* 0- General */
-
- // Channel 0 (C0 pin - binary output 0,0,0,0)
- digitalWrite(S0,LOW);
- digitalWrite(S1,LOW);
- digitalWrite(S2,LOW);
- digitalWrite(S3,LOW);
- sensor0 = analogRead(SIG);
-
- // Channel 1 (C1 pin - binary output 1,0,0,0)
- digitalWrite(S0,HIGH);
- digitalWrite(S1,LOW);
- digitalWrite(S2,LOW);
- digitalWrite(S3,LOW);
- sensor1 = analogRead(SIG);
-
- // Channel 2 (C2 pin - binary output 0,1,0,0)
- digitalWrite(S0,LOW);
- digitalWrite(S1,HIGH);
- digitalWrite(S2,LOW);
- digitalWrite(S3,LOW);
- sensor2 = analogRead(SIG);
-
- // Channel 3 (C3 pin - binary output 1,1,0,0)
- digitalWrite(S0,HIGH);
- digitalWrite(S1,HIGH);
- digitalWrite(S2,LOW);
- digitalWrite(S3,LOW);
- sensor3 = analogRead(SIG);
-
- // Channel 4 (C4 pin - binary output 0,0,1,0)
- digitalWrite(S0,LOW); digitalWrite(S1,LOW); digitalWrite(S2,HIGH); digitalWrite(S3,LOW);
- sensor4 = analogRead(SIG);
-
- // Channel 5 (C5 pin - binary output 1,0,1,0)
- digitalWrite(S0,HIGH); digitalWrite(S1,LOW); digitalWrite(S2,HIGH); digitalWrite(S3,LOW);
- sensor5 = analogRead(SIG);
-
- // Channel 6 (C6 pin - binary output 0,1,1,0)
- digitalWrite(S0,LOW); digitalWrite(S1,HIGH); digitalWrite(S2,HIGH); digitalWrite(S3,LOW);
- sensor6 = analogRead(SIG);
-
- // Channel 7 (C7 pin - binary output 1,1,1,0)
- digitalWrite(S0,HIGH); digitalWrite(S1,HIGH); digitalWrite(S2,HIGH); digitalWrite(S3,LOW);
- sensor7 = analogRead(SIG);
-
- // Channel 8 (C8 pin - binary output 0,0,0,1)
- digitalWrite(S0,LOW); digitalWrite(S1,LOW); digitalWrite(S2,LOW); digitalWrite(S3,HIGH);
- sensor8 = analogRead(SIG);
-
- // Channel 9 (C9 pin - binary output 1,0,0,1)
- digitalWrite(S0,HIGH); digitalWrite(S1,LOW); digitalWrite(S2,LOW); digitalWrite(S3,HIGH);
- sensor9 = analogRead(SIG);
-
- // Channel 10 (C10 pin - binary output 0,1,0,1)
- digitalWrite(S0,LOW); digitalWrite(S1,HIGH); digitalWrite(S2,LOW); digitalWrite(S3,HIGH);
- sensor10 = analogRead(SIG);
-
- // Channel 11 (C11 pin - binary output 1,1,0,1)
- digitalWrite(S0,HIGH); digitalWrite(S1,HIGH); digitalWrite(S2,LOW); digitalWrite(S3,HIGH);
- sensor11 = analogRead(SIG);
-
- // Channel 12 (C12 pin - binary output 0,0,1,1)
- digitalWrite(S0,LOW); digitalWrite(S1,LOW); digitalWrite(S2,HIGH); digitalWrite(S3,HIGH);
- sensor12 = analogRead(SIG);
-
- // Channel 13 (C13 pin - binary output 1,0,1,1)
- digitalWrite(S0,HIGH); digitalWrite(S1,LOW); digitalWrite(S2,HIGH); digitalWrite(S3,HIGH);
- sensor13 = analogRead(SIG);
-
- // Channel 14 (C14 pin - binary output 0,1,1,1)
- digitalWrite(S0,LOW); digitalWrite(S1,HIGH); digitalWrite(S2,HIGH); digitalWrite(S3,HIGH);
- sensor14 = analogRead(SIG);
-
- // Channel 15 (C15 pin - binary output 1,1,1,1)
- digitalWrite(S0,HIGH); digitalWrite(S1,HIGH); digitalWrite(S2,HIGH); digitalWrite(S3,HIGH);
- sensor15 = analogRead(SIG);
-
- Serial.print("Sensor 0 : ");Serial.println(sensor0); /* state value for sensor 0 */
- Serial.print("Sensor 1 : ");Serial.println(sensor1); /* state value for sensor 1 */
- Serial.print("Sensor 2 : ");Serial.println(sensor2); /* state value for sensor 2 */
- Serial.print("Sensor 3 : ");Serial.println(sensor3); /* state value for sensor 3 */
- Serial.print("Sensor 4 : ");Serial.println(sensor4); /* state value for sensor 4 */
- Serial.print("Sensor 5 : ");Serial.println(sensor5); /* state value for sensor 5 */
- Serial.print("Sensor 6 : ");Serial.println(sensor6); /* state value for sensor 6 */
- Serial.print("Sensor 7 : ");Serial.println(sensor7); /* state value for sensor 7 */
- Serial.print("Sensor 8 : ");Serial.println(sensor8); /* state value for sensor 8 */
- Serial.print("Sensor 9 : ");Serial.println(sensor9); /* state value for sensor 9 */
- Serial.print("Sensor 10 : ");Serial.println(sensor10); /* state value for sensor 10 */
- Serial.print("Sensor 11 : ");Serial.println(sensor11); /* state value for sensor 11 */
- Serial.print("Sensor 12 : ");Serial.println(sensor12); /* state value for sensor 12 */
- Serial.print("Sensor 13 : ");Serial.println(sensor13); /* state value for sensor 13 */
- Serial.print("Sensor 14 : ");Serial.println(sensor14); /* state value for sensor 14 */
- Serial.print("Sensor 15 : ");Serial.println(sensor15); /* state value for sensor 15 */
-
- delay(1000); // Read the value every second
-
- }

以上程序和接线方式适用于你确实需要16个传感器的情况,如果你不需要接这么多传感器应该如何解决,如果需要接8个以内的传感器,那么就将S3接GND即可,如果需要接4个以内的传感器就将S2和S3接GND.
- int PING[]={16, 5, 4, 0};
-
- int DATA[16][4] = {
- {0, 0, 0, 0},
- {1, 0, 0, 0},
- {0, 1, 0, 0},
- {1, 1, 0, 0},
- {0, 0, 1, 0},
- {1, 0, 1, 0},
- {0, 1, 1, 0},
- {1, 1, 1, 0},
- {0, 0, 0, 1},
- {1, 0, 0, 1},
- {0, 1, 0, 1},
- {1, 1, 0, 1},
- {1, 0, 1, 1},
- {0, 1, 1, 1},
- {1, 0, 1, 1},
- {1, 1, 1, 1}
- };
-
- void setup(){
- pinMode(A0, INPUT);
- Serial.begin(9600);
- }
-
- void loop(){
- for (int j = 0; j <= 15; j = j + (1)) {
- for (int i = 0; i <= 3; i = i + (1)) {
- pinMode(PING[i], OUTPUT);
- digitalWrite(PING[i],DATA[j][i]);
- Serial.println(String("S") + String(i) + String("=") + String(analogRead(A0)));
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。