SHT71温度传感器与其他设备共用出错的问题
本帖最后由 atlas 于 2015-5-20 16:19 编辑http://d.img.youboy.com/20114/7/15/g0/g0_14297128.jpg
1、使用以下程序单纯在Arduino上测试SHT71成功,串口正常输出温度湿度数据。
2、但是当和别的设备一起工作时就出问题,例如I2C总线的AM2321等,一直显示ACK错误,貌似设备不再返回数据,AM2321也不再正常输出。而将SHT71的程序移除,其他设备的程序也就恢复正常。
3、请问,这段程序没有调用库,完全是IO口操作,而且IO口不一致,为什么还会和其他I2C总线的设备冲突。
int SHT_clockPin = 3;// pin used for clock
int SHT_dataPin= 2;// pin used for data
void setup(){
Serial.begin(9600); // open serial at 9600 bps
}
void loop(){
//these can take a bit to get the values (100ms or so)
float temperature = getTemperature();
float humidity = getHumidity();
Serial.print(temperature);
Serial.print(" | ");
Serial.println(humidity);
}
float getTemperature(){
//Return Temperature in Celsius
SHT_sendCommand(B00000011, SHT_dataPin, SHT_clockPin);
SHT_waitForResult(SHT_dataPin);
int val = SHT_getData(SHT_dataPin, SHT_clockPin);
SHT_skipCrc(SHT_dataPin, SHT_clockPin);
return (float)val * 0.01 - 40; //convert to celsius
}
float getHumidity(){
//ReturnRelative Humidity
SHT_sendCommand(B00000101, SHT_dataPin, SHT_clockPin);
SHT_waitForResult(SHT_dataPin);
int val = SHT_getData(SHT_dataPin, SHT_clockPin);
SHT_skipCrc(SHT_dataPin, SHT_clockPin);
return -4.0 + 0.0405 * val + -0.0000028 * val * val;
}
void SHT_sendCommand(int command, int dataPin, int clockPin){
// send a command to the SHTx sensor
// transmission start
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, HIGH);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, LOW);
digitalWrite(clockPin, HIGH);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, LOW);
// shift out the command (the 3 MSB are address and must be 000, the last 5 bits are the command)
shiftOut(dataPin, clockPin, MSBFIRST, command);
// verify we get the right ACK
digitalWrite(clockPin, HIGH);
pinMode(dataPin, INPUT);
if (digitalRead(dataPin)) Serial.println("ACK error 0");
digitalWrite(clockPin, LOW);
if (!digitalRead(dataPin)) Serial.println("ACK error 1");
}
void SHT_waitForResult(int dataPin){
// wait for the SHTx answer
pinMode(dataPin, INPUT);
int ack; //acknowledgement
//need to wait up to 2 seconds for the value
for (int i = 0; i < 1000; ++i){
delay(2);
ack = digitalRead(dataPin);
if (ack == LOW) break;
}
if (ack == HIGH) Serial.println("ACK error 2");
}
int SHT_getData(int dataPin, int clockPin){
// get data from the SHTx sensor
// get the MSB (most significant bits)
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
byte MSB = shiftIn(dataPin, clockPin, MSBFIRST);
// send the required ACK
pinMode(dataPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(dataPin, LOW);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
// get the LSB (less significant bits)
pinMode(dataPin, INPUT);
byte LSB = shiftIn(dataPin, clockPin, MSBFIRST);
return ((MSB << 8) | LSB); //combine bits
}
void SHT_skipCrc(int dataPin, int clockPin){
// skip CRC data from the SHTx sensor
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
digitalWrite(dataPin, HIGH);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
} 如果单独运行以上程序,就能正常输出
26.00 | 73.98
26.04 | 73.98
26.05 | 73.95
26.06 | 73.92
但如果和其他传感器一起运行,没有改变任何硬件,更换输入的程序,就显示以下输出:
ACK error 0
ACK error 2
ACK error 0
ACK error 2
-40.01 | -4.04
页:
[1]