yaboPP电子
项目

将PIC微控制器作为自定义传感器和I / O接口的I2C从设备进行编程

2016年3月03日经过Raymond Genovese.

没有I2C接口与该传感器?没问题。将PIC芯片作为自定义传感器和I / O接口的I2C从设备进行编程。在这里,我们在单个I2C接口上使用三个DHT22传感器。

没有I2C接口与该传感器?没问题。将PIC芯片作为自定义传感器和I / O接口的I2C从设备进行编程。在这里,我们在单个I2C接口上使用三个DHT22传感器。

集成电区电路(I2C)总线是对嵌入式控制器的接口设备的常用和方便的技术。这种流行的串行接口协议允许使用两个通信电线,时钟和数据(SCL和SDA)和两个电源线(VCC和SDA)和两个电源线(VCC和GND)。每个I2C外围设备是可寻址的,允许多个设备附加到相同的I2C连接,这是其受欢迎程度的主要原因。

但是,当您要使用的外围设备不使用I2C通信协议时,您会做什么?一个解决方案是滚动自己的I2C接口。该项目呈现了相对容易且廉价的方式来做。

具体来说,我们将使用经济的PIC12F1840 IC作为从I2C设备,将接口到Arduino UNO以及大多数微控制器板使用一个单一的主/多个从,I2C方案。

面包板上的项目电路。

面包板上的项目电路。

为了以具有一些实用程序的方式说明该技术,PIC芯片将与三个DHT22(AKA AM2302)湿度和温度传感器界面。最终结果是使用单个I2C总线部署所有三个传感器的简单方法。可以扩展该技术以包括其他自定义传感器应用以及自定义I / O扩展和两者的组合。

硬件

该电路由PIC I2C接口和三个DHT传感器组成。PIC I2C接口包含12F1840 IC,一些支持组件,一个头/跳线(JP1)连接主板和三个额外的头/跳线连接三个传感器板。J1上Arduino UNO的四个连接是+5v、GND、SDA和SCL,这些都可以在Arduino板标头上找到。12F1840包括6个I/O引脚。其中两个引脚RA1和RA2组成了用于I2C通信的SDA和SCL线。我已经包括10K, I2C上拉电阻(R1和R2)在这些线路上,他们工作得很好,但你可能想要调整你的应用程序的值。

另外,如果您在系统上的I2C线路上有上拉电阻,可能需要完全消除这些电阻器。三个I / O引脚,RA0,RA4和RA5,分别连接到DHT22传感器#1,#2和#3上的数据线。剩余的PIN(RA3)未使用并保持未连接。通过额外的扩展电路,该引脚可以用作通用输入或启用硬件复位(MCLR)。

图1. PIC I2C板的原理图。

图1. PIC I2C板的原理图。
部分 描述

PIC I2C板零件列表。

U1. pic 12f1840 / p
C1. 0.1超滤电容
R1,R2 10 k电阻
J1,DHT1-3 4针标题/跳线
电缆 3 x 4针

每个传感器安装在单独的板上,其意图将它们彼此一定距离放置并通过4针电缆连接到I2C板。由于DHT22上的4个引脚中只有3个可用,因此如果需要,您可以替换3个引脚电缆和连接器(制作适当的连接)。

DHT22或AM2302湿度和温度传感器。引脚:1-VDD,2数据,3 N / C,4-GND。

DHT22或AM2302湿度和温度传感器:引脚:1-VDD,2数据,3 N / C,4-GND。

传感器板也相对简单,仅包含DHT22传感器,数据线上的上拉电阻以及跨越电源线的旁路电容。

图2。单个DHT22传感器原理图。3个传感器各需要一块单板。

图2。单个DHT22传感器原理图。3个传感器各需要一块单板。

传感器板部件清单
部分 描述
DHT22 DHT22传感器
C1. 0.01 UF电容器
R1. 4.7K电阻
J1. 4针标题/跳线

如上所述,该项目专为5V而设计,但我也用3.3V测试它,它可以正常工作,因为该电压在PIC IC和DHT22的操作范围内。

实现自定义I2C传感器

PIC 12F1840是Microchip增强的8位中档架构的示例。它是一个8针微控制器,包括大量外围设备功能。这些外围设备函数中的主要项目是主同步串口或MSSP。此功能允许我们实现I2C接口,使得芯片将用作从设备I2C设备。也许最好的是,在应用笔记(AN734C)中已经为我们完成了“重升降”的软件。该应用笔记中的代码构成了I2C引擎的基础。它是中断驱动的,允许芯片基本上起作用32字节存储器阵列,允许在主设备和从设备之间进行双向读取和写入。附加的程序包括来自应用程序笔记的代码,仅稍微修改为12F1840。

主I2C设备(在此示例中,Arduino UNO)将通过写入存储器阵列中的选择位置向从I2C设备发出命令。PIC作为从属I2C设备,将通过存储器阵列执行命令(即,读取DHT22传感器)并报告背部状态和传感器信息。然后,主设备读取存储器阵列以检索传感器读数。

