با سلام خدمت تمام اساتید گل
کسی راجع به این سنسور اطلاعاتی داره ؟
آخرین قیمت روز ؟
با تشکر
یا حق
کسی راجع به این سنسور اطلاعاتی داره ؟
آخرین قیمت روز ؟
با تشکر
یا حق
/********************************************* Pin 1 GND Pin 2 Data (PB0) Pin 3 Serial Clock (PB1) Pin 4 VDD (2.4V to 5.5V) *********************************************/ #include <mega32.h> #include <stdio.h> #include <delay.h> #include <math.h> #include <stdlib.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x1B ;PORTB #endasm #include <lcd.h> // Declare your global variables here typedef union { unsigned int i; float f;} value; enum {TEMP,HUMI}; sfrb PINB = 0x16; sfrb PORTB = 0x18; sfrb DDRB = 0x17; #define SHT_DATA_OUT DDRB.0 #define SHT_DATA_IN PINB.0 #define SHT_SCK PORTB.1 #define noACK 0 #define ACK 1 //adr command r/w #define STATUS_REG_W 0x06 //000 0011 0 #define STATUS_REG_R 0x07 //000 0011 1 #define MEASURE_TEMP 0x03 //000 0001 1 #define MEASURE_HUMI 0x05 //000 0010 1 #define RESET 0x1e //000 1111 0 const float C1=-4.0; // for 12 Bit const float C2=+0.0405; // for 12 Bit const float C3=-0.0000028; // for 12 Bit const float T1=+0.01; // for 14 Bit @ 5V const float T2=+0.00008; // for 14 Bit @ 5V //SHT Functions char SHT_WriteByte(unsigned char valuep); char SHT_ReadByte(unsigned char ack); void s_transstart(void); void s_connectionreset(void); char s_softreset(void); char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode); void calc_sth11(float *p_humidity ,float *p_temperature); float calc_dewpoint(float h,float t); unsigned char key=16,uch_TempTime_Number=0; int intTemp1=0,intTime1=0,intTemp2=0,intTime2=0,intTemp3=0,intTime3=0; int intTemp4=0,intTime4=0,intTemp5=0,intTime5=0,intTemp6=0,intTime6=0; void print_temp_humy (void) { char str_hum_temp[10]; value humi_val, temp_val; unsigned char error, checksum, status; float dew_point; error=0; error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); if(error!=0) s_connectionreset(); else{ humi_val.f=(float)humi_val.i; //converts integer to float temp_val.f=(float)temp_val.i; //converts integer to float calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity, temperature dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point } temp_val.f+=10; ftoa(temp_val.f,0,str_hum_temp); lcd_clear(); lcd_putsf("Tempreature: "); lcd_puts(str_hum_temp); ftoa(humi_val.f,0,str_hum_temp); lcd_gotoxy(0,1); lcd_putsf("Humydity: "); lcd_puts(str_hum_temp); } void main(void) { // Declare your local variables here PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; DDRC=0x0F; PORTC=0xF0; DDRD=0x0F; PORTD=0xF0; TCCR0=0x00; TCNT0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x08; TCCR2=0x05; TCNT2=0x00; OCR2=0x00; //GIMSK=0x00; MCUCR=0x00; TIMSK=0x40; ACSR=0x80; // Setup Sensibus Pins PORTB.1 = 0; // ClockLow DDRB.1 = 1; // SCK is an output PORTB.0 = 0; // Always Zero // Toggle DDRB.0 for Data // LCD module initialization lcd_init(16); Start: s_softreset(); print_temp_humy(); while (1) { delay_ms(500); print_temp_humy(); goto Start; } } //---------------------------------------------------------------------------------- // tulis byte ke SHT //---------------------------------------------------------------------------------- char SHT_WriteByte(unsigned char valuep) { unsigned char i,error=0; for (i=0x80;i>0;i/=2) { if (i & valuep) SHT_DATA_OUT=0; else SHT_DATA_OUT=1; SHT_SCK=1; delay_us(5); //pulswith approx. 5 us SHT_SCK=0; } SHT_DATA_OUT=0; //release DATA-line SHT_SCK=1; //clk #9 for ack error=SHT_DATA_IN; //check ack (DATA will be pulled down by SHT11) SHT_SCK=0; return error; //error=1 in case of no acknowledge } //---------------------------------------------------------------------------------- // baca byte dari SHT, dan berikan ACK //---------------------------------------------------------------------------------- char SHT_ReadByte(unsigned char ack) { unsigned char i,val=0; SHT_DATA_OUT=0; //release DATA-line for (i=0x80;i>0;i/=2) { SHT_SCK=1; if (SHT_DATA_IN) val=(val | i); //read bit SHT_SCK=0; } SHT_DATA_OUT=ack; //in case of "ack==1" pull down DATA-Line SHT_SCK=1; //clk #9 for ack delay_us(5); //pulswith approx. 5 us SHT_SCK=0; SHT_DATA_OUT=0; //release DATA-line return val; } //---------------------------------------------------------------------------------- // kondisi start // _____ ________ // DATA: |_______| // ___ ___ // SCK : ___| |___| |______ //---------------------------------------------------------------------------------- void s_transstart(void) { SHT_DATA_OUT=0; SHT_SCK=0; //Initial state delay_us(1); SHT_SCK=1; delay_us(1); SHT_DATA_OUT=1; delay_us(1); SHT_SCK=0; delay_us(5); SHT_SCK=1; delay_us(1); SHT_DATA_OUT=0; delay_us(1); SHT_SCK=0; } //---------------------------------------------------------------------------------- // reset koneksi, 9 clock diikuti dengan kondisi start // _____________________________________________________ ________ // DATA: |_______| // _ _ _ _ _ _ _ _ _ ___ ___ // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______ //---------------------------------------------------------------------------------- void s_connectionreset(void) { unsigned char i; SHT_DATA_OUT=0; SHT_SCK=0; //Initial state for(i=0;i<9;i++) //9 SCK cycles { SHT_SCK=1; delay_us(1); SHT_SCK=0; } s_transstart(); //transmission start } //---------------------------------------------------------------------------------- // reset SHT-nya !! //---------------------------------------------------------------------------------- char s_softreset(void) { unsigned char error=0; s_connectionreset(); //reset communication error+=SHT_WriteByte(RESET); //send RESET-command to sensor return error; //error=1 in case of no response form the sensor } //---------------------------------------------------------------------------------- // pengukuran data //---------------------------------------------------------------------------------- char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) { unsigned error=0; unsigned int i; s_transstart(); //transmission start switch(mode){ //send command to sensor case TEMP : error+=SHT_WriteByte(MEASURE_TEMP); break; case HUMI : error+=SHT_WriteByte(MEASURE_HUMI); break; default : break; } for (i=0;i<65535;i++) if(SHT_DATA_IN==0) break; //wait until sensor has finished the measurement if(SHT_DATA_IN) error+=1; // or timeout (~2 sec.) is reached *(p_value+1) =SHT_ReadByte(ACK); //read the first byte (MSB) *(p_value) =SHT_ReadByte(ACK); //read the second byte (LSB) *p_checksum =SHT_ReadByte(noACK); //read checksum return error; } //---------------------------------------------------------------------------------------- // hitung temperature [°C] and humidity [%RH] // input : humi [Ticks] (12 bit) // temp [Ticks] (14 bit) // output: humi [%RH] // temp [°C] //---------------------------------------------------------------------------------------- void calc_sth11(float *p_humidity ,float *p_temperature) { //float rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit //float t=*p_temperature; // t: Temperature [Ticks] 14 Bit float rh_lin; // rh_lin: Humidity linear float rh_true; // rh_true: Temperature compensated humidity float t_C; // t_C : Temperature [°C] t_C=*p_temperature*0.01 - 40; //calc. temperature from ticks to [°C] rh_lin=C3*(*p_humidity)*(*p_humidity) + C2*(*p_humidity) + C1; //calc. humidity from ticks to [%RH] rh_true=(t_C-25)*(T1+T2*(*p_humidity))+rh_lin; //calc. temperature compensated humidity [%RH] if(rh_true>100)rh_true=100; //cut if the value is outside of if(rh_true<0.1)rh_true=0.1; //the physical possible range *p_temperature=t_C; //return temperature [°C] *p_humidity=rh_true; //return humidity[%RH] } //-------------------------------------------------------------------- // calculates dew point // input: humidity [%RH], temperature [°C] // output: dew point [°C] //-------------------------------------------------------------------- float calc_dewpoint(float h,float t) { float logEx,dew_point; logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2); dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx); return dew_point; }
دیدگاه