Sie sind auf Seite 1von 26

//*************************************************** HEADER FILES

****************************************

#include <mega8.h>

#include <stdio.h>

#include <delay.h>

#include <adc.h>

#define FCLK 8000000

#include <usart_ud.h>

#define lcd_port PORTB

#define lcd_port_dir DDRB

#include <lcd_ud.h>

//#include <string.h>

#define msg_buf_len 80

#define desktop_l 80

//************************************************ GLOBEL VALUE DICLARATIONS


******************************

#define pi PI

//*************************************************** PORT'S DICLARATIONS


*********************************

//#define powerfactor_1 PIND.2

//#define powerfactor_2 PIND.3

#define relay_1 PORTD.7

#define relay_2 PORTD.5

#define relay_3 PORTD.6

#define relay_1_d DDRD.7


#define relay_2_d DDRD.5

#define relay_3_d DDRD.6

#define curr_ch_1 0

#define curr_ch_2 1

#define curr_ch_3 2

#define curr_ch_4 3

#define volt_ch_1 4

#define volt_ch_2 5

//*************************************************** FUNCTION DICLARATIONS


*******************************

#pragma used+

void gprs_init();

void reply_sms();

short sms_decode();

short ip_decode();

//void get_signel_strength();

void send_data();

//*************************************************** VARIABLE DICLARATIONS


*******************************

int volt1;

int volt2;

int volt3;

int curr1;

int curr2;

int curr3;
int curr4;

unsigned char line1[17];

unsigned char line2[17];

unsigned int int_i;

char buff[20];

unsigned int temp_int;

short msg_pointer;

char message_buffer[msg_buf_len];

unsigned int j;

unsigned int i;

char data_frame[70];

char client_ip[20];

char server_ip[20];

char reply_number[11];

char reply_msg[50];

char number_buffer_[11];

char message_buffer_[32];

char temp_char;

short signal;

int msg_pointer_old;

int timer_int;

int viber_1,viber_2;

//*************************************************** MAIN FUNCTION


**************************************

#pragma used-
void main()

delay_ms(1000);

usart_init();

adc_init();

lcd_init();

delay_ms(100);

usart_flush();

flash_lcd_out("started");

relay_1_d=1;

relay_2_d=1;

relay_3_d=1;

relay_1=0;

relay_2=0;

relay_3=0;

delay_ms(8000);

gprs_init();

timer_int=300;

TCCR1A=0x00;

TCCR1B=0x00;//TCCR1B=0x04;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;
OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

TIMSK=0x04;

usart_init();

UCSRB|=(1<<RXCIE);

#asm("sei");

while (1)

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

TCCR1B=0x04;

curr1=adc_read(3);

curr2=adc_read(3);

curr3=adc_read(3);

volt1=adc_read(5);

volt2=volt1;

volt3=volt1;

lcd_clear();

lcd_out(client_ip);

send_data();

msg_pointer=0;
int_i=30000;

while((msg_pointer==0x00)&&(int_i>0x00))

{int_i-=1;delay_us(800);}

if(msg_pointer!=0x00)

temp_char=message_buffer[0];

if(temp_char=='0')

relay_1=0;

relay_2=0;

relay_3=0;

if(temp_char=='1')

relay_1=0;

if(temp_char=='2')

relay_1=1;

if(temp_char=='3')

relay_2=0;

if(temp_char=='4')
{

relay_2=1;

if(temp_char=='5')

relay_3=0;

if(temp_char=='6')

relay_3=1;

temp_char=0x00;

};

//*************************************************** FUNCTION DEFINITIONS


********************************

void send_data()

#asm("cli");

printf("AT+CIPSEND\n\r");

int_i=0x03;

do
{

buff[0]=getchar_attempt(1000);

int_i-=1;

}while((buff[0]!='>')&&(int_i>0));

if(buff[0]!=0x00){getchar_attempt(1000);}

usart_flush();

// A B C D E F G

//printf("ABCDEFGBIJKLM\n\r",volt1 ,curr1 ,volt2 ,curr2 ,volt3 ,curr3 );

printf("A%3d B%3d C%3d D%3d E%3d F%3d G\n\r",volt1 ,curr1 ,volt2 ,curr2 ,volt3 ,curr3 );