记忆映射

我们将通过阵列将32字节内存阵列称为阵列[0] [31]。array [0]用作主设备(Arduino)将发出命令的位置,以及从设备(PIC)将报告将由主设备读取的状态。在这方面,PIC将返回如表中所述的三个值中的一个。这些值将指示上电状态,成功执行有效命令以及接收不良或未知命令。

ARRAY[0] STATUS - PIC设置的报告状态的值。
状态值
0x00. 启动值。另外,对软件PIC设置的值进行复位
0x01 最后一个命令执行成功
0xF1. 请求错误的(未知的)命令

arduino将使用如下所述的四个可能的命令值中的一个写入阵列[0]。这些将指示PIC读取DHT传感器中的一个或重置。

ARRAY[0] COMMAND - Arduino设置的发出命令的值。
命令值
0x02 读取DHT传感器#1
0x03 读取DHT传感器#2
0x04 读取DHT传感器#3
0x10 执行PIC的软件重置

当发出传感器读取命令时,通过将0x02,0x03或0x04写入阵列[0]并且PIC返回成功的执行状态,通过将0x01写入阵列[0],传感器数据将可用于Arduino通过读取内存阵列。

DHT22返回5个字节以指示湿度(相对湿度或RH)和温度(摄氏度),如下所示:RH积分,RH小数,温度积分,温度小数和校验和,这是所有四个字节的总和的值和255.这5个字节将在读取传感器命令之后用PIC写入不同的存储位置。阵列[16] - arraRay [31]位置是未使用的免费内存可用于自定义使用。

阵列内存位置 - 图片设置的值,用于arduino读取。
传感器数据信息图
数组[1] - arraR [5] DHT传感器#1:RH积分,RH十进制,TEMP Integral,Temp Decimal,Checksum
阵列[6] - arraray [10] DHT传感器#1:RH积分,RH十进制,TEMP Integral,Temp Decimal,Checksum
阵列[11] - arraw [15] DHT传感器#1:RH积分,RH十进制,TEMP Integral,Temp Decimal,Checksum
阵列[16] - arraray [32] 可供使用

可用的最终命令是0x10,将导致PIC 12F1840的软件复位。通常,不需要使用此命令,但在意外情况下可能很有用。

读取DHT22温度和湿度传感器

读取DHT22传感器并将其存储在存储器阵列中的工作也落到PIC芯片。DHT22的低价,可用性和相对可靠性使其成为无处不在的。然而,芯片使用的串行协议需要非常精确的定时。这些时序要求对于使用相对慢的I / O或系统(例如,芯片[SOC] IC)的系统可能是有问题的,其多个高优先级功能可以使所需的专用定时要求麻烦。在这方面,它对专用IC的作业“关闭了”作业来说是良好的感觉。

与传感器的通信是通过特定的“单线”串行协议,不应与达拉斯/ Maxim半导体单线协议混淆 - 两种完全不同。涉及三个连接(VCC,GND和数据)。数据引脚是所有操纵发生的,并且仔细阅读数据表将提供细节。

简而言之,以下步骤描述了从PIC侧描述的相互作用,所需读取传感器,并且已经对所包括的MPASM程序进行了自由评论,以便在程序流程之后促进。

1.将数据线设置为输出,将其设置为低并等待18微秒。

2.将数据线高为30微秒。

3.将数据线设置为输入并监控其状态。DHT22应将其设置为80微秒,然后将其高,然后高80微秒。

4.步骤1-3是数据流的前导。接下来,DHT22将将数据线设置为低50微秒,这表示数据位的开始。

这是它有点棘手的地方。在起始位时间之后,DHT22将为〜27微秒或70微秒带来数据线。前者信号数据位为“0”,数据位为“1”的后者信号。

6.后数据位(步骤5),DHT22将进入另一个50微秒起始位时期之后,另一个数据位(一个“0”或“1”中描述5以上)这对40位,重复序列构成的5字节的传感器数据(RH积分,RH小数,温度积分,小数,温度和校验和)。

您可以看到协议需要精确定时,并且读取传感器的时间是可变的,因为它取决于读取中的“0”和“1”位的数量。一种策略是测量每个间隔,然后确定数据位是否适合“0”或“1”间隔。我选择了不同的策略,如下所述,这令人要求苛刻,非常可靠。

图3.从串行流中的“1”位区别于“0”的策略。

图3.从串行流中的“1”位区别于“0”的策略。

在序言之后,我们等待开始位时间的结束,然后延迟约43微秒,然后读取数据线。如果数据线是低的,那么位是一个“0”,我们将在下一个开始位时间。在本例中,我们将该位记录为' 0 ',并等待起始位时间结束,然后读取下一位。如果数据线是高的,位是' 1 ',我们仍然在位时间。在本例中,我们将该位记录为' 1 ',然后等待下一个开始位时间开始,然后等待开始位时间结束,然后读取下一个位。

