本帖最后由 atlas 于 2015-5-20 16:19 编辑

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(){
- //Return Relative 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);
- }
复制代码 |