Forráskód Böngészése

Проба получения данных.

Vladimir Shilov 6 éve
szülő
commit
e2325a274b
1 módosított fájl, 96 hozzáadás és 19 törlés
  1. 96 19
      src/main.c

+ 96 - 19
src/main.c

@@ -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