Mayhew Labs MUX SHIELD


hello there,
i've been looking on specific topic, don't believe can find on forum of yet.  using mux shield ii mayhew labs create reactive led table.  have 12 infrared sensors in close proximity infrared emitters.  these sensors being fed inputs of mutiplexer section of board, , using shift registers allow cathode of led cluster go low , drop necessary voltage. 
currently, have run tests of board mux library examples, know able obtain accurate sensor readings, , write available led clusters. 
my problem project, believe comes running inefficient programming, , not understanding how write shift registers. 
my program consists of setup loop 25 readings of each sensor obtained , average computed each sensor.
then loop executes, uses 12 if statements compare current analog read value average sensor value, , writes led closest sensor low(my logic reversed because supplying 5v led clusters, , using shift registers allow clusters cathodes grounded , let voltage drop). 
i think there more effective way handle this, perhaps calling individual functions each instance of sensor readings.
currently, can favorable results programming 1 row of shift registers @ time.  when try communicating rows 2 , 3 of mux shield, data written down line activated sensor.
i have schematic post asap


code

#include <muxshield.h>

muxshield muxshield;

struct calibration_t {    //create structure
  int sensorarray[25];    //make array 25 sensor values
  int sensortotal;
  int sensoraverage;
};
const int calibration_runs = 25; //25 runs
calibration_t calibs[calibration_runs];
int dely = 100;
int dely1 = 25;
int loopread[16];
//int wig = 0;//wiggle room sensor average
void setup() {
  muxshield.setmode(1,analog_in);

  muxshield.setmode(2,digital_out);

  muxshield.setmode(3,digital_out);
 
  serial.begin(9600);
  for  (int i=0; i<=14;i++){  //write led's high(turn them off)
    muxshield.digitalwritems(2,i,high); 
    muxshield.digitalwritems(3,i,high);
  }
 
  (int j=0; j <calibration_runs; j++) {//run 25 calibration loops
   
    (int i=0; i<=11; i++){//take easch sensor value
      calibs[j].sensorarray = muxshield.analogreadms(1,i);
     
      calibs[j].sensortotal += calibs[j].sensorarray;
      // add each reading itself
      delay(dely1);
    }
    calibs[j].sensoraverage = calibs[j].sensortotal / 25;
   //divide totals 25

}

 muxshield.digitalwritems(3,14,low);
 delay(500);
 muxshield.digitalwritems(3,14,high);
 

}

void loop(){
//
//  for(int i=0;i<=5;i++){
//    muxshield.analogreadms(1,i);
//   
//}
//not sure if need obtain base reading


 
   if((muxshield.analogreadms(1,0)) < (calibs[0].sensoraverage*1.15))
   {
     for (int i=0;i<=3;i++){
     muxshield.digitalwritems(2,i,b11111111);
     }
 }
     else
     {
         for(int i=0;i<=3;i++){
         muxshield.digitalwritems(2,i,b00000000);
//         delay(dely);
         }
 }
//is best way write shift registers?
     
     
     if(muxshield.analogreadms(1,1)<(calibs[1].sensoraverage*1.5))
     {
       for (int i=2;i<=5;i++){
       muxshield.digitalwritems(2,i,b11111111);
     }
 }
     else{
       for(int i=2;i<=5;i++){
         muxshield.digitalwritems(2,i,b00000000);
//         delay(dely);
       }
     }
     
     
     if(muxshield.analogreadms(1,2) <(calibs[2].sensoraverage*1.15)){
     for (int i=4;i<=7;i++){
     muxshield.digitalwritems(2,i,b11111111);
     }
 }
     else{
       for(int i=4;i<=7;i++){
         muxshield.digitalwritems(2,i,b00000000);
         //delay(dely);
       }
     }

//////     
//////     
     if(muxshield.analogreadms(1,3) < calibs[3].sensoraverage){
     for (int i=6;i<=9;i++){
     muxshield.digitalwritems(2,i,b11111111);
     }
 }
     else
     {
       for(int i=6;i<=9;i++){
         muxshield.digitalwritems(2,i,b00000000);
         //delay(dely);
         
       }
       
    }
       
     if(muxshield.analogreadms(1,4)<(calibs[4].sensoraverage*1.05)){
   
     for (int i=10;i<=13;i++){
     muxshield.digitalwritems(2,i,b11111111);
        }
     }
     else{
       for (int i=10;i<=13;i++){
      muxshield.digitalwritems(2,i,b00000000);
      //delay(dely);
       }
     }

//     
     if(muxshield.analogreadms(1,5)<(calibs[5].sensoraverage*0.95))
     {
     
       for (int i=12;i<=14;i++){
       muxshield.digitalwritems(2,i,b11111111);
        }     
     
     }
     
       else if ((muxshield.analogreadms(1,5))>(calibs[5].sensoraverage*0.95))
       {
         for (int i=12;i<=14;i++){
     muxshield.digitalwritems(2,i,b00000000);
        }   
       }

         for(int i=6;i<=12;i++)
         {
            muxshield.analogreadms(1,i);
         }
             
    if(muxshield.analogreadms(1,6)<(calibs[6].sensoraverage)*0.5){
     for (int i=0;i<=2;i++){
       muxshield.digitalwritems(3,i,b11111111);
     }     
     }
     else
     {
      (int i=0;i<=2;i++){
       muxshield.digitalwritems(3,i,b00000000);
      // delay(dely);
     
   }     
     }
     
   //  serial.println(muxshield.analogreadms(1,6));
     //delay(500);
     
     if(muxshield.analogreadms(1,7)<calibs[7].sensoraverage){
      for(int i=1;i<=4;i++){
        muxshield.digitalwritems(3,i,b11111111);
     }
     }
     else{
       for(int i=1;i<=4;i++){
        muxshield.digitalwritems(3,i,b00000000);
       // delay(dely);
     }
     }
     
     if(muxshield.analogreadms(1,8)<(calibs[8].sensoraverage)){
       for (int i=5;i<=8;i++){
         muxshield.digitalwritems(3,i,b11111111);
       }
     }
       else{
         for (int i=5;i<=8;i++)
         muxshield.digitalwritems(3,i,b00000000);
         //delay(dely);
       }

       if(muxshield.analogreadms(1,9)<calibs[9].sensoraverage){
       for (int i=7;i<=10;i++){
         muxshield.digitalwritems(3,i,b11111111);
       }
     }
       else{
         for (int i=7;i<=10;i++)
         muxshield.digitalwritems(3,i,b00000000);
         //delay(dely);
       }

      if(muxshield.analogreadms(1,10)<calibs[10].sensoraverage){
       for (int i=9;i<=12;i++){
         muxshield.digitalwritems(3,i,b11111111);
       }
     }
       else{
         for (int i=9;i<=12;i++)
         muxshield.digitalwritems(3,i,b00000000);
         //delay(dely);
       }
     
        if(muxshield.analogreadms(1,11)<calibs[11].sensoraverage){
       for (int i=11;i<=14;i++){
         muxshield.digitalwritems(3,i,b11111111);
       }
     }
       else{
         for (int i=11;i<=14;i++)
         muxshield.digitalwritems(3,i,b00000000);
         //delay(dely);
       }
}








here close representation of schematic.  transistors phototransistors closed when more infrared comes in.


Arduino Forum > Using Arduino > LEDs and Multiplexing > Mayhew Labs MUX SHIELD


arduino

Comments