| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Jul 04, 2016 4:02 am |   |  
				| 
 |  
				| The humidity will decrease when the chip is heated. 
 The chip assumes it's temperature, is the air temperature. For a given amount of moisture in the air, the RH is lower the hotter the air is. Heat the chip, and the RH measure will fall.
 |  |  
		|  |  
		| devilfrmheaven 
 
 
 Joined: 09 Feb 2016
 Posts: 53
 
 
 
			    
 
 | 
			
				| Bad Sensor.. Closing thread |  
				|  Posted: Wed Jul 06, 2016 4:35 am |   |  
				| 
 |  
				| After a lot of testing, I find that both my sensors are damaged and giving wrong reading. 
 The updated driver code that was updated here works.
 
 I am closing this thread and marking it as solved.
 _________________
 Regards,
 Devil
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Wed Jul 06, 2016 7:23 am |   |  
				| 
 |  
				|   
 Sad. I just spent two days debugging why a unit wouldn't do what I expected to find it was a faulty moulding hidden inside a connector system...
 
 Happens I'm afraid.
 |  |  
		|  |  
		| devilfrmheaven 
 
 
 Joined: 09 Feb 2016
 Posts: 53
 
 
 
			    
 
 | 
			
				| Thanks for your time |  
				|  Posted: Sun Jul 17, 2016 12:35 pm |   |  
				| 
 |  
				| Thanks Mr T. 
 I closed the thread because I ordered new sensors. It will take 1 month to get delivered.
 
 Its good not to keep threads open.
 _________________
 Regards,
 Devil
 |  |  
		|  |  
		| gmyu 
 
 
 Joined: 06 Jan 2009
 Posts: 3
 
 
 
			    
 
 | 
			
				| Re: SHT21 - updated driver code. |  
				|  Posted: Thu Jan 11, 2018 8:43 pm |   |  
				| 
 |  
				| int16 humidum;  should be ... uint16 humidum;
 Else, when humidum is more then 55%, this var will be a negative. Also change this --- int16 temperies;
 ==========================================
 
 
  	  | devilfrmheaven wrote: |  	  | Hi All, 
 I am placing the udpated driver file here just incase if someone needs it.
 
 
 
  	  | Code: |  	  | 
 ////////////////////////////////////////////////////////////////////////////////
 ///                               sht21.c                                    ///
 ///            Driver for temperature and humidity sensor                    ///
 ///            Realizado por PicTrance                                       ///
 ///            junio del 2011, Puebla - México                               ///
 ///            Compiler: CCS                                                 ///
 ///         Updated July 04, 2016 --- devilfrmheaven www.ccsinfo.com         ///
 ///                                                                          ///
 /// sht21_init()  - Iicializa el sensor sht21 -                              ///
 ///                                                                          ///
 ///                                                                          ///
 /// sht21_temp(temperatura)      Get the temperature, lee tempeartura        ///
 ///                                                                          ///
 /// sht21_humid(humedad)         Get the humidity, lee humedad               ///
 ///                                                                          ///
 /// sht21_both(temp,humd)        Get the temperature and humidity            ///
 ///                              Lee temperatura y humedad                   ///
 ////////////////////////////////////////////////////////////////////////////////
 #define sht21     0b10000000
 #define writeuser 0b11100110
 #define readuser  0b11100111
 #define reset     0b11111110
 #define temphold  0b11100011
 #define humidhold 0b11100101
 #define read      0b10000001
 #define softreset 0b11111110
 
 /*int8 msbhum, lsbhum, msbtemp, lsbtemp, checksum;
 int16 temperies, humidum;
 float temperiess, humidumm;*/
 
 int8 checksum;
 
 void sht21_init(void){
 i2c_start();
 i2c_write(sht21);
 i2c_write(softreset);
 i2c_stop();
 delay_ms(15);
 }
 
 void SoftResett(){
 i2c_start();
 i2c_write(sht21);
 i2c_write(softreset);
 i2c_stop();
 delay_ms(15);
 }
 
 void sht21_temp(float &temperies1){
 //float temperies1;
 int8 msbtemp, lsbtemp;
 int16 temperies;
 float temperiess;
 i2c_start();
 i2c_write(sht21);
 i2c_write(temphold);
 i2c_start();
 i2c_write(read);
 msbtemp = i2c_read();
 lsbtemp = i2c_read();
 checksum = i2c_read(0);
 //i2c_read(0);
 i2c_stop();
 temperies = make16(msbtemp,lsbtemp);//valiable = MAKE16(varhigh, varlow) junta las
 //2 variables in8 en una in16
 
 /*#ASM
 movf lsbtemp,0
 movwf 0x00A
 movf msbtemp,0
 movwf 0x00B
 #ENDASM*/
 
 temperiess=temperies;
 temperies1= (-46.85 + (175.72*(temperiess/65536)));
 SoftResett();
 //return temperies1;
 }
 
 void sht21_humid(float &humidum1){
 //float humidum1;
 int8 msbhum, lsbhum;
 int16 humidum;
 float humidumm;
 i2c_start();
 i2c_write(sht21);
 i2c_write(humidhold);
 i2c_start();
 i2c_write(read);
 //delay_ms(25);
 msbhum = i2c_read();
 lsbhum = i2c_read();
 checksum = i2c_read(0);
 
 //i2c_read(0);
 i2c_stop();
 
 lsbhum &= 0XFC; /// Thanks to Ttelmah @ www.ccsinfo.com
 humidum = make16(msbhum,lsbhum);
 /*#ASM
 movf lsbhum,0
 movwf 0x00C
 movf msbhum,0
 movwf 0x00D
 #ENDASM*/
 
 humidum1= (-6 + (0.00190734*humidum)); ///// Thanks to Ttelmah @ www.ccsinfo.com
 SoftResett();
 //return humidum1;
 }
 
 void sht21_both(float &tmp, float &humd){
 /*float temp;
 float humedad;*/
 sht21_temp(tmp);
 delay_us(800);
 sht21_humid(humd);
 }
 
 
 | 
 | 
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jan 12, 2018 3:14 am |   |  
				| 
 |  
				| as a comment to the above, the reason 'int16' was used, is that on a PIC16 or 18, with CCS, a int16, by default _is_ unsigned. So the problem won't occur. It will only be a problem if the code is moved to a PIC24/30/33, where the default int16, is signed. It is better to be explicit, but this is 'why' this was not seen by some people....  |  |  
		|  |  
		| gmyu 
 
 
 Joined: 06 Jan 2009
 Posts: 3
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Jan 14, 2018 8:35 pm |   |  
				| 
 |  
				| Thx! I just use PIC24 series. 
 And I have changed the calc code to int from float, it should save CPU resource.
 
  	  | Code: |  	  | void sht21_HT(void){ //float &temperies1,float &humidum1){
 uint8 msbX, lsbX;
 uint16 uiX,humidum;
 int16 iValue;
 int32 lValue;  //  float temperiess;
 i2c_start();   i2c_write(sht21);    i2c_write(temphold);
 i2c_start();   i2c_write(read);
 msbX = i2c_read();
 lsbX = i2c_read(0);
 lsbX &= 0XFC;    //checksum = i2c_read(0);
 i2c_stop();
 uiX = make16(msbX,lsbX);//valiable = MAKE16(varhigh, varlow) junta las
 lValue=uiX;  //   lValue+=(372.95*30);  //-25deg=373*25
 lValue=(lValue*17572)/65536-4685;
 iValue = lValue;
 //temperies1= (-46.85 + (175.72*((float)uiX/65536)));
 
 delay_ms(10);  //T=85mS H=29mS
 i2c_start();   i2c_write(sht21);  i2c_write(humidhold);
 i2c_start();  i2c_write(read);
 msbX = i2c_read();
 lsbX = i2c_read(0);
 lsbX &= 0XFC;   //checksum = i2c_read(0);
 i2c_stop();
 uiX = make16(msbX,lsbX);//valiable = MAKE16(varhigh, varlow) junta las
 //   humidum1= (-6 + (125.0/65536*uiX));
 uiX>>=2;   uiX = uiX/13-60;  //*10 Humidum%
 //temperiess=uiX;
 
 }
 | 
 |  |  
		|  |  
		| gmyu 
 
 
 Joined: 06 Jan 2009
 Posts: 3
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Jan 14, 2018 8:39 pm |   |  
				| 
 |  
				|  	  | Ttelmah wrote: |  	  | as a comment to the above, the reason 'int16' was used, is that on a PIC16 or 18, with CCS, a int16, by default _is_ unsigned. So the problem won't occur. It will only be a problem if the code is moved to a PIC24/30/33, where the default int16, is signed. It is better to be explicit, but this is 'why' this was not seen by some people....  | 
 
 Could you give my any advice for i2c setting?
 I use the I2C1 force_hw,  it have 2 selection in wizard, the default is B8/B9, I want set to A0/A1 but the wizard program no any difference in generate code. What can I do? Thx!
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Jan 15, 2018 1:19 am |   |  
				| 
 |  
				| You need to tell us your chip..... 
 The odds are that it is a fuse (most chips offering just two addresses have these selected this way).
 
 There would be no difference in the code, except for the fuse to change the pins used.
 |  |  
		|  |  
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9589
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Jan 15, 2018 6:12 am |   |  
				| 
 |  
				| also 
 Do NOT rely on the'wizard' ! You can easily cut code without it AND you'll be a better programmer for doing so.
 The 'wizard' is just one person's idea of how to setup a PIC,NOT yours or mine. It can easily have a 'bug' in it saying 'this' but coding 'that' and you'll waste a a lot of time trying to figure out what you did wrong when it's the 'wizards' fault. I say the same about 'Proteus' all the time..it's full of errors yet code 'compiles' that will never, ever work in the Real World.
 Read the I2C section of the MSSP of the datasheet, 2, 3, 20 times whatever it takes so that you understand the peripheral, it's registers and options. Read a book like 'How I2C works'.... and of course read the CCS manual chapters for I2C functions.
 The more you read, the more you'll learn. I understand English is hard and I grew up with it ! PICs by their nature are technical and new ones are very complicated BUT once you understand them it all makes sense.
 
 Jay
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |