用于鱼饲系统的GSM编码 [英] GSM coding for fish feeding system

查看:88
本文介绍了用于鱼饲系统的GSM编码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将GSM调制解调器与PIC16F877A接口,但似乎我的编码有问题,因为它无法像预期的结果一样成功运行。我只是想从PIC16F877A接收数据,通知手机的所有者。我不知道问题出在哪里。所以,我在这里给你代码,所以请你检查一下,如果有任何错误请纠正我。我将非常感谢和谦卑所有提供帮助的人。我真的需要别人帮助。谢谢!



I interface the GSM Modem with PIC16F877A but it seems like i have a problem with the coding because it cannot function successfully like an expected result. i just want to receive the data from the PIC16F877A to inform the mobile''s owner. I don''t know where the problem is. So, I give you the code here so can you please check it for me and correct me if there is any error. I will be very thankful and humble to all who provide to help.i really need others to help. thanks !

//==========================================================================
//	Author					: Underground.co(SSP)	
//	Project					: GSM FISH FEEDER
//	Project description		: GSM send message to owner
//							  This sample source code is valid for 
//							  20MHz crystal.
//
//==========================================================================

//	include
//==========================================================================
#include <pic.h>
#include <string.h>

//	configuration
//==========================================================================
__CONFIG ( 0x3F32 );				//configuration for the  microcontroller

//	define
//==========================================================================
#define	rs			RB4				//RS pin of the LCD display
#define	e			RB5				//E pin of the LCD display

#define	lcd_data	PORTD			//LCD 8-bit data PORT

#define	SW1			RB0			
#define	SW2			RB1
#define	SW3			RB2			

#define	LED1		RB6			
#define	LED2		RB7				

//	function prototype				(every function must have a function prototype)
//==========================================================================

void delay(unsigned long data);			

void send_config(unsigned char data);
void send_char(unsigned char data);
void lcd_goto(unsigned char data);
void lcd_clr(void);
void send_string(const char *s);

unsigned char uart_rec(void);			//receive uart value
void uart_send(unsigned char data);
void uart_str(const char *s);

void gsm_send_command(const char *command);
void gsm_read_line(char *buffer);


//	global variable
//==========================================================================

char gsm_response[20];
char command[10];


