极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11173|回复: 1

SHT71温度传感器与其他设备共用出错的问题

[复制链接]
发表于 2015-5-20 16:15:55 | 显示全部楼层 |阅读模式
本帖最后由 atlas 于 2015-5-20 16:19 编辑


1、使用以下程序单纯在Arduino上测试SHT71成功,串口正常输出温度湿度数据。
2、但是当和别的设备一起工作时就出问题,例如I2C总线的AM2321等,一直显示ACK错误,貌似设备不再返回数据,AM2321也不再正常输出。而将SHT71的程序移除,其他设备的程序也就恢复正常。
3、请问,这段程序没有调用库,完全是IO口操作,而且IO口不一致,为什么还会和其他I2C总线的设备冲突。


  1. int SHT_clockPin = 3;  // pin used for clock
  2. int SHT_dataPin  = 2;  // pin used for data

  3. void setup(){
  4.   Serial.begin(9600); // open serial at 9600 bps
  5. }

  6. void loop(){
  7.   //these can take a bit to get the values (100ms or so)
  8.   float temperature = getTemperature();
  9.   float humidity = getHumidity();

  10.   Serial.print(temperature);
  11.   Serial.print(" | ");
  12.   Serial.println(humidity);

  13. }






  14. float getTemperature(){
  15.   //Return Temperature in Celsius
  16.   SHT_sendCommand(B00000011, SHT_dataPin, SHT_clockPin);
  17.   SHT_waitForResult(SHT_dataPin);

  18.   int val = SHT_getData(SHT_dataPin, SHT_clockPin);
  19.   SHT_skipCrc(SHT_dataPin, SHT_clockPin);
  20.   return (float)val * 0.01 - 40; //convert to celsius
  21. }

  22. float getHumidity(){
  23.   //Return  Relative Humidity
  24.   SHT_sendCommand(B00000101, SHT_dataPin, SHT_clockPin);
  25.   SHT_waitForResult(SHT_dataPin);
  26.   int val = SHT_getData(SHT_dataPin, SHT_clockPin);
  27.   SHT_skipCrc(SHT_dataPin, SHT_clockPin);
  28.   return -4.0 + 0.0405 * val + -0.0000028 * val * val;
  29. }


  30. void SHT_sendCommand(int command, int dataPin, int clockPin){
  31.   // send a command to the SHTx sensor
  32.   // transmission start
  33.   pinMode(dataPin, OUTPUT);
  34.   pinMode(clockPin, OUTPUT);
  35.   digitalWrite(dataPin, HIGH);
  36.   digitalWrite(clockPin, HIGH);
  37.   digitalWrite(dataPin, LOW);
  38.   digitalWrite(clockPin, LOW);
  39.   digitalWrite(clockPin, HIGH);
  40.   digitalWrite(dataPin, HIGH);
  41.   digitalWrite(clockPin, LOW);

  42.   // shift out the command (the 3 MSB are address and must be 000, the last 5 bits are the command)
  43.   shiftOut(dataPin, clockPin, MSBFIRST, command);

  44.   // verify we get the right ACK
  45.   digitalWrite(clockPin, HIGH);
  46.   pinMode(dataPin, INPUT);

  47.   if (digitalRead(dataPin)) Serial.println("ACK error 0");
  48.   digitalWrite(clockPin, LOW);
  49.   if (!digitalRead(dataPin)) Serial.println("ACK error 1");
  50. }


  51. void SHT_waitForResult(int dataPin){
  52.   // wait for the SHTx answer
  53.   pinMode(dataPin, INPUT);

  54.   int ack; //acknowledgement

  55.   //need to wait up to 2 seconds for the value
  56.   for (int i = 0; i < 1000; ++i){
  57.     delay(2);
  58.     ack = digitalRead(dataPin);
  59.     if (ack == LOW) break;
  60.   }

  61.   if (ack == HIGH) Serial.println("ACK error 2");
  62. }

  63. int SHT_getData(int dataPin, int clockPin){
  64.   // get data from the SHTx sensor

  65.   // get the MSB (most significant bits)
  66.   pinMode(dataPin, INPUT);
  67.   pinMode(clockPin, OUTPUT);
  68.   byte MSB = shiftIn(dataPin, clockPin, MSBFIRST);

  69.   // send the required ACK
  70.   pinMode(dataPin, OUTPUT);
  71.   digitalWrite(dataPin, HIGH);
  72.   digitalWrite(dataPin, LOW);
  73.   digitalWrite(clockPin, HIGH);
  74.   digitalWrite(clockPin, LOW);

  75.   // get the LSB (less significant bits)
  76.   pinMode(dataPin, INPUT);
  77.   byte LSB = shiftIn(dataPin, clockPin, MSBFIRST);
  78.   return ((MSB << 8) | LSB); //combine bits
  79. }

  80. void SHT_skipCrc(int dataPin, int clockPin){
  81.   // skip CRC data from the SHTx sensor
  82.   pinMode(dataPin, OUTPUT);
  83.   pinMode(clockPin, OUTPUT);
  84.   digitalWrite(dataPin, HIGH);
  85.   digitalWrite(clockPin, HIGH);
  86.   digitalWrite(clockPin, LOW);
  87. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-5-24 18:24:12 | 显示全部楼层
如果单独运行以上程序,就能正常输出
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
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 10:09 , Processed in 0.036639 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表