Virtual analog ports
Virtual analogue ports
Create virtual analogue ports for multiple analogue sensor outputs into a single physical analogue input on your microcontroller.
If you don't have enough analogue ports on your microcontroller to read all sensor data we can utilize some unused digital pins to create virtualized analogue pins.
Scenario
In this document we will be using a Wemos D1 mini pro. The same principles apply to any micro-controller.
Read multiple analogue sensors with just a single analogue input.
Setup the code
First, we need to set up our pins. In the example given we use D1 and D5 as our sensor voltage pins and A0 for our analogue input pin
const int amountOfSensors = 2; const int sensors[amountOfSensors] = { D1, D5 }; const int input = A0;
Next, we will set up all the pins to make sure we have our input/outputs correct
void setup() { // Set all sensors as output // We want to control if we OUTPUT 5v to the sensor or not for (byte i = 0; i < amountOfSensors; i++) { pinMode(sensors[i], OUTPUT); } // Make sure we have and analog INPUT pinMode(input, INPUT); // Begin the serial so we can read from the serial monitor Serial.begin(9600); }
In order to validate if we get the correct output, we can define a PrintInput
method
void PrintInput() { Serial.print("Value: "); Serial.println(analogRead(input)); }
In order to switch the sensor, we would like to read from we can define a ToggleInput
method
void ToggleInput(int newActiveSensor) { // Turn off all sensors for (byte i = 0; i < amountOfSensors; i++) { digitalWrite(sensors[i], LOW); } // Turn on the requested sensor digitalWrite(newActiveSensor, HIGH); // Wait 100ms to make sure the sensor is active delay(100); Serial.print("Activated Sensor: "); Serial.print(newActiveSensor + ". "); }
To put it all together we can define our main Loop
method
void loop() { // Turn on sensor 1 and print the output ToggleInput(sensors[0]); PrintInput(); // Turn on sensor 2 and print the output ToggleInput(sensors[1]); PrintInput(); delay(1000 * 2); }
Electrical schema
Make sure the white rings on the capacitor are facing away from the sensor and towards the micro-controller.
The locations of the digital and analogue pins may differ from micro-controller to micro-controller.
Components
- 2x capacitor
- 2x analog sensor
- 1x micro-controller with at least 1 analog input
- 10x male-male jumper cables
- 1x breadboard
- 1x micro-controller
- 1x usb data cable
Connect everything
Below you will see a protoboard where we have connected all the necessary wires to the Arduino.
In order to connect the sensors we need to connect the Sensor 1 GND
to the ground, the Sensor 1 5V (D1)
to the power and the Sensor 1 signal
to the signal output of the first sensor. Repeat the process for sensor 2.
Running the program
After uploading all the code (in a single file) to the Arduino and connecting both sensors we should see a similar output given by the Arduino in the Serial monitor.