Duemilanove+Accelerometer+multiplexer

Hi guys!

I am in a project now using the duamilanove together with 3 LIS3LV02DL accelerometer. The problem with the accelerometer is that they all got the same address. By using a MUX I will be able to seperate each one of them.

I will name them by using 01, 10, 11.

My idea is to use Switch and Cases.

so if I can get Switch(var), and use case 1, case, 2 and case 3 it would be wonderfull.

My problem is how can I get the "var". My idea is to make an easy counter that counts 1,2,3,1,2,3,1,2,3.... and so on.

Any suggestions?

Thanks.

Kris.

int var = 0;

void loop()
{
   var++;
   byte tmp = (var % 3) + 1; // tmp will be 1, 2, or 3

   switch(tmp)
   {
      case 1:
        // Do one's stuff
        break;

     case 2:
        // Do two's stuff
        break;

     case 3:
        // Do three's stuff
        break;
   }
}

Hi.

I have tried your solution.

This is now my code.

/*
  
  Hovedprosjekt Universitetet i Agder 2010
  Måling av bevegelser
  
  Lese av verdier via multiplekser
  
  Laget av: Kristoffer Gudmundsen
  
  Master: Arduino Nano
  Slave: LIS3LV02DL akselerometer
  
  Bruker Wire.h biblioteket for å kommunisere via i2c.
 

*/



#include <Wire.h>

#define i2cID 0x1D    
#define outXhigh 0x29
#define outYhigh 0x2B
#define outZhigh 0x2D
#define outXlow 0x28
#define outYlow 0x2A
#define outZlow 0x2C
int var = 0;


void setup()
{
   Wire.begin(); // join i2c buss.
   pinMode(2, OUTPUT);
   pinMode(3, OUTPUT);
   pinMode(7, OUTPUT);
   pinMode(8, OUTPUT);
   digitalWrite(2, HIGH);
   digitalWrite(3, HIGH);
   Serial.begin(9600);
   Serial.println("Wire.begin");
   Wire.beginTransmission(0x1D);
   Wire.send(0x20); //Control register 1
   Wire.send(0x87); // Power up device, enable all axis, don`t selftest.
   Wire.endTransmission();


}




void loop()
{
  
   byte z_val_l, z_val_h, y_val_l, y_val_h, x_val_l, x_val_h;
   word x_val;  // word = unsigned int.
   word y_val;  // word = unsigned int.
   word z_val;  // word = unsigned int.

   
   var++;
   byte tmp = (var % 3) + 1; // tmp will be 1, 2, or 3
   Serial.println(var, DEC);

   switch(tmp)
   {
      case 1:

    
       digitalWrite(7, LOW);
       digitalWrite(8, HIGH);
       
    
       sendWireMessage(outXlow); // we want low x value
       if(Wire.available())
       {
           x_val_l = Wire.receive();
       }
    
       sendWireMessage(outXhigh); // we want high x value
       if(Wire.available())
       {
          x_val_h = Wire.receive(); 
       }
    
       x_val = word(x_val_h, x_val_l);
       delay(250); 
    
        sendWireMessage(outYlow); // we want low Y value
       if(Wire.available())
       {
           y_val_l = Wire.receive();
       }
    
       sendWireMessage(outYhigh); // we want high Y value
       if(Wire.available())
       {
          y_val_h = Wire.receive(); 
       }
    
       y_val = word(y_val_h, y_val_l);
       delay(250); 
    
        sendWireMessage(outZlow); // we want low Z value
       if(Wire.available())
       {
           z_val_l = Wire.receive();
       }
    
       sendWireMessage(outZhigh); // we want high Z value
       if(Wire.available())
       {
          z_val_h = Wire.receive(); 
       }
    
       z_val = word(z_val_h, z_val_l); // high = 8 bit, low = 8 bit. 
       delay(250); 
    
      Serial.println("Accelerometer 1 ");
      Serial.println(x_val); 
      Serial.println(y_val); 
      Serial.println(z_val);
      
      break;
      
      

    case 2:
      
       digitalWrite(7, HIGH);
       digitalWrite(8, HIGH);
       
    
       sendWireMessage(outXlow); // we want low x value
       if(Wire.available())
       {
           x_val_l = Wire.receive();
       }
    
       sendWireMessage(outXhigh); // we want high x value
       if(Wire.available())
       {
          x_val_h = Wire.receive(); 
       }
    
       x_val = word(x_val_h, x_val_l);
       delay(250); 
    
        sendWireMessage(outYlow); // we want low Y value
       if(Wire.available())
       {
           y_val_l = Wire.receive();
       }
    
       sendWireMessage(outYhigh); // we want high Y value
       if(Wire.available())
       {
          y_val_h = Wire.receive(); 
       }
    
       y_val = word(y_val_h, y_val_l);
       delay(250); 
    
        sendWireMessage(outZlow); // we want low Z value
       if(Wire.available())
       {
           z_val_l = Wire.receive();
       }
    
       sendWireMessage(outZhigh); // we want high Z value
       if(Wire.available())
       {
          z_val_h = Wire.receive(); 
       }
    
       z_val = word(z_val_h, z_val_l); // high = 8 bit, low = 8 bit. 
       delay(250); 
    
      Serial.println("Accelerometer 2 ");
      Serial.println(x_val); 
      Serial.println(y_val); 
      Serial.println(z_val);
      
      break;
      
      
      

    case 3:
    
      Serial.println("accelerometer 3 ");
      
    break;
      
      default:
      
      Serial.println("Default ");
      
      break;       
      
   }
 

   
  

}


void sendWireMessage(byte message){
  
   //digitalWrite(7, LOW);
   //digitalWrite(8, HIGH);
   Wire.beginTransmission(i2cID);
   Wire.send(message);
   Wire.endTransmission();
   Wire.requestFrom(i2cID, 1);
   
}

The problem is that all the collected values are now all zeroes.

To me it seems that every time it goes down to this session

void sendWireMessage(byte message){
  
   //digitalWrite(7, LOW);
   //digitalWrite(8, HIGH);
   Wire.beginTransmission(i2cID);
   Wire.send(message);
   Wire.endTransmission();
   Wire.requestFrom(i2cID, 1);
}

it forgets to keep the pin 7&8 pins HIGH or LOW.

Any ideas? Maybe if I can make it remember the values of the pin, and then make an if/else test inside the "void sendWireMessage" process?

Kris.