Skip to content

Instantly share code, notes, and snippets.

@Anas-jaf
Last active April 1, 2026 20:33
Show Gist options
  • Select an option

  • Save Anas-jaf/0bb5316f48e5dbcd5609be421b1f5b0f to your computer and use it in GitHub Desktop.

Select an option

Save Anas-jaf/0bb5316f48e5dbcd5609be421b1f5b0f to your computer and use it in GitHub Desktop.
// QTR-RC 8 sensors through CD74HC4067
// Using channels C1 to C8
// Arduino -> MUX
// D2 --> S0
// D3 --> S1
// D4 --> S2
// D5 --> S3
// A0 --> SIG
#define SENSOR_COUNT 8
#define MUX_S0 2
#define MUX_S1 3
#define MUX_S2 4
#define MUX_S3 5
#define MUX_SIG A0
const uint8_t sensorChannels[SENSOR_COUNT] = {1, 2, 3, 4, 5, 6, 7, 8};
uint16_t sensorValues[SENSOR_COUNT];
const uint16_t TIMEOUT_US = 3000;
void selectMuxChannel(uint8_t channel) {
digitalWrite(MUX_S0, channel & 0x01);
digitalWrite(MUX_S1, (channel >> 1) & 0x01);
digitalWrite(MUX_S2, (channel >> 2) & 0x01);
digitalWrite(MUX_S3, (channel >> 3) & 0x01);
}
uint16_t readQTRRC(uint8_t channel) {
selectMuxChannel(channel);
pinMode(MUX_SIG, OUTPUT);
digitalWrite(MUX_SIG, HIGH);
delayMicroseconds(10);
pinMode(MUX_SIG, INPUT);
unsigned long startTime = micros();
while (digitalRead(MUX_SIG) == HIGH) {
if ((micros() - startTime) >= TIMEOUT_US) {
return TIMEOUT_US;
}
}
return (uint16_t)(micros() - startTime);
}
void readAllSensors() {
for (int i = 0; i < SENSOR_COUNT; i++) {
sensorValues[i] = readQTRRC(sensorChannels[i]);
}
}
void setup() {
Serial.begin(115200);
pinMode(MUX_S0, OUTPUT);
pinMode(MUX_S1, OUTPUT);
pinMode(MUX_S2, OUTPUT);
pinMode(MUX_S3, OUTPUT);
Serial.println("QTR-8RC via CD74HC4067");
Serial.println("Channels: C1 to C8");
Serial.println("RAW timing values + auto threshold + digital output");
}
void loop() {
readAllSensors();
uint16_t mn = 65535, mx = 0;
for (int i = 0; i < SENSOR_COUNT; i++) {
if (sensorValues[i] < mn) mn = sensorValues[i];
if (sensorValues[i] > mx) mx = sensorValues[i];
}
uint16_t thr = (mn + mx) / 2;
if ((mx - mn) < 300) {
thr = 1000;
}
Serial.print("RAW: ");
for (int i = 0; i < SENSOR_COUNT; i++) {
Serial.print(sensorValues[i]);
Serial.print('\t');
}
Serial.print(" | mn=");
Serial.print(mn);
Serial.print(" mx=");
Serial.print(mx);
Serial.print(" thr=");
Serial.print(thr);
Serial.print(" | DIG: ");
for (int i = 0; i < SENSOR_COUNT; i++) {
Serial.print(sensorValues[i] > thr ? '1' : '0');
}
Serial.println();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment