You are on page 1of 5

#define F_CPU 16000000UL

#include <util/delay.h>
#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>
#include <avr/interrupt.h>

volatile int dem = 0;


volatile int dem1 = 0;

#define DHT11_PIN PD2


uint8_t c=0,I_RH,D_RH,I_Temp,D_Temp,CheckSum;
// USART
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

//////////////////////////////////////////////////////////////////////////////////
///////////////
void UART_init(long USART_BAUDRATE)
{
UCSRB |= (1 << RXEN) | (1 << TXEN) | (1<< RXCIE);/* Turn on transmission and
reception */
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);/* Use 8-bit character
sizes */
UBRRL = BAUD_PRESCALE; /* Load lower 8-bits of the baud rate value */
UBRRH = (BAUD_PRESCALE >> 8); /* Load upper 8-bits*/
sei();
}
unsigned char UART_RX()
{
while(!(UCSRA&(1<<RXC)));
return UDR;
}
void UART_TxChar(char ch)
{
while (! (UCSRA & (1<<UDRE))); /* Wait for empty transmit buffer*/
UDR = ch ;
}

void UART_SendString(char *str)


{
unsigned char j=0;

while (str[j]!=0) /* Send string till null */


{
UART_TxChar(str[j]);
j++;
}
}
//////////////////////////////////////////////////////////////////////////////////
////////////////
void Request() /* Microcontroller send start pulse/request */
{
DDRD |= (1<<DHT11_PIN);
PORTD &= ~(1<<DHT11_PIN); /* set to low pin */
_delay_ms(30); /* wait for 20ms */
PORTD |= (1<<DHT11_PIN); /* set to high pin */

}
int Response()
{
DDRD &= ~(1<<DHT11_PIN);
_delay_us(39);
if((PIND & (1<<DHT11_PIN))) //response signal error check!
return 1;
_delay_us(80);
if(!(PIND & (1<<DHT11_PIN))) //pulled ready output check!
return 1;
_delay_us(80);
}

uint8_t Receive_data() /* receive data */


{
for (int q=0; q<8; q++)
{
while((PIND & (1<<DHT11_PIN)) == 0); /* check received bit 0 or 1 */
_delay_us(30);
if(PIND & (1<<DHT11_PIN))/* if high pulse is greater than 30ms */
c = (c<<1)|(0x01); /* then its logic HIGH */
else /* otherwise its logic LOW */
c = (c<<1);
while(PIND & (1<<DHT11_PIN));
}
return c;
}
//////////////////////////////////////////////////////////////////////////////////
////////////////////
void ADC_Init()
{
//DDRA = (1<<PA0); /* Make ADC port as input */
ADCSRA = 0x87; /* Enable ADC, fr/128 */
}

int ADC_Read()
{
ADMUX = 0x40; /* Vref: Avcc, ADC channel: 0 */
ADCSRA |= (1<<ADSC); /* start conversion */
while ((ADCSRA &(1<<ADIF))==0); /* monitor end of conversion interrupt
flag */
ADCSRA |=(1<<ADIF); /* set the ADIF bit of ADCSRA register */
return(ADCW); /* return the ADCW */
}
void controlsw()
{
if((PIND&(1<<PIND3))==0)
{
while((PIND&(1<<PIND3))==0);
PORTA ^=(1<<PA5);
}
if((PIND&(1<<PIND4))==0)
{
while((PIND&(1<<PIND4))==0);
PORTA ^=(1<<PA6);
}
if((PIND&(1<<PIND5))==0)
{
while((PIND&(1<<PIND5))==0);
PORTA ^=(1<<PA7);
}
if((PIND&(1<<PIND6))==0)
{
while((PIND&(1<<PIND6))==0);
PORTD ^=(1<<PD7);
}
Request(); /* send start pulse */

if (Response()!=1)
{

I_RH=Receive_data(); /* store first eight bit in I_RH */


D_RH=Receive_data(); /* store next eight bit in D_RH */
I_Temp=Receive_data(); /* store next eight bit in I_Temp */
D_Temp=Receive_data(); /* store next eight bit in D_Temp */
CheckSum=Receive_data();/* store next eight bit in CheckSum */

}
int main(void)
{
DDRA = 0B11111110;
DDRB = 0xff;
DDRD = 0B10000000;
TCCR0 = (1<< CS00) | (1<< CS01); // PRE = 64
TCNT0 = 130 ;
TIMSK |=(1<<TOIE0);
sei();
UART_init(9600);

//UART_SendString("\n\t Echo Test ");


char data1[5];
char data2[5];
char data3[5];
char data4[5];
char data5[5];
ADC_Init(); /* initialize the ADC */
char array[5];
int adc_value;
float moisture;
PORTA |= (1<<PA5)|(1<<PA6)|(1<<PA7);
PORTD |= (1<<PD7);
_delay_ms(100);
while(1)
{
controlsw();
adc_value = ADC_Read(); /* Copy the ADC value */
moisture = (adc_value*5*100.00)/1023.00; /* Calculate moisture in % */
if (dem > 2000)
{
UART_SendString("N1,");
itoa(moisture,data1,10);
UART_SendString(data1);
UART_SendString(",");
_delay_ms(10);
itoa(moisture,data3,10);
UART_SendString(data3);
UART_SendString(",");
_delay_ms(10);
itoa(moisture,array,10);
UART_SendString(array);
UART_SendString(",");
UART_SendString("11#");
UART_SendString("\n\r");
_delay_ms(100);
dem = 0;
}

if (dem1 > 800)


{
if((PINA&(1<< PA5)) == 0)
{

UART_SendString("N2,");
UART_SendString("10,");
}
else
{

UART_SendString("N2,");
UART_SendString("11,");
}

if((PINA&(1<< PA6)) == 0)
{

UART_SendString("20,");
}
else
{

UART_SendString("21,");
}

if((PINA&(1<< PA7)) == 0)
{

UART_SendString("30,");
}
else
{
UART_SendString("31,");
}

if((PIND&(1<< PD7)) == 0)
{
UART_SendString("40#\n\r");
}
else
{
UART_SendString("41#\n\r");
}
dem1 = 0;

}
}

_delay_ms(100);
}

ISR(USART_RXC_vect)
{
char pc = UDR;
switch (pc)
{
case '1':
_delay_ms(50);
PORTA &=~(1<<PA6);
break;
case '2':
_delay_ms(50);
PORTA |=(1<<PA6);
break;
case '3':
_delay_ms(50);
PORTA &=~(1<<PA7);
break;
case '4':
_delay_ms(50);
PORTA |=(1<<PA7);
break;
case '5':
_delay_ms(50);
PORTD &=~(1<<PD7);
break;
case '6':
_delay_ms(100);
PORTD |=(1<<PD7);
break;

default:
_delay_ms(500);
break;
}
}

ISR(TIMER0_OVF_vect)
{
TCNT0 = 130;
dem ++;
dem1 ++;

You might also like