//	main function					(main fucntion of the program)
//==========================================================================
void main()
{
	char read_sms_command[] = "AT+CMGR=1";
	char delete_sms_command[] = "AT+CMGD=1";
	
	
	//set I/O input output
	TRISB = 0b00000011;					//configure PORTB I/O direction
	TRISD = 0b00000000;					//configure PORTD I/O direction
	TRISA = 0b00000111;					//configure PORTA I/O direction
	
	LED1=0;								// OFF LED1
	LED2=0;								// OFF LED2

	//Configure UART
	SPBRG=10;			//set baud rate as 115200 baud
	BRGH=1;				//baud rate high speed option
	TXEN=1;				//enable transmission
	TX9 =0;				//8-bit transmission
	RX9 =0;				//8-bit reception	
	CREN=1;				//enable reception
	SPEN=1;				//enable serial port

	//setup ADC
	ADCON1 = 0b00000110;				//set ADx pin digital I/O
	
	//configure lcd
	send_config(0b00000001);			//clear display at lcd
	send_config(0b00000010);			//lcd return to home 
	send_config(0b00000110);			//entry mode-cursor increase 1
	send_config(0b00001100);			//display on, cursor off and cursor blink off
	send_config(0b00111000);			//function set

	//display startup message	
	lcd_clr();							//clear lcd
	send_string("Welcome.");		//display "Cytron Tech."
	lcd_goto(20);						//set the lcd cursor to location 20
	send_string("GSM Fish Feeder");			//display "Smart Home"

	// Delay for a while.
	delay(100000);
	
	
	
	// Clear the LCD and display the new message.
	lcd_clr();
	send_string("Testing Com...");
	
	// Make sure we can communicate with the GSM modem.
	gsm_send_command("AT");
	
	// Read the response.
	gsm_read_line(&gsm_response);
	
	// We should receive "OK" from the GSM modem.
	// If we don't, display "Error".
	if (memcmp("OK", &gsm_response, 2) != 0)
	{
		lcd_clr();
		send_string("Error...");
		while(1);
	}	
	
	
	
	// Clear the LCD and display the new message.
	lcd_clr();
	send_string("Waiting for");
	lcd_goto(20);
	send_string("Call Ready");
	
	// Waiting for the GSM modem to search for the network.
	// We will receive a blank line before receiving "Call Ready".
	gsm_read_line(&gsm_response);
	gsm_read_line(&gsm_response);
	
	// We should receive "Call Ready" from the GSM modem.
	// If we don't, display "Error".
	if (memcmp("Call Ready", &gsm_response, 10) != 0)
	{
		lcd_clr();
		send_string("Error...");
		while(1);
	}	
	
	
	
	// Clear the LCD and display the new message.
	lcd_clr();
	send_string("Setting Text");
	lcd_goto(20);
	send_string("Mode...");
	
	// Set text mode for SMS.
	gsm_send_command("AT+CMGF=1");
	
	// Read the "OK".
	gsm_read_line(&gsm_response);
	
	
	
	// Clear the LCD and display the new message.
	lcd_clr();
	send_string("Ready");
	
	

	while(1)
	{
		// Check whether there is new data from the GSM modem.
		if (RCIF == 1)
		{
			// Check is there a new SMS?
			gsm_read_line(&gsm_response);
			if (memcmp("+CMTI: \"SM\",", &gsm_response, 12) == 0)
			{
				// Get the SMS index.
				// The command array is already initialized as "AT+CMGR=1" and "AT+CMGD=1",
				// we need to changed the index to the actual one.
				read_sms_command[8] = gsm_response[12];
				delete_sms_command[8] = gsm_response[12];
				
				// Clear the LCD and display the new message.
				lcd_clr();
				send_string("Reading SMS...");
				
				// Send command to read the SMS.
				gsm_send_command(&read_sms_command);
				
				// Read the response.
				// The first line is the SMS info which we don't need.
				// We only need the second line which is the message content.
				gsm_read_line(&gsm_response);
				gsm_read_line(&command);
				
				// Read the newline and "OK".
				gsm_read_line(&gsm_response);
				gsm_read_line(&gsm_response);
				
				
				
				// Switch on the light if we received "on".
				if (memcmp("on", &command, 2) == 0)
				{
					LED1 = 1;
					LED2 = 1;
				}	
				
				// Switch off the light if we received "off".
				else if (memcmp("off", &command, 3) == 0)
				{
					LED1 = 0;
					LED2 = 0;
				}	
				
				
				
				// Send command to delete the SMS.
				gsm_send_command(&delete_sms_command);
				
				// Read the "OK".
				gsm_read_line(&gsm_response);
				
				
				
				// Clear the LCD and display the new message.
				lcd_clr();
				send_string("Ready...");
			}
		}	
		
		
		
		// Check whether SW1 is pressed.
		if (SW1 == 0)
		{
			// Clear the LCD and display the new message.
			lcd_clr();
			send_string("Sending SMS...");
			
			// Send the SMS to notify the owner.
			// Please change this to your own number.
			gsm_send_command("AT+CMGS=\"0148556235\"");
			
			// We should receive '>' from the modem.
			// If we don't, display "Error".
			if (uart_rec() != '>')
			{
				lcd_clr();
				send_string("Error...");
				while(1);
			}	
			
			// Send the message.
			uart_str("Warning: Tank Level 1 Empty!");
			
			// Send <ctrl+z>.
			uart_send(0x1a);
			
			
			
			// Read the newline and response.
			gsm_read_line(&gsm_response);
			gsm_read_line(&gsm_response);
			
			// We should receive "+CMGS: <message id="">" from the GSM modem.
			// If we don't, display "Error".
			if (memcmp("+CMGS:", &gsm_response, 6) != 0)
			{
				lcd_clr();
				send_string("Error...");
				while(1);
			}
			
			
			
			// Read the newline and "OK".
			gsm_read_line(&gsm_response);
			gsm_read_line(&gsm_response);
			
			
			
			// Clear the LCD and display the new message.
			lcd_clr();
			send_string("Ready...");
			
			
			
			// Wait until SW1 is released so that we don't send duplicated message.
			while (SW1 == 0);
			
		}	
	}
	
		// Check whether SW1 is pressed.
		if (SW2 == 0)
		{
			// Clear the LCD and display the new message.
			lcd_clr();
			send_string("Sending SMS...");
			
			// Send the SMS to notify the owner.
			// Please change this to your own number.
			gsm_send_command("AT+CMGS=\"0148556235\"");
			
			// We should receive '>' from the modem.
			// If we don't, display "Error".
			if (uart_rec() != '>')
			{
				lcd_clr();
				send_string("Error...");
				while(1);
			}	
			
			// Send the message.
			uart_str("Warning: Tank Level 2 Empty!");
			
			// Send <ctrl+z>.
			uart_send(0x1a);
			
			
			
			// Read the newline and response.
			gsm_read_line(&gsm_response);
			gsm_read_line(&gsm_response);
			
			// We should receive "+CMGS: <message id="">" from the GSM modem.
			// If we don't, display "Error".
			if (memcmp("+CMGS:", &gsm_response, 6) != 0)
			{
				lcd_clr();
				send_string("Error...");
				while(1);
			}
			
			
			
			// Read the newline and "OK".
			gsm_read_line(&gsm_response);
			gsm_read_line(&gsm_response);
			
			
			
			// Clear the LCD and display the new message.
			lcd_clr();
			send_string("Ready...");
			
			
			
			// Wait until SW2 is released so that we don't send duplicated message.
			while (SW2 == 0);
			
		}	
	}
	
		// Check whether SW1 is pressed.
		if (SW3 == 0)
		{
			// Clear the LCD and display the new message.
			lcd_clr();
			send_string("Sending SMS...");
			
			// Send the SMS to notify the owner.
			// Please change this to your own number.
			gsm_send_command("AT+CMGS=\"0148556235\"");
			
			// We should receive '>' from the modem.
			// If we don't, display "Error".
			if (uart_rec() != '>')
			{
				lcd_clr();
				send_string("Error...");
				while(1);
			}	
			
			// Send the message.
			uart_str("Warning: Tank Level 3 Empty!");
			
			// Send <ctrl+z>.
			uart_send(0x1a);
			
			
			
			// Read the newline and response.
			gsm_read_line(&gsm_response);
			gsm_read_line(&gsm_response);
			
			// We should receive "+CMGS: <message id="">" from the GSM modem.
			// If we don't, display "Error".
			if (memcmp("+CMGS:", &gsm_response, 6) != 0)
			{
				lcd_clr();
				send_string("Error...");
				while(1);
			}
			
			
			
			// Read the newline and "OK".
			gsm_read_line(&gsm_response);
			gsm_read_line(&gsm_response);
			
			
			
			// Clear the LCD and display the new message.
			lcd_clr();
			send_string("Ready...");
			
			
			
			// Wait until SW3 is released so that we don't send duplicated message.
			while (SW3 == 0);
			
		}	
	}
}

