Last active
April 1, 2026 20:33
-
-
Save Anas-jaf/0bb5316f48e5dbcd5609be421b1f5b0f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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