#include <Arduino.h>
#include <cfloat> // Include this to use FLT_MAX
// Define the multiplexer control pins
#define S0 32
#define S1 33
#define S2 25
#define S3 26
// Define the multiplexer SIG pin connected to the ADC
#define SIG_PIN 34
// Reference resistors array (values in ohms)
const float referenceResistors[16] = {100, 220, 330, 470, 560, 680, 820, 1000, 1200, 1500, 1800, 2200, 2700, 3300, 3900, 4700};
// Function to set the multiplexer channel
void setMuxChannel(byte channel) {
digitalWrite(S0, channel & 0x01);
digitalWrite(S1, (channel >> 1) & 0x01);
digitalWrite(S2, (channel >> 2) & 0x01);
digitalWrite(S3, (channel >> 3) & 0x01);
}
void setup() {
// Initialize serial communication
Serial.begin(115200);
// Set multiplexer control pins as output
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Set the ADC pin
pinMode(SIG_PIN, INPUT);
// Ensure the multiplexer is enabled by connecting EN to GND
// Assuming EN is connected to GND directly
// Set all multiplexer channels to low initially
setMuxChannel(0);
}
void loop() {
float measuredVoltage;
float unknownResistance;
float closestReference = referenceResistors[0];
float minDifference = FLT_MAX;
// Loop through all reference resistors
for (byte i = 0; i < 16; i++) {
setMuxChannel(i);
delay(50); // Allow time for the multiplexer to switch
// Read the voltage from the ADC
int adcValue = analogRead(SIG_PIN);
measuredVoltage = (adcValue / 4095.0) * 3.3; // Assuming a 3.3V ADC reference voltage
// Calculate the resistance
if (measuredVoltage != 0) {
unknownResistance = referenceResistors[i] * ((3.3 / measuredVoltage) - 1);
} else {
unknownResistance = FLT_MAX; // Avoid division by zero
}
// Debug prints to troubleshoot
Serial.print("Channel: ");
Serial.print(i);
Serial.print(" (S0=");
Serial.print(digitalRead(S0));
Serial.print(", S1=");
Serial.print(digitalRead(S1));
Serial.print(", S2=");
Serial.print(digitalRead(S2));
Serial.print(", S3=");
Serial.print(digitalRead(S3));
Serial.print("), Ref Resistor: ");
Serial.print(referenceResistors[i]);
Serial.print(", ADC Value: ");
Serial.print(adcValue);
Serial.print(", Measured Voltage: ");
Serial.print(measuredVoltage);
Serial.print(", Calculated Resistance: ");
Serial.println(unknownResistance);
// Find the closest reference resistor
float difference = fabs(unknownResistance - referenceResistors[i]);
if (difference < minDifference) {
minDifference = difference;
closestReference = referenceResistors[i];
}
}
// Print the closest reference resistor value
Serial.print("Closest Reference Resistor: ");
Serial.print(closestReference);
Serial.print(" Ohms, Min Difference: ");
Serial.print(minDifference);
Serial.print(" Ohms, Calculated Resistance: ");
Serial.print(unknownResistance);
Serial.println(" Ohms");
delay(1000); // Delay for readability
}
Loading
cd74hc4067
cd74hc4067