Facebook
From mistrzProgramowania, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 128
  1. #define F_CPU 16000000UL
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include "uart.h"
  5. #include <math.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. uint8_t c=0, I_RH, D_RH, I_Temp, D_Temp, CheckSum;
  10.  
  11. #define setbit(port, bit) ((port) |= (1<<bit));
  12. #define clearbit(port, bit) ((port) &= ~(1<<bit));
  13. #define togglebit(port, bit) ((port) ^= (1<<bit));
  14.  
  15. #define STATUS_LED_PORT PORTC
  16. #define STATUS_LED_PIN PORTC3
  17.  
  18. char porty[8]="00000000";
  19.  
  20. #define LED_PIN (1<<PB5)
  21. #define LED_MIG PORTB ^= LED_PIN
  22. #define LED_OFF PORTB &= ~LED_PIN
  23. #define LED_ON PORTB |= LED_PIN
  24.  
  25. #define GUZIK_PIN (1<<PB7)
  26.  
  27. #define GUZIK2_PIN (1<<PD0)
  28.  
  29. #define GUZIK3_PIN (1<<PD2)
  30.  
  31. #define WEN_PIN (1<<PD4)
  32. #define WEN_ON PORTD |= WEN_PIN        
  33. #define WEN_OFF PORTD &= ~WEN_PIN
  34.  
  35. #define HEA_PIN (1<<PD6)
  36. #define HEA_ON PORTD |= HEA_PIN        
  37. #define HEA_OFF PORTD &= ~HEA_PIN
  38.  
  39. #define DHT11_PIN PIND7
  40.  
  41. void Request()                                          /* Microcontroller send start pulse or request */
  42. {
  43.         DDRD |= (1<<DHT11_PIN);
  44.         PORTD &= ~(1<<DHT11_PIN);               /* set to low pin */
  45.         _delay_ms(20);                                  /* wait for 20ms */
  46.         PORTD |= (1<<DHT11_PIN);                /* set to high pin */
  47. }
  48.  
  49. void Response()                                         /* receive response from DHT11 */
  50. {
  51.         DDRD &= ~(1<<DHT11_PIN);
  52.         while(PIND & (1<<DHT11_PIN));
  53.         while((PIND & (1<<DHT11_PIN))==0);
  54.         while(PIND & (1<<DHT11_PIN));
  55. }
  56.  
  57. uint8_t Receive_data()                                                  /* receive data */
  58. {
  59.         for (int q=0; q<8; q++)
  60.         {
  61.                 while((PIND & (1<<DHT11_PIN)) == 0);    /* check received bit 0 or 1 */
  62.                 _delay_us(30);
  63.                 if(PIND & (1<<DHT11_PIN))                               /* if high pulse is greater than 30ms */
  64.                 c = (c<<1)|(0x01);                                              /* then its logic HIGH */
  65.                 else                                                                    /* otherwise its logic LOW */
  66.                 c = (c<<1);
  67.                 while(PIND & (1<<DHT11_PIN));
  68.         }
  69.         return c;
  70. }
  71.  
  72. int main(void)
  73. {
  74.         char data[5];
  75.        
  76.         UartInit();
  77.        
  78.         DDRB |=LED_PIN;
  79.        
  80.         DDRB &= ~GUZIK_PIN;
  81.         PORTB |= GUZIK_PIN;    
  82.        
  83.         DDRD &= ~GUZIK2_PIN;
  84.         PORTD |= GUZIK2_PIN;   
  85.        
  86.         DDRD &= ~GUZIK3_PIN;
  87.         PORTD |= GUZIK3_PIN;           
  88.        
  89.         DDRD |= WEN_PIN;
  90.        
  91.         while (1)
  92.         {
  93.                 porty[0]='1';
  94.                                
  95.                 UartTransmitString("Rozpoczecie pomiaru: \r\n");
  96.                 Request();                              /* send start pulse */
  97.                 Response();                             /* receive response */
  98.                 I_RH=Receive_data();    /* store first eight bit in I_RH */
  99.                 D_RH=Receive_data();    /* store next eight bit in D_RH */
  100.                 I_Temp=Receive_data();  /* store next eight bit in I_Temp */
  101.                 D_Temp=Receive_data();  /* store next eight bit in D_Temp */
  102.                 CheckSum=Receive_data();/* store next eight bit in CheckSum */
  103.                 _delay_ms(200);
  104.                
  105.                 _delay_ms(1800);
  106.                                
  107.                 if ((I_RH + D_RH + I_Temp + D_Temp) != CheckSum)
  108.                 {
  109.                         //LED_OFF;
  110.                         UartTransmitString("Blad pomiaru!!! \r\n");
  111.                 }
  112.                 else {
  113.                         UartTransmitString("Temperatura powietrza wynosi: ");
  114.                         _delay_ms(500);
  115.                         UartTransmitInt(I_Temp);
  116.                         UartTransmitString(".");
  117.                         UartTransmitInt(D_Temp);
  118.                         UartTransmitString("C \r\n");
  119.                         //UartTransmitString("\r\n");
  120.                         _delay_ms(1000);
  121.                        
  122.                         //int temperatura = I_Temp;
  123.                        
  124.                         //if(temperatura >= 22)
  125.                         //{
  126.                         //      LED_ON;
  127.                         //}
  128.                         //      else
  129.                         //{
  130.                         //      LED_OFF;
  131.                         //}
  132.                
  133.                         if( !(PIND & GUZIK2_PIN) )
  134.                         {
  135.                                 LED_ON;
  136.                                 WEN_OFF;
  137.                                 //HEA_ON;
  138.                         }
  139.                        
  140.                         if( !(PIND & GUZIK3_PIN) )
  141.                         {
  142.                                 LED_OFF;
  143.                                 WEN_ON;
  144.                                 //HEA_OFF;
  145.                         }
  146.         }
  147. }
  148.  
  149. ISR(USART_RX_vect)
  150. {
  151.         RX_data=UDR0;
  152. }