当PIC已完成读取所请求的DHT22传感器时,数据可用于通过I2C接口读取。在这种情况下,阵列[0]将读取为0x01,表示成功完成最后一个命令。

使用Arduino Uno获取传感器数据

通过I2C接口访问存储器位置以请求并读取传感器数据是通常的时尚。已经为I2C函数进行编程的读者将识别步骤,并且已评论包含的草图以促进程序流程。

首先,您需要声明,

# include < wire.h > < wire.h > < wire.h > < / wire.h > < / wire.h > < / wire.h >

使用I2C库。

接下来,您需要PIC的I2C地址。这在PIC MPASM代码中由程序行设置:

#define i2c_address 0x32;从地址

这个地址应该右移一位来形成Arduino将要使用的地址。熟悉I2C 7位寻址方案的人会认识到这一通常不方便的步骤。右移0x32得到0x19这就是Arduino使用的I2C地址。当然,您可以在MPASM代码中将这个地址设置为任何可用的I2C地址。

要启动Ball滚动,请使用语句Wire.Begin();//加入总线作为主机 - 通常在setup()中。

读取传感器#2的命令的步骤如下所示(变量“地址”已设置为0x19):

Wire.Begintroansmission(地址);Wire.write(0);//缓冲索引指针Wire.write(3);//命令字节(3 =读取DHT22#2)wire.endtransmission();延迟(50);//等待它完成 -  50毫秒开始

最后一行的延迟等待传感器读数完成,可能比它需要的时间长,但最好是保守的。如果您的应用程序需要,您可以尝试减少延迟。

此时,来自DHT传感器#2的数据应该在阵列[6]-阵列[11]中。要检索数据,使用以下方法:

首先,读取阵列的状态字节[0]

Wire.Begintroansmission(地址);Wire.write(0);//缓冲索引指针wire.endtransmission();电线。requestFrom(地址1);//更新状态字节dht [0] = wire.read();

检查状态字节(现在在DHT [0]中)等于0x01,表示命令的成功完成。接下来,使用以下语句获取5个字节的DHT数据(来自阵列[6] - arraR [11]):

Wire.Begintroansmission(地址);Wire.write (6);//缓存索引指针(指向DHT #2的数据)wire.endtransmission();wire.requestfrom(地址,5);

在我们将这些数据放入程序阵列DHT [6] = - DHT [10]后,我们将数据转换为RH和温度,最后,我们检查CRC是否好:

/ /湿度RHZ2 = DHT [6];RHz2 * = 256;RHZ2 + = DHT [7];RHZ2 / = 10;/ /温度TempCz2 = DHT [8] &0x7f;tempcz2 * = 256;tempcz2 + = dht [9];tempcz2 / = 10;if(dht [8]&0x80){tempcz2 * =  -  1;}TempFz2= TempFz2 * 9 / 5 +32;//校验和if((DHT [6] + DHT [7] + DHT [8] + DHT [9]&255)!= DHT [10]){serial.print(“***坏CRC!***”);}其他{serial.print(“CRC很好”);}

使用适当的命令代码以相同的方式读取另外两个DHT22传感器。

附带的Arduino示例草图每5秒只读取所有三个传感器,并在串行监视器上显示数据。

屏幕输出来自Arduino测试草图。

屏幕输出来自Arduino测试草图。

起飞和跑步

使用电路所需的软件包括在这里,包括:12F1840 MPASM源代码,12F1840十六进制代码文件和Arduino测试草图。您需要编程PIC 12F1840芯片。如果您之前使用过PIC片,则不应该代表艰难的一步。如果您不熟悉PIC芯片,那么这似乎可能是一个具有挑战性的任务。然而,许多廉价的程序员可用包括几个DIY设计,这些设计已经获得了很多支持。MPASM汇编器可用于免费微芯片。

此外,通过使用一个更小的PIC芯片,如12F1840,任务不像看起来那么艰巨。您可以按原样组装包含的MPASM源代码进行编程,或者进行一些更改,比如I2C地址。或者,大多数程序员将允许您使用直接的HEX代码文件,以源代码所包括的芯片编程。

封闭的思想

该项目旨在为更大的嵌入式控制器项目提供有用的补充。具体而言,它非常适合于在多个区域监测湿度和温度的情况下。它还旨在作为利用自定义应用程序中的I2C总线的起点。虽然12F1840非常便宜且适用于该项目,但可以使用包含所需MSSP功能的较大的PIC芯片来实现扩展,但也包含更多GPIO。因此,在传感器接口和I / O扩展的基于基于I2C的组合中实现廉价的I2C组合是非常可行的。

为自己提供这个项目!得到bom。

Rolyourowni2c.zip.

11评论
  • 豪华林 2016年3月5日

    我最近加入了,并找到了这些文章,写得很好,信息丰富,偶尔有点鼓舞人心。祝贺所有给予他们的时间和知识的作者以及巨大的拇指到他们评论中缺乏兴趣。伙计们这是好东西,让我们对那些想要做得超过Flash LED的人来说有点欣赏555

    喜欢。 回复