Изменение в файле dth22.c.
Спойлер
#include "dht22.h"#include <util/delay.h>
static dht22Dev dev;
static uint8_t dht22Sensor = 0;
static int16_t humidity, temp;
void dht22Init(void)
{
DDR(DHT_DATA) &= ~DHT_DATA_LINE;
PORT(DHT_DATA) &= ~DHT_DATA_LINE;
}
static uint8_t dht22GetBit(void)
{
uint8_t i;
for (i = 255; i && !(PIN(DHT_DATA) & DHT_DATA_LINE); i--)
_delay_us(1); // Wait zero
for (i = 255; i && (PIN(DHT_DATA) & DHT_DATA_LINE); i--)
_delay_us(1); // Measure bit length
return (i < 230);
}
static uint8_t dht22GetByte(void)
{
int8_t i;
uint8_t ret = 0;
for (i = 0; i < 8; i++) {
ret <<= 1;
ret |= dht22GetBit();
}
return ret;
}
void dht22Read(void)
{
int8_t i;
uint8_t cksum;
uint8_t data;
dev.data[0] = dev.data[1] = dev.data[2] = dev.data[3] = dev.data[4] = 0;
if (!(PIN(DHT_DATA) & DHT_DATA_LINE)) // Line is busy
return;
DDR(DHT_DATA) |= DHT_DATA_LINE;
_delay_us(800);
DDR(DHT_DATA) &= ~DHT_DATA_LINE;
_delay_us(70);
if (PIN(DHT_DATA) & DHT_DATA_LINE) // No DHT22 response
return;
dht22Sensor = 1;
dht22GetBit(); // Wait for response finish
cksum = 0;
data = 0xFF;
for (i = 4; i >= 0; i--) {
data = dht22GetByte ();
dev.data = data;
if (i > 0)
cksum += data; // Checksum of first 4 bytes
}
//if (cksum == data) {
//humidity = dev.humidity;
//temp = dev.temp;
//if (temp & 0x8000) // Fix negative temp value
// temp = -(temp & 0x7FFF);
//}
//====================
if (dev.data[1]== 0 && dev.data[3]== 0) { //если эти переменные массива обе равны нулю,то это dht11
temp = dev.data[2]*10;
humidity = dev.data[0]*10;
}else { // dht22
humidity = dev.data[0] * 256 + dev.data[1];
temp = (dev.data[2] & 0x7F)* 256 + dev.data[3];
if (dev.data[2] & 0x80) temp *= -1;
}
//=========================
return;
}
int16_t dht22GetHumidity()
{
return humidity;
}
int16_t dht22GetTemp()
{
if(temp > 100){dht22Read();}
return temp;
}
uint8_t dht22HaveSensor(void)
{
return dht22Sensor;
}
Датчик у меня адекватно показывает в меру своих возможностей. Теперь по идее должно автоматически определять 11 и 22 датчики.
Просто 22-го дома нет, принесу проверю.
И кстати прошу помощи!!
Вот мои наработки в Atmel Studio 6.2 https://yadi.sk/d/fFWUxGkYy5KoH.
Проблема вот в чем, после считывания карты когда задействуется библиотека чена Petit FAT File System Module перестаёт работать бузер.
Что то молотит непрерывно, но на работе кроме бузера не отражается. Кто разбирается помогите советом. Может её как то приостановить можно? Постоянная работа её не нужна.


