这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » 【炫Q香蕉派】SHT21温湿度采集

共10条 1/1 1 跳转至

【炫Q香蕉派】SHT21温湿度采集

专家
2016-02-13 23:17:02     打赏

温湿度传感器已经接到香蕉派上许久了,虽然wiringpi也通过了,但是编程能力有限,一直没有读出温湿度来



专家
2016-02-13 23:19:04     打赏
2楼

也曾在国内各大论坛搜寻,不过没有什么收获,放假归来,想到了万能的github抱着试试的心理还是搜寻,最终找到一个比较靠谱的资源,是树莓派的

https://github.com/Tronde/Raspi-SHT21

git clone https://github.com/Tronde/Raspi-SHT21.git

 


专家
2016-02-13 23:26:11     打赏
3楼

编译很顺利,但是运行不正常,毕竟人家是为树莓派写的

vi main.c

 


专家
2016-02-13 23:26:48     打赏
4楼

找到相关代码

	if(!Mode) 
	{
		printf("Raspi-SHT21 V3.0.0 by Martin Steppuhn (www.emsystech.de) [" __DATE__ " " __TIME__"]\n");
		printf("Options:\n");
		printf("   S : [20.0 99]\n");	
		printf("   L : [temperature=20.0][humidity=99]\n");	
		printf("   C : [Temperature,20,0][Humidity,99]\n");
		printf("RaspberryHwRevision=%i\r\n",HwRev);
	}	
	
	if(HwRev < 2) 	I2C_Open("/dev/i2c-0");	 // Hardware Revision 1.0
		else		I2C_Open("/dev/i2c-1");  // Hardware Revision 2.0
	I2C_Setup(I2C_SLAVE, 0x40);

 


专家
2016-02-13 23:28:37     打赏
5楼

回看获取到的版本是1

RaspberryHwRevision=1

 

在香蕉派上我们用到的是i2c-2,所以需要修改一下

	if(HwRev < 2) 	I2C_Open("/dev/i2c-2");	 // Hardware Revision 1.0
		else		I2C_Open("/dev/i2c-1");  // Hardware Revision 2.0
	I2C_Setup(I2C_SLAVE, 0x40);

 


专家
2016-02-13 23:30:26     打赏
6楼

还算顺利吧,这么就调试通过了,意外


专家
2016-02-13 23:39:39     打赏
7楼

虽然还看不懂代码,但总结一下主线似乎就是i2c操作

I2C_Open("/dev/i2c-2");
I2C_Setup(I2C_SLAVE, 0x40);
SHT21_Read(&Temperature,&Humidity);
I2C_Close();

 


专家
2016-02-13 23:40:45     打赏
8楼
uint8 SHT21_Read(int16 *temperature,uint8 *humidity)
{
	uint32	val;
	uint8	buf[4];
		
	Sht21Error = 0;
	
	//=== Softreset ==================================================
	
	I2C_Write1(0xFE);			// softreset < 15ms
	DelayMs(50);
	
	//=== Temperature =================================================

	I2C_Write1(0xF3);			// start temperature measurement
	DelayMs(260);				// Temperature@14Bit typ=66ms max=85ms
	I2C_Read(buf,3);			// read temperature data
	
	if(buf[2] == CalcSht21Crc(buf,2))  // check CRC
	{
		val = buf[0];
		val <<= 8;
		val += buf[1];
		val &= 0xFFFC;
  		  		
		//	T = -46,85 + 175,72 * St/65535      da 1/10K -->  * 10
		//	T = -468,5 + 1757,2 * St/65535		verinfachen
		//	T = -468,5 + St / 37,2956..			damit Konstante ganzzahlig wird mit 2 erweitern
		//  T = -937 + 2*St / 37,2956..			Bruch f黵 Division mit 256 erweitern  
		//	T = (-937 +  (St * 512) / (37,2956.. * 256)  )  / 2
		//	T = (((St * 512) / 9548) - 937) / 2
  	  		
		//	val = (((val * 512) / 9548) - 937) / 2;
		*temperature = ((val * 512) / 9548);
		*temperature = ((*temperature) - 937) / 2;       
	}
	else
	{
		Sht21Error |= ERROR_SHT21_CRC_TEMP;
	}
	
	//=== Humidity ===================================================

	I2C_Write1(0xF5);			// start humidity measurement
	DelayMs(60);				// RH@12Bit typ=22ms max=20ms 
	I2C_Read(buf,3);			// read humidity data
	
  	if(buf[2] == CalcSht21Crc(buf,2))
	{	
  		val = buf[0];
  		val <<= 8;
  		val += buf[1];
  		val &= 0xFFFC;
  		  			
  		//   T = -6 + 125* Srh/65535      
  		//	 T = -6 + Srh / 524,28
  		//   T = -6 + (Srh * 256) / 134215      |  *256	 wegen Numerik erweitern
  	  		  		
  		val = ((val * 256) / 134215) - 6;
  		*humidity = val;
	}	
	else
	{
		Sht21Error |= ERROR_SHT21_CRC_TEMP;
	}
	
	if(I2cError) Sht21Error |= ERROR_SHT21_I2C;
	
	
	
	return Sht21Error;
}

 


专家
2016-02-13 23:47:45     打赏
9楼
又看了一下i2c的源文件,无非是一些设备操作,应该是linux下的通用处理方法吧,基本脉络也算理清楚了

专家
2016-02-13 23:53:44     打赏
10楼

相比较之下wiringpi写得比较抽象,怪不得没用好呢,慢慢习惯吧

union i2c_smbus_data
{
  uint8_t  byte ;
  uint16_t word ;
  uint8_t  block [I2C_SMBUS_BLOCK_MAX + 2] ;	// block [0] is used for length + one more for PEC
} ;

struct i2c_smbus_ioctl_data
{
  char read_write ;
  uint8_t command ;
  int size ;
  union i2c_smbus_data *data ;
} ;

static inline int i2c_smbus_access (int fd, char rw, uint8_t command, int size, union i2c_smbus_data *data)
{
  struct i2c_smbus_ioctl_data args ;

  args.read_write = rw ;
  args.command    = command ;
  args.size       = size ;
  args.data       = data ;
  return ioctl (fd, I2C_SMBUS, &args) ;
}

 


共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]