我有4个SingleTact电容式传感器,每个传感器的i2c地址为0x04 . 我想找到传感器的平均值,以制作操纵杆 . 但是我不确定如何为每个传感器分配它自己的地址,因为它们都具有相同的地址,因为它们是相同的传感器 . 我有一个初始代码,但这只适用于一个传感器,因为它只有一个i2c地址字节 . 我已经使用在线教程将所有SDA和SCL线连接在一起,并包含了上拉电阻 .
#include <Wire.h>
#define initializetime 4
byte serialToPCBuffer[77];
byte serialToPCBufferIndex = 0;
int data[4];
int databuffer[4][initializetime] = {0,0,0,0,0,0,0,0,0,0,0,0};
int base[4] = {0,0,0,0};
int ArduinoToPCBuffer[4] = {1000,2000,3000,4000};
byte outgoingI2CBuffer[32];
unsigned long timeStamp_;
void setup() {
int i;
Wire.begin();
//TWBR = 12;
Serial.begin(57600);
Serial.flush();
initializeSensors();
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("PPS UK: SingleTact sensor value in PSI. \n(resembles PC executable display)");
Serial.println("Refer manual for any other calculation.");
Serial.println("----------------------------------------");
}
void loop(){
byte i2cAddress = 0x04; // Slave address (SingleTact), default 0x04
int data = readDataFromSensor(i2cAddress);
Serial.print("I2C Sensor Data:");
Serial.print(data);
Serial.print("\n");
delay(100); // Change this if you are getting values too quickly
}
int readDataFromSensor(int address)
{
byte i = 0;
byte i2cPacketLength = 6;
byte outgoingI2CBuffer[3];
byte incomingI2CBuffer[6];
outgoingI2CBuffer[0] = 0x01;
outgoingI2CBuffer[1] = 128;
outgoingI2CBuffer[2] = i2cPacketLength;
Wire.beginTransmission(address);
Wire.write(outgoingI2CBuffer,3);
byte error = Wire.endTransmission();
if (error != 0) return -1;
Wire.requestFrom(address,i2cPacketLength);
int incomeCount =0;
while(incomeCount < i2cPacketLength)
{
if(Wire.available())
{
incomingI2CBuffer[incomeCount] = Wire.read();
incomeCount++;
}
else
{
delay(1);
}
}
if(serialToPCBuffer[4] == 0x00 && serialToPCBuffer[5] == 0xFE)
{
serialToPCBuffer[5] = 0xFF;
}
int datafromi2c = serialToPCBuffer[4]*256+serialToPCBuffer[5]-base[address-5];
if(datafromi2c<21)
datafromi2c = 0;
return datafromi2c;
}
void initializeSensors()
{
for(int k = 0;k<4;k++)
{
databuffer[k][0] = readDataFromSensor(k+5);
delay(10);
databuffer[k][1] = readDataFromSensor(k+5);
delay(10);
databuffer[k][2] = readDataFromSensor(k+5);
delay(10);
databuffer[k][3] = readDataFromSensor(k+5);
delay(10);
base[k] = (databuffer[k][0] + databuffer[k][1] + databuffer[k][2] + databuffer[k][3])/3;
}
}
谢谢你的建议 .
3 回答
您应该阅读此设备的手册,可用here . 它在界面描述中说
所以你必须这样做
插上第一个传感器
将地址(例如0x41)写入该器件的寄存器0
拔下传感器
对所有使用不同地址的传感器重复1-2-3
然后每个传感器将回复您设置的地址 .
请注意
所以,即使在这种情况下,RTFM建议是最重要的建议......
您也可以使用I2C多路复用器 . 它们有自己的I2C地址,可以在自己的总线(广播域)上枚举四个传感器,以便可以在它们之间切换 . 您的编程需要依次明确选择每个传感器并跟踪它正在读取的传感器 . 切换后,I2C流量只会传递到选定的设备 . 当您运行额外布线时,这最适用于星型拓扑中的一组传感器 .
我要走得更远,并说你甚至可以使用继电器来切换这些进出,或者是OR / NAND门 .
你需要使用 Kalman Filter