RS485温湿度传感器模块的工业自动化环境监测方案
在工业自动化领域,精准的环境监测是确保生产流程顺畅、设备稳定运行的关键因素之一。EID041-G01和EID041-G01S系列RS485温湿度传感器模块,凭借其高精度、灵活配置以及便捷安装等优势,成为了众多工业现场温湿度监测与控制应用的首选设备。本文将详细介绍该系列产品的主要特点、技术指标以及如何快速投入使用,帮助您更好地了解其在工业自动化环境监测中的重要价值。一、RS485温湿度传感器产品概述
EID041-G01和EID041-G01S系列RS485温湿度传感器模块内置了高精度传感器,体积小巧,特别适合空间有限的安装环境。该系列产品配备RS485通信接口,采用标准Modbus-RTU协议,用户可以轻松设置Modbus地址和波特率,以适应不同的系统需求。其支持DIN35导轨安装方式,便于快速集成到工业自动化环境中。
产品型号及传感器
该系列产品提供两种型号,分别内置不同的高精度数字温湿度传感器:
EID041-G01:内置AHT20传感器
EID041-G01S:内置SHT30传感器
二、功能特点
RS485温湿度传感器模块具备以下功能特点:
高精度传感器:内置国外进口的高精度数字温湿度传感器,确保测量数据的准确性。
宽电压供电:支持5~36V直流宽压供电,并具有防反接保护,适应性强。
RS485通信接口:支持标准Modbus RTU协议,便于与上位机或其他设备通信。
宽测量范围:温度测量范围为-40℃~+125℃,湿度测量范围为0~100%。
灵活配置:支持1~255个Modbus地址设置,以及8种波特率配置。
便捷安装:具有可插拔端子,支持定位孔、导轨安装,安装维护简单方便。
三、技术指标
规格参数
电源:工作电压DC 5~36V,电源指示为绿色LED灯。
通讯接口:RS485,波特率4800-115200bps,支持标准Modbus RTU协议。
采集精度:
EID041-G01:温度精度±0.3℃,湿度精度±2%RH。
EID041-G01S:温度精度±0.2℃,湿度精度±2%RH。
采集范围:温度-40℃~+125℃,湿度0~100%。
功耗:最大功耗0.1W。
尺寸:82mm×45mm×28.5mm,支持定位孔、导轨安装。
默认参数
Modbus地址:默认为1。
波特率:默认为9600bps。
校验位:无校验。
数据位:8位。
停止位:1位。
四、快速使用
设备接线
在使用RS485温湿度传感器模块时,需注意485总线高频信号传输时的信号反射问题。建议在传输线末端加终端电阻,通常为120欧姆,以匹配总线阻抗,提高数据通信的抗干扰性和可靠性。
采集测试
设备连接完成后,可通过串口助手进行采集测试。例如,向设备发送报文01 04 00 00 00 02 71 CB,可同时采集第一通道的温度和湿度。设备将回复类似01 04 04 00 F3 01 2A 8B F8的报文,通过解析该报文,可获取实际的温湿度数据。
五、寄存器功能定义
输入寄存器
温度值:寄存器地址0x0000(10进制为1),单位为℃,正温度直接读取,负温度以补码形式上传。
湿度值:寄存器地址0x0001(10进制为2),单位为%RH,计算方法为固定1位小数点。
保持寄存器
Modbus地址:寄存器地址0x000A(10进制为11),设置范围为1~255,修改后需重启生效。
波特率:寄存器地址0x000B(10进制为12),提供8种波特率配置,修改后需重启生效。
奇偶校验:寄存器地址0x003D(10进制为62),可设置无校验、奇校验或偶校验,修改后需重启生效。
六、应用场景
RS485温湿度传感器模块广泛应用于工业现场设备的信号采集与控制,适用于各类需要精准温湿度监测的环境。无论是生产车间、仓储物流还是环境监测等领域,该系列产品都能提供可靠的解决方案,确保环境参数始终处于理想状态,从而保障生产效率和产品质量。
温湿度传感器源代码分享
#define GET_I2C_SDA() GPIO_ReadDataBit(GPIOF,GPIO_Pin_7) // 读取SDA端口#define SET_I2C_SCL() GPIO_SetBits(GPIOF,GPIO_Pin_6) // 时钟线SCL输出高电平#define CLR_I2C_SCL() GPIO_ResetBits(GPIOF,GPIO_Pin_6) // 时钟线SCL输出低电平#define SET_I2C_SDA() GPIO_SetBits(GPIOF,GPIO_Pin_7) // 数据线SDA输出高电平#define CLR_I2C_SDA() GPIO_ResetBits(GPIOF,GPIO_Pin_7) // 数据线SDA输出低电平 #define I2C_DELAY 10 static void GpioInit(void){ /*配置I2C管脚的功能 */ GPIO_InitTypeDefGPIO_InitStructure;//定义一个GPIO_InitTypeDef类型的结构体 GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6 | GPIO_Pin_7;//选择要控制的GPIO引脚 GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OutOD;//设置引脚模式为 GPIO_InitStructure.GPIO_Pull= GPIO_Pull_NoPull;//模式 GPIO_Init(GPIOF,&GPIO_InitStructure); //GPIOF GPIO_Pin_7 I2C0 SDA//GPIOF GPIO_Pin_6 I2C0 SCL } /********************************************************************** @function 产生IIC起始时序,准备发送或接收数据前必须由起始序列开始* @param* @return * @brief SCL为高电平时,SDA由高电平向低电平跳变,开始传输数据 * 生成下图所示的波形图,即为起始时序 * 1 2 3 4 * __________ * SCL : __/ \_____ * ________ * SDA : \___________ ********************************************************************/static void I2CStart(void){ SET_I2C_SDA(); // 1#数据线SDA输出高电平 SET_I2C_SCL(); // 2#时钟线SCL输出高电平 DelayNus(I2C_DELAY); // 延时4us CLR_I2C_SDA(); // 3#数据线SDA输出低电平 DelayNus(I2C_DELAY); // 延时4us CLR_I2C_SCL(); // 4#时钟线SCL输出低电平,保持I2C的时钟线SCL为低电平,准备发送或接收数据 DelayNus(I2C_DELAY); // 延时4us} /********************************************************************** @function 产生IIC停止时序* @param* @return * @brief SCL为高电平时,SDA由低电平向高电平跳变,结束传输数据 * 生成下图所示的波形图,即为停止时序 * 1 2 3 4 * _______________ * SCL : ______/ * __ ____________* SDA: \______/********************************************************************/static void I2CStop(void){ CLR_I2C_SDA(); //2#数据线SDA输出低电平 DelayNus(I2C_DELAY); //延时4us SET_I2C_SCL(); //3#时钟线SCL输出高电平 DelayNus(I2C_DELAY); SET_I2C_SDA(); //4#数据线SDA输出高电平,发送I2C总线结束信号} /********************************************************************** @function 发送一字节,数据从高位开始发送出去* @param byte* @return * @brief 下面是具体的时序图 * 1 2 3 4* ______* SCL: ________/ \______ * ______________________ * SDA: \\\___________________********************************************************************/static void I2CSendByte(uint8_t byte){ for(uint8_t i = 0; i < 8; i++) // 循环8次,从高到低取出字节的8个位 { if((byte & 0x80)) // 2#取出字节最高位,并判断为‘0’还是‘1’,从而做出相应的操作 { SET_I2C_SDA(); // 数据线SDA输出高电平,数据位为‘1’ } else { CLR_I2C_SDA(); // 数据线SDA输出低电平,数据位为‘0’ } byte<<= 1; // 左移一位,次高位移到最高位 DelayNus(I2C_DELAY); // 延时4us SET_I2C_SCL(); // 3#时钟线SCL输出高电平 DelayNus(I2C_DELAY); // 延时4us CLR_I2C_SCL(); // 4#时钟线SCL输出低电平 DelayNus(I2C_DELAY); // 延时4us }} /********************************************************************** @function 读取一字节数据* @param * @return读取的字节* @brief 下面是具体的时序图* ______* SCL: ______/ \___ * ____________________ * SDA: \\\\______________\\\********************************************************************/static uint8_t I2CReadByte(void){ uint8_tbyte = 0; // byte用来存放接收的数据 SET_I2C_SDA(); // 释放SDA for(uint8_t i = 0; i < 8; i++) // 循环8次,从高到低读取字节的8个位 { SET_I2C_SCL(); //时钟线SCL输出高电平 DelayNus(I2C_DELAY); //延时4us byte<<= 1; // 左移一位,空出新的最低位 if(GET_I2C_SDA()) // 读取数据线SDA的数据位 { byte++; //在SCL的上升沿后,数据已经稳定,因此可以取该数据,存入最低位 } CLR_I2C_SCL(); //时钟线SCL输出低电平 DelayNus(I2C_DELAY); //延时4us } returnbyte; // 返回读取到的数据} /********************************************************************** @function 等待接收端的应答信号* @param * @return1,接收应答失败;0,接收应答成功* @brief 当SDA拉低后,表示接收到ACK信号,然后,拉低SCL,* 此处表示发送端收到接收端的ACK* _______|____ * SCL: | \_________ * _______| * SDA: \_____________ ********************************************************************/static bool I2CWaitAck(void){ uint16_terrTimes = 0; SET_I2C_SDA(); // 释放SDA总线,很重要 DelayNus(I2C_DELAY); // 延时4us SET_I2C_SCL(); // 时钟线SCL输出高电平 DelayNus(I2C_DELAY); // 延时4us while(GET_I2C_SDA()) // 读回来的数据如果是高电平,即接收端没有应答 { errTimes++; // 计数器加1 if(errTimes > 250) // 如果超过250次,则判断为接收端出现故障,因此发送结束信号 { I2CStop(); // 产生一个停止信号 returnfalse; // 返回值为1,表示没有收到应答信号 } } CLR_I2C_SCL(); // 表示已收到应答信号,时钟线SCL输出低电平 DelayNus(I2C_DELAY); // 延时4us returntrue; // 返回值为0,表示接收应答成功} /********************************************************************** @function 发送应答信号* @param * @return* @brief 下面是具体的时序图 * 1 2 3 4 5 * ______* SCL: ________/ \____________ * __ ______* SDA: \___________________/ ********************************************************************/void I2CSendAck(void){ CLR_I2C_SDA(); // 2#数据线SDA输出低电平 DelayNus(I2C_DELAY); // 延时4us SET_I2C_SCL(); // 3#时钟线SCL输出高电平,在SCL上升沿前就要把SDA拉低,为应答信号 DelayNus(I2C_DELAY); // 延时4us CLR_I2C_SCL(); // 4#时钟线SCL输出低电平 DelayNus(I2C_DELAY); // 延时4us SET_I2C_SDA(); // 5#数据线SDA输出高电平,释放SDA总线,很重要} /********************************************************************** @function 发送非应答信号* @param * @return* @brief 下面是具体的时序图 * 1 2 3 4* ______* SCL: ________/ \______ * __ ___________________ * SDA: __/********************************************************************/void I2CSendNack(void){ SET_I2C_SDA(); // 2#数据线SDA输出高电平 DelayNus(I2C_DELAY); // 延时4us SET_I2C_SCL(); // 3#时钟线SCL输出高电平,在SCL上升沿前就要把SDA拉高,为非应答信号 DelayNus(I2C_DELAY); // 延时4us CLR_I2C_SCL(); // 4#时钟线SCL输出低电平 DelayNus(I2C_DELAY); // 延时4us} #define NSHT30_DEV_ADDR 0x44 //NSHT30的设备地址#define NSHT30_I2C_WR 0 //写控制bit#define NSHT30_I2C_RD 1 // 读控制bit#define TRIG_TEMP_MEASUREMENT_HM 0xE3 // command trig. temp meas. hold master#define TRIG_HUMI_MEASUREMENT_HM 0xE5 // command trig. humiditymeas. hold master#define TRIG_TEMP_MEASUREMENT_POLL 0xF3 // command trig. tempmeas. no hold master#define TRIG_HUMI_MEASUREMENT_POLL 0xF5 // command trig. humiditymeas. no hold master #define TRIG_TEMP_HUMI_MEASUREMENT 0x2C06 // command trig.humiditytemp meas#define NSHT30_SOFT_RESET 0x30A2 // command soft reset#define NSHT30_RESOLUTION_REG 0xE6 // 设置分辨率寄存器地址#define NSHT30_RESOLUTION_VAL 0x83 // 设置分辨率bit7 = 1,bit0 = 0,对应湿度10bit,温度13bit#define NSHT30_READ_REG 0XE7 //NSHT30驱动代码#define CMD_MEAS_SINGLE_H 0x2400 //measurement: SINGLE Mode high repeatability#define CMD_MEAS_SINGLE_M 0x240B //measurement: SINGLE Mode medium repeatability#define CMD_MEAS_SINGLE_L 0x2416 //measurement: SINGLE Mode low repeatability#define CMD_MEAS_PERI_05_H 0x2032 //measurement: periodic Mode 0.5 mps high repeatability#define CMD_MEAS_PERI_05_M 0x2024 //measurement: periodic Mode 0.5 mps medium repeatability#define CMD_MEAS_PERI_05_L 0x202F //measurement: periodic Mode 0.5 mps low repeatability#define CMD_MEAS_PERI_1_H 0x2130 //measurement: periodic Mode 1 mps high repeatability#define CMD_MEAS_PERI_1_M 0x2126 //measurement: periodic Mode 1 mps medium repeatability#define CMD_MEAS_PERI_1_L 0x212D //measurement: periodic Mode 1 mps low repeatability#define CMD_MEAS_PERI_2_H 0x2236 //measurement: periodic Mode 2 mps high repeatability#define CMD_MEAS_PERI_2_M 0x2220 //measurement: periodic Mode 2 mps medium repeatability#define CMD_MEAS_PERI_2_L 0x222B //measurement: periodic Mode 2 mps low repeatability#define CMD_MEAS_PERI_4_H 0x2334 //measurement: periodic Mode 4 mps high repeatability#define CMD_MEAS_PERI_4_M 0x2322 //measurement: periodic Mode 4 mps medium repeatability #define CMD_MEAS_PERI_4_L 0x2329 //measurement: periodic Mode 4 mps low repeatability#define CMD_MEAS_PERI_10_H 0x2737 //measurement: periodic Mode 10 mps high repeatability#define CMD_MEAS_PERI_10_M 0x2721 //measurement: periodic Mode 10 mps medium repeatability#define CMD_MEAS_PERI_10_L 0x272A //measurement: periodic Mode 10 mps low repeatability static bool Nsht30SoftReset(void) { I2CStart(); I2CSendByte((NSHT30_DEV_ADDR<<1)| NSHT30_I2C_WR); if(!I2CWaitAck()) { gotoi2c_err; } I2CSendByte((NSHT30_SOFT_RESET&0xFF00)>>8); if(!I2CWaitAck()) { gotoi2c_err; } I2CSendByte(NSHT30_SOFT_RESET&0xFF); if(!I2CWaitAck()) { gotoi2c_err; } I2CStop(); returntrue; i2c_err: // 命令执行失败后,要发送停止信号,避免影响I2C总线上其他设备 I2CStop(); returnfalse;} static bool Nsht30SetResolution(uint8_t*pBuffer){ uint16_tnumToRead=5; I2CStart(); I2CSendByte((NSHT30_DEV_ADDR<<1)| NSHT30_I2C_WR); if(!I2CWaitAck()) { gotoi2c_err; } I2CSendByte((CMD_MEAS_SINGLE_L&0xFF00)>>8); if(!I2CWaitAck()) { gotoi2c_err; } I2CSendByte(CMD_MEAS_SINGLE_L&0xFF); if(!I2CWaitAck()) { gotoi2c_err; } I2CStop(); DelayNms(I2C_DELAY); I2CStart(); // 发送起始信号 I2CSendByte((NSHT30_DEV_ADDR<<1)| NSHT30_I2C_RD); // 发送器件地址和读写模式,1 0 1 0 xxx R/~W0xA1 if(!I2CWaitAck()) // 等待应答 { gotoi2c_err; } while(numToRead--) // 数据未读完 { *pBuffer++= I2CReadByte(); // 逐字节读出存放到数据数组 I2CSendAck(); } *pBuffer= I2CReadByte(); // 最后一个字节发送非应答 I2CSendNack(); I2CStop();i2c_err: // 命令执行失败后,要发送停止信号,避免影响I2C总线上其他设备 I2CStop(); returnfalse;} bool TempHumizhuanhuan(uint8_t *dat,double*pot){ uint16_ttem,hum; tem= ((uint16_t)dat<<8) | dat; hum= ((uint16_t)dat<<8) | dat; if((crc8(dat,2)== dat) && (crc8(dat+3,2) == dat)) { pot=(175.0*(double)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1) pot=(100.0*(double)hum/65535.0);// RH = hum*100 / (2^16-1) return1; } else { return0; }}float tempData, humiData;uint8_t buffer;double rth;void TempHumiDrvTest(void){ Nsht30SetResolution(buffer); printf("Get%x %x %x %x %x%x\n",buffer,buffer,buffer,buffer,buffer,buffer); TempHumizhuanhuan(buffer,rth); printf("%3.4f,%3.6f%%\r\n",rth,rth);}
页:
[1]