-uint8_t am2302_2() { //4mhz
- int16_t lam2302_temp;
- uint16_t lam2302_hum;
- uint8_t rSREG;
- uint8_t sensor_data[5];
- #if defined(__AVR_ATtiny25__)||defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
- TCCR1=(1<<CS11)|(1<<CS10); //Clock/8 1µs
- #endif
-
- #if defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__) || defined(__AVR_ATtiny84A__)
- TCCR1B=(1<<CS11); //Clock/8 1µs
- #endif
- SENSOR_sda_out;
- SENSOR_sda_low; // MCU start signal
- TCNT1=0;while(TCNT1==0);while(TCNT1<250) {}// start signal (pull sda down for min 0.8ms and maximum 20ms)
- TCNT1=0;while(TCNT1==0);while(TCNT1<250) {}// start signal (pull sda down for min 0.8ms and maximum 20ms)
- SENSOR_sda_in;
- if (am_wait(200,1)) return 2;
-
- // AM2302 response signal min: 75us typ:80us max:85us
- if (am_wait(100,0)) return 3;
- if (am_wait(100,1)) return 4;
-
- for(uint8_t i = 0; i < 5; i++) {
- uint8_t sensor_byte = 0;
- for(uint8_t j = 1; j <= 8; j++) {// get 8 bits from sensor
- if (am_wait(88,0)) return 5;
-
- TCNT1=0;while(TCNT1==0);;while(TCNT1<35) ;
- sensor_byte <<= 1; // add new lower byte
- if (SENSOR_is_hi) {// if sda high after 30us => bit=1 else bit=0
- sensor_byte |= 1;
- if (am_wait(45,1)) return 6;// 30us - 75us = 45us
- }
- }
- sensor_data[i] = sensor_byte;
- }
-
- // checksum
- if ( ((sensor_data[0]+sensor_data[1]+sensor_data[2]+sensor_data[3]) & 0xff ) != sensor_data[4])
- {
- // debug output
- //printf("%b %b %b %b %b %b" CR, sensor_data[0], sensor_data[1], sensor_data[2], sensor_data[3], sensor_data[4], ((sensor_data[0]+sensor_data[1]+sensor_data[2]+sensor_data[3]) & 0xff ));
- PORTB&=~(1<<PINB0);
- return 7;
- }
-#ifdef FP_CALC
- lam2302_hum=0.318* ((sensor_data[0]<<8) + sensor_data[1])+76;
- if (sensor_data[2]&0x80) { //minus
- sensor_data[2]&=~(0x80);
- lam2302_temp=-((sensor_data[2]<<8) + sensor_data[3])*25.6;
- } else
- lam2302_temp=((sensor_data[2]<<8) + sensor_data[3])*25.6;
-#else