putchar(0x1a);

timer_int-=1;

if(timer_int==0x00){timer_int=15000;reply_sms();}

else

delay_ms(500);

usart_flush();

#asm("sei");

interrupt [TIM1_OVF] void timer1_ovf_isr(void)

{
UDR=0x00;

UCSRA|=(1<<RXC);

lcd_clear();

lcd_out(" WEAK SIGNAL ");

void gprs_init()

int_i=1;

usart_flush();

lcd_clear();

flash_lcd_out("INITIATING");

printf("ATE1\r\n");

delay_ms(100);

printf("AT\r\n");

delay_ms(5);

do

buff[2]=getchar_attempt(20000);

if(buff[2]=='K'){int_i=0x10;}

if(buff[2]==0x00)

int_i+=1;

printf("ATE1\r\n");

delay_ms(100);
printf("AT\r\n");

delay_ms(5);

}while(int_i<4);

if(int_i==0x06)

lcd_clear();

flash_lcd_out("MODEM FAILURE");

while(1);

temp_int=1;

//sprintf(line1,"CHECKING SIM");

//sprintf(line2,"ATTEMPT %d ",temp_int);

//lcd_clear();

//lcd_out(line1);

//lcd_move_cursor(0x40);

//lcd_out(line2);

delay_ms(1000);

usart_flush();

UCSRB|=(1<<RXCIE);

printf("ATE0\r\n");

delay_ms(100);
#asm("sei");

do

msg_pointer=0x00;

int_i=10000;

printf("AT +CREG?\r\n");

while((msg_pointer==0x00)&&(int_i>0x00)){int_i-=1;delay_us(300);}

if(int_i!=0x00)

delay_ms(int_i/3);

msg_pointer=0x00;

while(message_buffer[msg_pointer]!=0x00)

if(message_buffer[msg_pointer]==',')

msg_pointer+=1;

if(message_buffer[msg_pointer]!='0'){temp_int=0x10;}

msg_pointer+=1;

msg_pointer=0;

temp_int+=1;

}while(temp_int<4);
if(temp_int==0x06)

lcd_clear();

flash_lcd_out("SIM FAILURE");

while(1);

delay_ms(5000);

printf("AT+CMGF=1\r\n");

delay_ms(500);

for(j='1';j<='9';j++)

printf("AT+CMGD=%c\r\n",j);

delay_ms(100);

delay_ms(50);

printf("AT+CNMI=2,2,0,0,0\r\n");

delay_ms(50);

lcd_clear();

flash_lcd_out(" INITIALISING ");

goto command_request_repeat_2;

command_request_repeat_1:
//sprintf(reply_number,"9025224376");

//sprintf(reply_msg,"WAITING FOR COMMAND");

//reply_sms();

command_request_repeat_2:

delay_ms(5000);

msg_pointer=0x00;

lcd_clear();

lcd_out(" WAITING FOR ");

lcd_move_cursor(0x40);

lcd_out(" COMMAND ");

wait_for_msg:

while(msg_pointer==0x00);

int_i=30000;

while((msg_pointer<10)&&(int_i>0))

delay_ms(10);

int_i-=1;

if(int_i==0){goto wait_for_msg;}

delay_ms(300);

j=sms_decode();

msg_pointer=0;

if(j==0){lcd_clear();flash_lcd_out("unsupported sms");delay_ms(3000);usart_flush();goto
command_request_repeat_1;}
if((message_buffer_[0]=='S')&&(message_buffer_[1]=='T')&&(message_buffer_[2]=='A')&&(message_bu
ffer_[3]=='R')&&(message_buffer_[4]=='T'))

#asm("cli");

msg_pointer=0;

while(message_buffer_[msg_pointer]!=' '){msg_pointer+=1;}

message_buffer_[msg_pointer]=0x00;

msg_pointer+=1;

msg_pointer_old=msg_pointer;

do

server_ip[msg_pointer-msg_pointer_old]=message_buffer_[msg_pointer];

msg_pointer+=1;

server_ip[msg_pointer-msg_pointer_old]=0x00;

}while(message_buffer_[msg_pointer-msg_pointer_old]!='#');

for(i=i;i<20;i++)

if((server_ip[i]<0x30)&&(server_ip[i]!='.')){server_ip[i]=0x00;}

