|
@@ -72,6 +72,12 @@ static EEMEM uint8_t EEP_BrightIdx;
|
|
|
static uint8_t brightIdx;
|
|
|
static EEMEM uint8_t EEP_SummerTime;
|
|
|
static uint8_t dhtBuf[42];
|
|
|
+static volatile struct {
|
|
|
+ uint8_t Humidity;
|
|
|
+ uint8_t Temperature;
|
|
|
+} dhtData;
|
|
|
+uint16_t Humidity;
|
|
|
+uint16_t Temperature;
|
|
|
|
|
|
/* Constants */
|
|
|
#if (USE_BRIGHT_CONTROL == 1)
|
|
@@ -93,6 +99,7 @@ static void dhtProcess(void);
|
|
|
static void dhtEnd(void);
|
|
|
static void dhtTimeout(void);
|
|
|
static void dhtNoAck(void);
|
|
|
+static void dhtErrorCRC(void);
|
|
|
void usart_putc (char send);
|
|
|
void usart_puts (const char *send);
|
|
|
|
|
@@ -135,8 +142,8 @@ void main(void) {
|
|
|
|
|
|
showTime();
|
|
|
|
|
|
- RTOS_SetTask(btnProcess, 5, BTN_SCAN_PERIOD);
|
|
|
- RTOS_SetTask(dhtStart, 1001, 10000); //once per minute start DHT22 measure
|
|
|
+ RTOS_SetTask(btnProcess, 3, BTN_SCAN_PERIOD);
|
|
|
+ RTOS_SetTask(dhtStart, 2000, 15000);
|
|
|
|
|
|
/** main loop */
|
|
|
do {
|
|
@@ -290,42 +297,96 @@ static void dhtStart(void) {
|
|
|
}
|
|
|
|
|
|
static void dhtProcess(void) {
|
|
|
+ uint8_t cnt1, cnt2, buf, parity;
|
|
|
+ uint16_t tcnt_old;
|
|
|
+
|
|
|
DHT_PIN_INPUT;
|
|
|
TCNT1 = 0;
|
|
|
|
|
|
- uint8_t count;
|
|
|
- uint16_t tcnt_old;
|
|
|
// ждём первого "0"
|
|
|
while(bit_is_set(PINB, PB0) && TCNT1<DHT_TOUT1);
|
|
|
if (TCNT1 >= DHT_TOUT1) {
|
|
|
- RTOS_SetTask(dhtTimeout, 0, 0);
|
|
|
+ RTOS_SetTask(dhtNoAck, 0, 0);
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- cli();
|
|
|
- for (count=0;count<41;count++) {
|
|
|
- // "0", начало периода
|
|
|
- while(bit_is_clear(PINB, PB0) && TCNT1<DHT_TIMEOUT); // ждём начало импульса
|
|
|
- tcnt_old = TCNT1; // начало импульса
|
|
|
- while(bit_is_set(PINB, PB0) && TCNT1<DHT_TIMEOUT); // ждём конец импульса
|
|
|
- dhtBuf[count] = (uint8_t)(TCNT1 - tcnt_old); // сохраняем длительность импульса
|
|
|
- tcnt_old = TCNT1;
|
|
|
+ // white for end of preamble
|
|
|
+ while(bit_is_clear(PINB, PB0));
|
|
|
+ while(bit_is_set(PINB, PB0) && TCNT1<DHT_TIMEOUT);
|
|
|
+ if (TCNT1 >= DHT_TIMEOUT) {
|
|
|
+ RTOS_SetTask(dhtTimeout, 0, 0);
|
|
|
+ }
|
|
|
+ // begin of data
|
|
|
+ parity = 0;
|
|
|
+ for (cnt1=0; cnt1<40; cnt1+=8) { // 0 8 16 24 32
|
|
|
+ buf = 0;
|
|
|
+ for (cnt2=0; cnt2<8; cnt2++) {
|
|
|
+ buf <<= 1;
|
|
|
+ // "0", начало периода
|
|
|
+ while(bit_is_clear(PINB, PB0)); // ждём начало импульса
|
|
|
+ cli();
|
|
|
+ tcnt_old = TCNT1; // начало импульса
|
|
|
+ while(bit_is_set(PINB, PB0) && TCNT1<DHT_TIMEOUT); // ждём конец импульса
|
|
|
+ if ((TCNT1 - tcnt_old) > 12) {
|
|
|
+ buf |= 1;
|
|
|
+ }
|
|
|
+ sei();
|
|
|
+ }
|
|
|
+ parity += buf;
|
|
|
+ switch (cnt1) {
|
|
|
+ case 0:
|
|
|
+ Humidity = buf << 8;
|
|
|
+ break;
|
|
|
+ case 8:
|
|
|
+ Humidity |= buf;
|
|
|
+ break;
|
|
|
+ case 16:
|
|
|
+ Temperature = buf << 8;
|
|
|
+ break;
|
|
|
+ case 24:
|
|
|
+ Temperature |= buf;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
- sei();
|
|
|
|
|
|
if (TCNT1 >= DHT_TIMEOUT) {
|
|
|
RTOS_SetTask(dhtTimeout, 0, 0);
|
|
|
- } else {
|
|
|
- RTOS_SetTask(dhtEnd, 0, 0);
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ if (parity != buf) {
|
|
|
+ dhtErrorCRC();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ dhtData.Humidity = (uint8_t)((Humidity + 5) / 10);
|
|
|
+ dhtData.Temperature = (uint8_t)((Temperature + 5) / 10);
|
|
|
+
|
|
|
+ RTOS_SetTask(dhtEnd, 0, 0);
|
|
|
}
|
|
|
|
|
|
static void dhtEnd(void) {
|
|
|
- uint8_t i, k;
|
|
|
+ /*uint8_t i, k;*/
|
|
|
char buffer[6];
|
|
|
|
|
|
usart_puts("DHT22 timing data:\r\n");
|
|
|
|
|
|
+ usart_puts("Humidity: ");
|
|
|
+ itoa(Humidity, buffer, 10);
|
|
|
+ usart_puts(buffer);
|
|
|
+ usart_puts(" %/% ");
|
|
|
+ itoa(dhtData.Humidity, buffer, 10);
|
|
|
+ usart_puts(buffer);
|
|
|
+ usart_puts(RETURN_NEWLINE);
|
|
|
+
|
|
|
+ usart_puts("Temperature: ");
|
|
|
+ itoa(Temperature, buffer, 10);
|
|
|
+ usart_puts(buffer);
|
|
|
+ usart_puts(" C/C ");
|
|
|
+ itoa(dhtData.Temperature, buffer, 10);
|
|
|
+ usart_puts(buffer);
|
|
|
+ usart_puts(RETURN_NEWLINE);
|
|
|
+}
|
|
|
+/*
|
|
|
itoa(dhtBuf[0], buffer, 10);
|
|
|
dhtBuf[0] = 0;
|
|
|
usart_puts(buffer);
|
|
@@ -342,7 +403,7 @@ static void dhtEnd(void) {
|
|
|
}
|
|
|
usart_puts(RETURN_NEWLINE);
|
|
|
}
|
|
|
-
|
|
|
+*/
|
|
|
static void dhtNoAck(void) {
|
|
|
usart_puts("DHT22 no ACK reached.\r\n");
|
|
|
}
|
|
@@ -352,6 +413,22 @@ static void dhtTimeout(void) {
|
|
|
dhtEnd();
|
|
|
}
|
|
|
|
|
|
+static void dhtErrorCRC(void) {
|
|
|
+ char buffer[6];
|
|
|
+
|
|
|
+ usart_puts("DHT22 CRC Error.\r\n");
|
|
|
+
|
|
|
+ usart_puts("Humidity: ");
|
|
|
+ itoa(Humidity, buffer, 10);
|
|
|
+ usart_puts(buffer);
|
|
|
+ usart_puts("\t\t");
|
|
|
+
|
|
|
+ usart_puts("Temperature: ");
|
|
|
+ itoa(Temperature, buffer, 10);
|
|
|
+ usart_puts(buffer);
|
|
|
+ usart_puts(RETURN_NEWLINE);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* @brief Обработка кнопок.
|
|
|
* @param : None
|