// Informatzah by Ido Gendel, 2014 // Use freely, at your own risk. #include // LDRs are addressed via a 3-bit analog multiplexer // e.g. CD74HC4051E #define LDR_ADDR0_PIN A3 #define LDR_ADDR1_PIN A4 #define LDR_ADDR2_PIN A5 #define SENSOR_PIN A1 // Active LDRs - up to 8 #define LDRS 6 const byte MAX_READING = (1 << LDRS) - 1; // Baseline is the fully lit condition long int LDRBaseline[LDRS]; byte currReading, stableReading, index, zeroExpected; LiquidCrystal lcd(8,9,4,5,6,7); //--------------------------------------------------------- int getLDRReading(byte sensorID) { digitalWrite(LDR_ADDR0_PIN, sensorID & 1); digitalWrite(LDR_ADDR1_PIN, sensorID & 2); digitalWrite(LDR_ADDR2_PIN, sensorID & 4); delayMicroseconds(10); return analogRead(SENSOR_PIN); } // getLDRReading //--------------------------------------------------------- void getLDRBaseline() { const long REPEATS = 64; int r; byte j; for (j = 0; j < LDRS; j++) { LDRBaseline[j] = 0; for (r = 0; r < REPEATS; r++) LDRBaseline[j] += getLDRReading(j); LDRBaseline[j] /= REPEATS; } // for } // getLDRBaseline //--------------------------------------------------------- byte getFullReading() { byte j, result = 0; int reading; for (j = 0; j < LDRS; j++) { reading = getLDRReading(j); if (LDRBaseline[j] - reading < 100) result += 1 << j; } // for return result; } // getFullReading //--------------------------------------------------------- void printBits(const byte b) { byte j = LDRS; // Assuming LCD cursor is at the correct position while (j--) { lcd.print(b & (1 << j) ? "1" : "0"); } // while } // printBits //--------------------------------------------------------- void resetReader() { lcd.clear(); lcd.print("Matzah Reader!"); stableReading = 0; index = 0; zeroExpected = 1; while (getFullReading() == MAX_READING) ; lcd.clear(); } // resetReader //--------------------------------------------------------- void setup() { pinMode(LDR_ADDR0_PIN, OUTPUT); pinMode(LDR_ADDR1_PIN, OUTPUT); pinMode(LDR_ADDR2_PIN, OUTPUT); lcd.begin(16, 2); getLDRBaseline(); resetReader(); } // setup //--------------------------------------------------------- void loop() { lcd.home(); currReading = getFullReading(); printBits(currReading); switch (currReading) { case 0 : zeroExpected = 0; if (stableReading) { lcd.setCursor(index++, 1); lcd.write(stableReading + 31); stableReading = 0; } break; case MAX_READING : resetReader(); break; default: if (!zeroExpected) stableReading |= currReading; } // switch delay(200); } // loop