sprintf(line2,"%s\n\r",server_ip);

lcd_clear();

flash_lcd_out("IP RECEIVED");

lcd_move_cursor(0x40);

lcd_out(line2);
delay_ms(5000);

lcd_clear();

flash_lcd_out("CONNECTING GPRS");

delay_ms(3000);

else

lcd_clear();

lcd_out(message_buffer_);

delay_ms(3000);

sprintf(reply_number,"%s",number_buffer_);

goto command_request_repeat_2;

sprintf(reply_number,"%s",number_buffer_);

#asm("cli");

printf("AT+CMGF=1\r\n");

delay_ms(50);

for(j='1';j<='9';j++)

printf("AT+CMGD=%c\r\n",j);

delay_ms(40);

}
delay_ms(5);

printf("AT+CNMI=0,0,0,0,0\r\n");

delay_ms(5);

printf("AT+CIPMODE=0\r\n");

delay_ms(5);

printf("AT+CLPORT=");

putchar('"');

printf("UDP");

putchar('"');

putchar(',');

putchar('"');

printf("3501");

putchar('"');

printf("\r\n");

delay_ms(5);

//AT+CIPCSGP=1,"airtelgprs.com"

printf("AT+CIPCSGP=1");

putchar(',');

putchar('"');

printf("airtelgprs.com");

putchar('"');

printf("\r\n");
delay_ms(5);

printf("AT+CSTT\n\r");

delay_ms(20000);

printf("AT+CIICR\n\r");

do

message_buffer[1]=message_buffer[0];

message_buffer[0]=getchar();

if((message_buffer[1]=='E')&&(message_buffer[0]=='R'))

{delay_ms(300);usart_flush();printf("AT+CIPCLOSE\n\r");delay_ms(1000);printf("AT+AT+CIPSHUT\n\r");d
elay_ms(1000);usart_flush();}

}while((message_buffer[1]=='O')&&(message_buffer[0]=='K'));

UCSRB|=(1<<RXCIE);

delay_ms(3000);

#asm("sei")

int_i=0;

ip_get_repeat:

int_i+=1;

sprintf(line2,"ATTEMPT %u",int_i);

lcd_clear();

flash_lcd_out("GETTING IP");
lcd_move_cursor(0x40);

lcd_out(line2);

delay_ms(1000);

usart_flush();

msg_pointer=0;

printf("AT+CIFSR\n\r");

delay_ms(15000);

j=0;

temp_int=1000;

while((msg_pointer==0x00)&&(temp_int>0)){temp_int--;delay_ms(20);}

if(temp_int==0){goto ip_get_repeat;}

delay_ms(300);

j=ip_decode();

if(j==0){goto ip_get_repeat;}

for(i=i;i<20;i++)

if((client_ip[i]<0x30)&&(client_ip[i]!='.')){client_ip[i]=0x00;}

sprintf(line2,"%s\n\r",client_ip);

lcd_clear();

flash_lcd_out("CLIENT IP");

lcd_move_cursor(0x40);

lcd_out(line2);

delay_ms(3000);
sprintf(reply_msg,"CLIENT IP #%s\n",client_ip);

reply_sms();

delay_ms(5000);

printf("AT+CIPSTART=");

putchar('"');

printf("UDP");

putchar('"');

putchar(',');

putchar('"');

printf("%s",server_ip);

putchar('"');

putchar(',');

putchar('"');

printf("3500");

putchar('"');

printf("\r\n");

delay_ms(500);

msg_pointer=0;

interrupt [USART_RXC] void usart_rx_complete(void)

message_buffer[msg_pointer]=getchar();

msg_pointer++;

message_buffer[msg_pointer]=0x00;
if(msg_pointer>=(msg_buf_len-1)){msg_pointer=0;usart_flush();}

short sms_decode()

int msg_pointer_old;

delay_ms(100);

#asm("cli");

message_buffer[msg_buf_len-1]=0x00;

message_buffer[msg_buf_len-2]=0x0a;

msg_pointer=0;

while(((message_buffer[msg_pointer]!=0x22)||(message_buffer[msg_pointer+1]!
='+'))&&(msg_pointer<desktop_l)&&(message_buffer[msg_pointer]!=0x00))

