igendel icon

Informatzah source code for Arduino

igendel | PRO | 04/03/14 11:36:57 PM UTC | 0 ⭐ | 818 👁️ | Never ⏰ | []
C |

2.95 KB

|

None

|

0 👍

/

0 👎

// Informatzah by Ido Gendel, 2014
// Use freely, at your own risk.
 
#include <LiquidCrystal.h>
 
// 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

Comments