Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Arduino正在读取多个单线传感器_C_Arduino_Shared Libraries - Fatal编程技术网

C Arduino正在读取多个单线传感器

C Arduino正在读取多个单线传感器,c,arduino,shared-libraries,C,Arduino,Shared Libraries,我使用的是一个Arduino,它有几个(3)传感器连接到数字引脚2上,使用正常模式(不是寄生虫) 其中两个传感器是使用库“OneWire”()和“Dallarstemperature”()的温度传感器。使用DallasTemperature库,可以使用命令“getTempCByIndex(int)”轻松访问传感器值 我的第三个传感器是温度和湿度组合传感器。为该传感器提供的代码是一个单独的库“DHT11”。该库不是很好,我很难用DHT11和达拉斯温度库读取传感器值 我认为OneWire库应该是所有

我使用的是一个Arduino,它有几个(3)传感器连接到数字引脚2上,使用正常模式(不是寄生虫)

其中两个传感器是使用库“OneWire”()和“Dallarstemperature”()的温度传感器。使用DallasTemperature库,可以使用命令“getTempCByIndex(int)”轻松访问传感器值

我的第三个传感器是温度和湿度组合传感器。为该传感器提供的代码是一个单独的库“DHT11”。该库不是很好,我很难用DHT11和达拉斯温度库读取传感器值

我认为OneWire库应该是所有OneWire设备的通用库,DallasteTemperature库是该库的包装,为某些传感器提供了良好的接口

是否有人可以帮助我了解如何将DHT11库包括在达拉斯温度库中?一个好的函数应该是“getDHT11HumidityByIndex(int)”

或者使用OneWire编写新的包装器更容易吗?在这种情况下,这将如何工作

现在,我尝试使用提供的库和下面的代码。程序通常无法读取湿度传感器,获取状态(-2):“读取传感器:超时错误”,并且传感器的索引在运行期间发生变化。 我能做些小改动来解决这个问题吗

#include <OneWire.h>
#include <DallasTemperature.h>
#include <dht11.h>  //Library for the humidity sensor.

// Data wire is plugged into port 2 on the Arduino.
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs).
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Declare object for Humidity sensor.
dht11 DHT11;



void setup(void)
{
  // Start serial port.
  Serial.begin(9600);

  // Start up the library.
  sensors.begin();
}

void loop(void)
{ 
  // Call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus.
  sensors.requestTemperatures(); // Send the command to get temperatures.

  Serial.print("BEGIN-0#");
  Serial.print(sensors.getTempCByIndex(0));
  // You can have more than one IC on the same bus.
  // 0 refers to the first IC on the wire.
  Serial.println("#COMMIT");

  Serial.print("BEGIN-1#");
  Serial.print(sensors.getTempCByIndex(1));
  // You can have more than one IC on the same bus.
  // 0 refers to the first IC on the wire.
  Serial.println("#COMMIT");



  int chk = DHT11.read(ONE_WIRE_BUS);

  Serial.print("Read sensor: ");
  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }

  Serial.print("Humidity (%): ");
  Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");
  Serial.println((float)DHT11.temperature, 2);
}
#包括
#包括
#包括//湿度传感器的库。
//数据线插入Arduino上的端口2。
#定义一条线\u总线2
//设置oneWire实例以与任何oneWire设备(不仅仅是Maxim/Dallas温度IC)通信。
单线单线(单线总线);
//将我们的单线参考传递到达拉斯温度。
达拉斯温度传感器(单线);
//声明湿度传感器的对象。
dht11 dht11;
作废设置(作废)
{
//启动串行端口。
Serial.begin(9600);
//启动图书馆。
begin();
}
无效循环(无效)
{ 
//调用sensors.requestTemperations()以发出全局温度
//请求总线上的所有设备。
sensors.requestTemperations();//发送命令以获取温度。
Serial.print(“BEGIN-0#”);
Serial.print(sensors.getTempCByIndex(0));
//同一总线上可以有多个IC。
//0表示导线上的第一个IC。
Serial.println(“提交”);
Serial.print(“BEGIN-1#”);
Serial.print(sensors.getTempCByIndex(1));
//同一总线上可以有多个IC。
//0表示导线上的第一个IC。
Serial.println(“提交”);
int chk=DHT11.read(单线总线);
串行打印(“读取传感器:”);
开关(chk)
{
案例0:Serial.println(“OK”);中断;
案例1:Serial.println(“校验和错误”);中断;
案例2:Serial.println(“超时错误”);中断;
默认值:Serial.println(“未知错误”);中断;
}
连续打印(“湿度(%):”;
串行打印LN((浮动)DHT11.2);
连续打印(“温度(oC):”;
串行打印LN((浮动)DHT11.2);
}

当您从控制总线的一个库转换到另一个库时,有理由认为访问同一总线的两个库可能会导致故障。但单线协议只有一位,默认状态始终为1。我猜当DHTT11.read()启动时,很可能会出现小故障。我理解将硬件层接口对象传递给特定传感器类的概念,但在这种情况下,接口是一个单引脚。我不会从重写库开始

最好的建议是在总线上安装示波器和逻辑分析仪。您需要的范围,以确保您的接线没有产生振铃或电压骤降。你需要逻辑分析仪,因为数位是令人麻木的乏味。这是一个很好的借口/理由,如果你愿意购买一些仪器。但我们不是为了谋生,你能做什么

分解问题:

  • 仅使用DHT11库在总线上运行1个温度/湿度传感器。它有用吗?如果是,则库是稳定的,并且您的接线良好。如果没有,停下来像这样修理

  • 再加上一些大的延迟。这些设备由总线供电,需要时间充电。数据表上肯定有指南。或者只需在读取之间加上2秒。现在能用了吗?如果是的话,我们可以推一下延迟,看看会发生什么

  • 现在添加第二个仅温度传感器。它停止工作了吗

  • 如果它停止工作,再次在读取之间添加一些较大的延迟

  • 如果仍然损坏,切换到只运行温度传感器(您说这已经工作)。使仅温度传感器程序工作

  • 添加第三、第四等设备。如果更多设备的功能变差,开始关注硬件链路层。同样,如果信号到达设备,示波器是了解的最佳途径。电线与双绞线之间的距离更大。设备的物理布线方式将影响导致信号降级的反射