msg_pointer+=1;

if((msg_pointer>=desktop_l)||message_buffer[msg_pointer]==0x00)

usart_flush();

msg_pointer=0;

#asm("sei");

return 0;

msg_pointer+=4;
msg_pointer_old=msg_pointer;

while(((message_buffer[msg_pointer]!
=0x22)&&(msg_pointer<desktop_l))&&(message_buffer[msg_pointer]!=0x00))

number_buffer_[msg_pointer-msg_pointer_old]=message_buffer[msg_pointer];

msg_pointer+=1;

number_buffer_[msg_pointer-msg_pointer_old]=0x00;

if((msg_pointer>=desktop_l)||message_buffer[msg_pointer]==0x00)

usart_flush();

msg_pointer=0;

#asm("sei");

return 0;

while((message_buffer[msg_pointer]!
=0x23)&&(msg_pointer<desktop_l)&&(message_buffer[msg_pointer]!=0x00))

msg_pointer+=1;

if((msg_pointer>=desktop_l)||message_buffer[msg_pointer]==0x00)

delay_ms(1500);
usart_flush();

msg_pointer=0;

#asm("sei");

return 0;

msg_pointer+=1;

msg_pointer_old=msg_pointer;

while(((message_buffer[msg_pointer]!
=0x0d)&&(msg_pointer<msg_buf_len))&&(message_buffer[msg_pointer]!=0x00))

message_buffer_[msg_pointer-msg_pointer_old]=message_buffer[msg_pointer];

msg_pointer+=1;

message_buffer_[msg_pointer-msg_pointer_old]=0x00;

message_buffer_[msg_pointer-msg_pointer_old]=0x00;

usart_flush();

msg_pointer=0;

#asm("sei");

return 1;

short ip_decode()

delay_ms(100);

#asm("cli");
message_buffer[msg_buf_len-1]=0x00;

message_buffer[msg_buf_len-2]=0x0a;

msg_pointer=0;

while(((message_buffer[msg_pointer]!=0x0d)||(message_buffer[msg_pointer+1]!
=0x0a))&&(msg_pointer<desktop_l)&&(message_buffer[msg_pointer]!=0x00))

msg_pointer+=1;

if((msg_pointer>=desktop_l)||message_buffer[msg_pointer]==0x00)

usart_flush();

msg_pointer=0;

#asm("sei");

return 0;

lcd_clear();

flash_lcd_out("READING IP");

delay_ms(3000);

msg_pointer+=2;

msg_pointer_old=msg_pointer;

while((message_buffer[msg_pointer]!
=0x0d)&&(msg_pointer<desktop_l)&&(message_buffer[msg_pointer]!=0x00))

client_ip[msg_pointer-msg_pointer_old]=message_buffer[msg_pointer];

msg_pointer+=1;
}

if((msg_pointer>=desktop_l)||message_buffer[msg_pointer]==0x00)

usart_flush();

msg_pointer=0;

client_ip[msg_pointer]=0x00;

#asm("sei");

return 0;

client_ip[msg_pointer]=0x23;

client_ip[msg_pointer+1]=0x00;

usart_flush();

msg_pointer=0;

#asm("sei");

return 1;

void reply_sms()

unsigned short reply_sms_attempt;

usart_flush();

#asm("cli");
int_i=1;

printf("AT+CMGS=");

putchar(0x22);

printf("%s",reply_number);

putchar(0x22);

putchar(0x0d);

reply_sms_attempt=20;

do

buff[0]=getchar_attempt(1000);

if(buff[0]==0x00){reply_sms_attempt-=1;}

}while((buff[0]!='>')&&(reply_sms_attempt>0));

buff[0]=getchar_attempt(1000);

printf("%s",reply_msg);

putchar(0x1a);

buff[1]=0x00;

lcd_clear();

lcd_move_cursor(0);

flash_lcd_out("MESSAGE SENT");

usart_flush();

#asm("sei");

}
// External Interrupt 0 service routine

interrupt [EXT_INT0] void ext_int0_isr(void)

viber_1=1;

// External Interrupt 1 service routine

interrupt [EXT_INT1] void ext_int1_isr(void)

viber_2=1;

Das könnte Ihnen auch gefallen