//	functions
//==========================================================================
void delay(unsigned long data)			//delay function, the delay time
{										//depend on the given value
	for( ;data>0;data--);
}

void send_config(unsigned char data)	//send lcd configuration 
{
	rs=0;								//set lcd to configuration mode
	lcd_data=data;						//lcd data port = data
	e=1;								//pulse e to confirm the data
	delay(50);
	e=0;
	delay(50);
}

void send_char(unsigned char data)		//send lcd character
{
 	rs=1;								//set lcd to display mode
	lcd_data=data;						//lcd data port = data
	e=1;								//pulse e to confirm the data
	delay(10);
	e=0;
	delay(10);
}

void lcd_goto(unsigned char data)		//set the location of the lcd cursor
{										//if the given value is (0-15) the 
 	if(data<16)							//cursor will be at the upper line
	{									//if the given value is (20-35) the 
	 	send_config(0x80+data);			//cursor will be at the lower line
	}									//location of the lcd cursor(2X16):
	else								// -----------------------------------------------------
	{									// | |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15| |
	 	data=data-20;					// | |20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35| |
		send_config(0xc0+data);			// -----------------------------------------------------	
	}
}

void lcd_clr(void)						//clear the lcd
{
 	send_config(0x01);
	delay(600);	
}

void send_string(const char *s)			//send a string to display in the lcd
{          
  	while (s && *s)send_char (*s++);
}

unsigned char uart_rec(void)			//receive uart value
{
	unsigned char rec_data;
	while(RCIF==0);						//wait for data
	rec_data = RCREG;				
	return rec_data;					//return the data received
}

void uart_send(unsigned char data)
{	
	while(TXIF==0);				//only send the new data after 
	TXREG=data;					//the previous data finish sent
}


void uart_str(const char *s)
{
	while(*s)uart_send(*s++);
}


void gsm_send_command(const char *command)
{
	unsigned char rec_data;
	
	while (*command != 0)
	{
		uart_send(*command++);		// Send the AT command.
		rec_data = uart_rec();	// Read the echo.
	}	
	
	// Send <enter>.
	uart_str("\r\n");
	
	// Read the echo until Line Feed character is received.
	do {
		rec_data = uart_rec();
	} while (rec_data != '\n');	
}	



void gsm_read_line(char *buffer)
{
	unsigned char rec_data;
	
	// Read the data until Line Feed character is received.
	do {
		rec_data = uart_rec();
		*buffer++ = rec_data;
	} while (rec_data != '\n');	
}

推荐答案

Well, you posted a huge amount of (not properly formatted) code, giving us just the vague indication:

Well, you posted a huge amount of (not properly formatted) code, giving us just the vague indication:
Quote:

it cannot function successfully like an expected result

it cannot function successfully like an expected result



How could we possibly help you (actually I’’m trying to invoke the Mystical Powers)?


How could we possibly help you (actually I''m trying to invoke the Mystical Powers)?


这篇关于用于鱼饲系统的GSM编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