C Arduino正在读取多个单线传感器
我使用的是一个Arduino,它有几个(3)传感器连接到数字引脚2上,使用正常模式(不是寄生虫) 其中两个传感器是使用库“OneWire”()和“Dallarstemperature”()的温度传感器。使用DallasTemperature库,可以使用命令“getTempCByIndex(int)”轻松访问传感器值 我的第三个传感器是温度和湿度组合传感器。为该传感器提供的代码是一个单独的库“DHT11”。该库不是很好,我很难用DHT11和达拉斯温度库读取传感器值 我认为OneWire库应该是所有OneWire设备的通用库,DallasteTemperature库是该库的包装,为某些传感器提供了良好的接口 是否有人可以帮助我了解如何将DHT11库包括在达拉斯温度库中?一个好的函数应该是“getDHT11HumidityByIndex(int)” 或者使用OneWire编写新的包装器更容易吗?在这种情况下,这将如何工作 现在,我尝试使用提供的库和下面的代码。程序通常无法读取湿度传感器,获取状态(-2):“读取传感器:超时错误”,并且传感器的索引在运行期间发生变化。 我能做些小改动来解决这个问题吗C Arduino正在读取多个单线传感器,c,arduino,shared-libraries,C,Arduino,Shared Libraries,我使用的是一个Arduino,它有几个(3)传感器连接到数字引脚2上,使用正常模式(不是寄生虫) 其中两个传感器是使用库“OneWire”()和“Dallarstemperature”()的温度传感器。使用DallasTemperature库,可以使用命令“getTempCByIndex(int)”轻松访问传感器值 我的第三个传感器是温度和湿度组合传感器。为该传感器提供的代码是一个单独的库“DHT11”。该库不是很好,我很难用DHT11和达拉斯温度库读取传感器值 我认为OneWire库应该是所有
#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秒。现在能用了吗?如果是的话,我们可以推一下延迟,看看会发生什么
- 现在添加第二个仅温度传感器。它停止工作了吗
- 如果它停止工作,再次在读取之间添加一些较大的延迟
- 如果仍然损坏,切换到只运行温度传感器(您说这已经工作)。使仅温度传感器程序工作
- 添加第三、第四等设备。如果更多设备的功能变差,开始关注硬件链路层。同样,如果信号到达设备,示波器是了解的最佳途径。电线与双绞线之间的距离更大。设备的物理布线方式将影响导致信号降级的反射