Страница 1 из 1

ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Вс авг 30, 2020 12:48:40
Alek_von_German
Доброго здоровья всем!
На просторах интернета нашел исходник управления модулем SIM800l по USART при помощи ATMEGA32. В нем присутствует вывод на дисплей 16*2. Сам код предполагает при получении сообщения с определённым текстом перезванивать на номер отправителя. Для моих целей нужно, чтоб по сообщению с определенным текстом включалась/выключалась нагрузка. Я переписал код под свои цели и всё заработало. Потом я портировал код с ATMEGA32 на ATMEGA8, всё так же заработало. НО, мне теперь дисплей не нужен, т.к., смотреть на нём нечего, занимает место и память контроллера. При попытке вырезать всё, что с ним связано- нагрузка перестала вкл/откл. Подскажите, что конкретно нужно вырезать, дабы оставить только прием сообщения и управление нагрузкой. Спасибо.
Спойлер

Код: Выделить всё

#define F_CPU 8000000UL						/* define Clock Frequency */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include "LCD_16x2_H_file.h"				/* include 16x2 LCD Header file */
#include "USART_Interrupt.h"				/* include USART Header file */

#define SREG   _SFR_IO8(0x3F)

void GSM_Begin();
void GSM_Calling(char *);
void GSM_HangCall();
void GSM_Response();
void GSM_Response_Display();
void GSM_Msg_Read(int);
bool GSM_Wait_for_Msg();
void GSM_Msg_Display();
void GSM_Msg_Delete(unsigned int);
void GSM_Send_Msg(char* , char*);
void GSM_Delete_All_Msg();

char buff[160];								/* buffer to store responses and messages */
char status_flag = 0;						/* for checking any new message */
volatile int buffer_pointer;
char Mobile_no[14];							/* store mobile no. of received message */
char message_received[60];					/* save received message */
int position = 0;							/* save location of current message */


int main(void)
{
    DDRA=0xff;
    PORTA=0x00;
    buffer_pointer = 0;
    int is_msg_arrived;
    memset(message_received, 0, 60);
    LCD_Init();
    USART_Init(9600);						    /* initialize USART communication */
    sei();
    LCD_String_xy(1,0,"GSM Initializing");
    _delay_ms(3000);
    LCD_Clear();
    LCD_String_xy(1,0,"AT");
    GSM_Begin();								/* check GSM responses and initialize GSM */
    LCD_Clear();
    
    while (1){
        
        /*check if any new message received */
        
            is_msg_arrived = GSM_Wait_for_Msg();		/*check for message arrival*/
            if(is_msg_arrived== true)
            {
                LCD_Clear();
                LCD_String_xy(1,0,"New SMS");		/* new message arrived */
                _delay_ms(1000);
                LCD_Clear();
                GSM_Msg_Read(position);					/* read arrived message */
                _delay_ms(3000);
                
                /*check if received message is "call me" */
                if(strstr( message_received,"PA1_on")){
                    
                    /*GSM_Calling(Mobile_no);				/ * call sender of message * /*/
                    LCD_Clear();
                    LCD_String_xy(1,0,"PORT is ON");
                    _delay_ms(1000);
                    PORTA|=0x01;
                    
                }
                 if(strstr( message_received,"PA1_off")){
                    
                    /*GSM_Calling(Mobile_no);				/ * call sender of message * /*/
                    LCD_Clear();
                    LCD_String_xy(1,0,"PORT is OFF");
                    _delay_ms(1000);
                    PORTA&=~(0x01);
                    
                }
                
                LCD_Clear();
                GSM_Delete_All_Msg();				/* to save SIM memory delete current message */
                LCD_String_xy(1,0,"Clear all SMS");
                GSM_Response();
                _delay_ms(1000);
                
            }
            
            
            is_msg_arrived=0;
            
            LCD_Clear();
        }
        
        memset(Mobile_no, 0, 14);
        memset(message_received, 0, 60);
        
        
    }


void GSM_Begin()
{

    while(1)
    {
        LCD_Command(0xc0);
        USART_SendString("ATE0\r");			/* send ATE0 to check module is ready or not */
        _delay_ms(500);
        if(strstr(buff,"OK"))
        {
            GSM_Response();                 /* get Response */
            memset(buff,0,160);
            break;
        }
        else
        {
            LCD_String("Error");
        }
    }
    _delay_ms(1000);

    LCD_Clear();
    LCD_String_xy(1,0,"Text Mode");
    LCD_Command(0xc0);
    USART_SendString("AT+CMGF=1\r");/* select message format as text */
    GSM_Response();
    _delay_ms(1000);
}

void GSM_Msg_Delete(unsigned int position)
{
    buffer_pointer=0;
    char delete_cmd[20];
    sprintf(delete_cmd,"AT+CMGD=%d\r",position);    /* delete message at specified position */
    USART_SendString(delete_cmd);
}

void GSM_Delete_All_Msg()
{
    USART_SendString("AT+CMGDA=\"DEL ALL\"\r");		/* delete all messages of SIM */
}

bool GSM_Wait_for_Msg()
{
    char msg_location[4];
    int i;
    _delay_ms(500);
    buffer_pointer=0;

    while(1)
    {
        if(buff[buffer_pointer]=='\r' || buff[buffer_pointer]== '\n') /*eliminate "\r \n" which is start of string */
        {
            buffer_pointer++;
        }
        else
        break;
    }
    
    if(strstr(buff,"CMTI:"))                                          /* "CMTI:" to check if any new message received */
    {
        while(buff[buffer_pointer]!= ',')
        {
            buffer_pointer++;
        }
        buffer_pointer++;
        
        i=0;
        while(buff[buffer_pointer]!= '\r')
        {
            msg_location[i]=buff[buffer_pointer];				      /* copy location of received message where it is stored */
            buffer_pointer++;
            i++;
        }

        /* convert string of position to integer value */
        position = atoi(msg_location);
        
        memset(buff,0,strlen(buff));
        buffer_pointer=0;

        return true;
    }
    else
    {
        return false;
    }
}

/* ISR routine to save responses/new message */
ISR(USART_RXC_vect)
{
    buff[buffer_pointer] = UDR;							/* copy UDR(received value) to buffer */
    buffer_pointer++;
    status_flag = 1;						            /* flag for new message arrival */
}


void GSM_Send_Msg(char *num,char *sms)
{
    char sms_buffer[35];
    buffer_pointer=0;
    sprintf(sms_buffer,"AT+CMGS=\"%s\"\r",num);
    USART_SendString(sms_buffer);                       /*send command AT+CMGS="Mobile No."\r */
    _delay_ms(200);
    while(1)
    {
        if(buff[buffer_pointer]==0x3e)                  /* wait for '>' character*/
        {
            buffer_pointer = 0;
            memset(buff,0,strlen(buff));
            USART_SendString(sms);                      /* send msg to given no. */
            USART_TxChar(0x1a);                         /* send Ctrl+Z then only message will transmit*/
            break;
        }
        buffer_pointer++;
    }
    _delay_ms(300);
    buffer_pointer = 0;
    memset(buff,0,strlen(buff));
    memset(sms_buffer,0,strlen(sms_buffer));
}

void GSM_Calling(char *Mob_no)
{
    char call[20];
    sprintf(call,"ATD%s;\r",Mob_no);
    USART_SendString(call);						        /* send command ATD<Mobile_No>; for calling*/
}

void GSM_HangCall()
{
    LCD_Clear();
    USART_SendString("ATH\r");					        /*send command ATH\r to hang call*/
    
}

void GSM_Response()
{
    unsigned int timeout=0;
    int CRLF_Found=0;
    char CRLF_buff[2];
    int Response_Length=0;
    while(1)
    {
        if(timeout>=60000)								/*if timeout occur then return */
        return;
        Response_Length = strlen(buff);
        if(Response_Length)
        {
            _delay_ms(2);
            timeout++;
            if(Response_Length==strlen(buff))
            {
                for(int i=0;i<Response_Length;i++)
                {
                    memmove(CRLF_buff,CRLF_buff+1,1);
                    CRLF_buff[1]=buff[i];
                    if(strncmp(CRLF_buff,"\r\n",2))
                    {
                        if(CRLF_Found++==2)				/* search for \r\n in string */
                        {
                            GSM_Response_Display();		/* display response */
                            return;
                        }
                    }

                }
                CRLF_Found = 0;

            }
            
        }
        _delay_ms(1);
        timeout++;
    }
    status_flag=0;
}

void GSM_Response_Display()
{
    buffer_pointer = 0;
    int lcd_pointer = 0;
    while(1)
    {
        if(buff[buffer_pointer]== '\r' || buff[buffer_pointer]== '\n')  /* search for \r\n in string */
        {
            buffer_pointer++;
        }
        else
        break;
    }
    

    LCD_Command(0xc0);
    while(buff[buffer_pointer]!='\r')								   /* display response till "\r" */
    {
        LCD_Char(buff[buffer_pointer]);
        buffer_pointer++;
        lcd_pointer++;
        if(lcd_pointer==15)								               /* check for end of LCD line */
        LCD_Command(0x80);
    }
    buffer_pointer=0;
    memset(buff,0,strlen(buff));
}

void GSM_Msg_Read(int position)
{
    char read_cmd[10];
    sprintf(read_cmd,"AT+CMGR=%d\r",position);
    USART_SendString(read_cmd);							/* read message at specified location/position */
    GSM_Msg_Display();									/* display message */
}

void GSM_Msg_Display()
{
    _delay_ms(500);
    if(!(strstr(buff,"+CMGR")))                         /*check for +CMGR response */
    {
        LCD_String_xy(1,0,"No message");
    }
    else
    {
        buffer_pointer = 0;
        
        while(1)
        {
            if(buff[buffer_pointer]=='\r' || buff[buffer_pointer]== 'n')  /*wait till \r\n not over*/
            {
                buffer_pointer++;
            }
            else
            break;
        }
        
        /* search for 1st ',' to get mobile no.*/
        while(buff[buffer_pointer]!=',')
        {
            buffer_pointer++;
        }
        buffer_pointer = buffer_pointer+2;

        /* extract mobile no. of message sender */
        for(int i=0;i<=12;i++)
        {
            Mobile_no[i] = buff[buffer_pointer];
            buffer_pointer++;
        }
        
        do
        {
            buffer_pointer++;
        }while(buff[buffer_pointer-1]!= '\n');
        
        LCD_Command(0xC0);
        int i=0;

        /* display and save message */
        while(buff[buffer_pointer]!= '\r' && i<31)
        {
            LCD_Char(buff[buffer_pointer]);
            message_received[i]=buff[buffer_pointer];
            
            buffer_pointer++;
            i++;
            if(i==16)
            LCD_Command(0x80);						/* display on 1st line */
        }
        
        buffer_pointer = 0;
        memset(buff,0,strlen(buff));
    }
    status_flag = 0;
}

Re: ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Вс авг 30, 2020 17:14:05
Demiurg
Прикрепи архив со всем проектом. Ещё лучше, все материалы по этому проекту в архив и на файлообменник.
Валяется у меня макетка с модемом. Поиграюсь.

Re: ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Вс авг 30, 2020 22:11:34
Alek_von_German
вот архив

Добавлено after 4 hours 46 seconds:
Вот поправил немного еще исходник, вроде работает. Может подскажет еще что-то кто-нибудь.
В этот раз пришлось ужимать под atmega48 ввиду того, что 8-ки (внезапно!) закончились...
Спойлер

Код: Выделить всё

[b]#define F_CPU 8000000UL						/* define Clock Frequency */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include "USART_Interrupt.h"				/* include USART Header file */
#define SREG   _SFR_IO8(0x3F)
void GSM_Begin();
void GSM_Calling(char *);
void GSM_HangCall();
void GSM_Response();
void GSM_Response_Display();
void GSM_Msg_Read(int);
bool GSM_Wait_for_Msg();
void GSM_Msg_Display();
void GSM_Msg_Delete(unsigned int);
void GSM_Delete_All_Msg();
char buff[160];								/* buffer to store responses and messages */
char status_flag = 0;						/* for checking any new message */
volatile int buffer_pointer;
char message_received[60];					/* save received message */
int position = 0;							/* save location of current message */

int main(void)
{
    DDRD|=0xF0;
    PORTD|=0x00;
    DDRB|=0xff;
    PORTB|=0x00;
    buffer_pointer = 0;
    int is_msg_arrived;
    memset(message_received, 0, 60);
    USART_Init(9600);						    /* initialize USART communication */
    sei();
    GSM_Begin();								/* check GSM responses and initialize GS*/
    
    while (1)
    {
        is_msg_arrived = GSM_Wait_for_Msg();		
        if(is_msg_arrived== true)
        {
  
            GSM_Msg_Read(position);					/* read arrived message */
            if(strstr( message_received,"On")){
            PORTD|=(1<<4);
                
        }
            if(strstr( message_received,"Off")){
            PORTD&=~(1<<4);
                
        }
           GSM_Delete_All_Msg();				/* to save SIM memory delete current message*/
           GSM_Response();
  
       }
        is_msg_arrived=0;
       }
         memset(message_received, 0, 60);
    }

void GSM_Begin()
{

    while(1)
    {
        USART_SendString("ATE0\r");	
        _delay_ms(200);		
            if(strstr(buff,"OK"))
        {
            GSM_Response();                 /* get Response */
            memset(buff,0,160);
            PORTB|=1<<0;
            PORTB&=~(1<<1);
            break;
        }
             else
        {
        PORTB|=(1<<1);
        }
    }
        USART_SendString("AT+CMGF=1\r");/* select message format as text */
        GSM_Response();
}

void GSM_Msg_Delete(unsigned int position)
{
    buffer_pointer=0;
    char delete_cmd[20];
    sprintf(delete_cmd,"AT+CMGD=%d\r",position);    /* delete message at specified position */
    USART_SendString(delete_cmd);
}

void GSM_Delete_All_Msg()
{
    USART_SendString("AT+CMGDA=\"DEL ALL\"\r");		/* delete all messages of SIM */
}

bool GSM_Wait_for_Msg()
{
    char msg_location[4];
    int i;
  
    buffer_pointer=0;

    while(1)
    {
        if(buff[buffer_pointer]=='\r' || buff[buffer_pointer]== '\n') /*eliminate "\r \n" which is start of string */
        {
            buffer_pointer++;
        }
        else
        break;
    }
    
    if(strstr(buff,"CMTI:"))                                          /* "CMTI:" to check if any new message received */
    {
        while(buff[buffer_pointer]!= ',')
        {
            buffer_pointer++;
        }
        buffer_pointer++;
        
        i=0;
        while(buff[buffer_pointer]!= '\r')
        {
            msg_location[i]=buff[buffer_pointer];				      /* copy location of received message where it is stored */
            buffer_pointer++;
            i++;
        }

        /* convert string of position to integer value */
        position = atoi(msg_location);
        
        memset(buff,0,strlen(buff));
        buffer_pointer=0;

        return true;
    }
    else
    {
        return false;
    }
}

/* ISR routine to save responses/new message */
ISR(USART_RX_vect)
{
    buff[buffer_pointer] = UDR0;							/* copy UDR(received value) to buffer */
    buffer_pointer++;
    status_flag = 1;						            /* flag for new message arrival */
}

void GSM_Send_Msg(char *num,char *sms)
{
    char sms_buffer[35];
    buffer_pointer=0;
    sprintf(sms_buffer,"AT+CMGS=\"%s\"\r",num);
    USART_SendString(sms_buffer);                       /*send command AT+CMGS="Mobile No."\r */
    
    while(1)
    {
        if(buff[buffer_pointer]==0x3e)                  /* wait for '>' character*/
        {
            buffer_pointer = 0;
            memset(buff,0,strlen(buff));
            USART_SendString(sms);                      /* send msg to given no. */
            USART_TxChar(0x1a);                         /* send Ctrl+Z then only message will transmit*/
            break;
        }
        buffer_pointer++;
    }
   
    buffer_pointer = 0;
    memset(buff,0,strlen(buff));
    memset(sms_buffer,0,strlen(sms_buffer));
}

void GSM_Response()
{
    unsigned int timeout=0;
    int CRLF_Found=0;
    char CRLF_buff[2];
    int Response_Length=0;
    while(1)
    {
        if(timeout>=60000)								/*if timeout occur then return */
        return;
        Response_Length = strlen(buff);
        if(Response_Length)
        {
           
            timeout++;
            if(Response_Length==strlen(buff))
            {
                for(int i=0;i<Response_Length;i++)
                {
                    memmove(CRLF_buff,CRLF_buff+1,1);
                    CRLF_buff[1]=buff[i];
                    if(strncmp(CRLF_buff,"\r\n",2))
                    {
                        if(CRLF_Found++==2)				/* search for \r\n in string */
                        {
                            GSM_Response_Display();		/* display response */
                            return;
                        }
                    }

                }
                CRLF_Found = 0;

            }
            
        }
        
        timeout++;
    }
    status_flag=0;
}

void GSM_Response_Display()
{
    buffer_pointer = 0;
    int lcd_pointer = 0;
    while(1)
    {
        if(buff[buffer_pointer]== '\r' || buff[buffer_pointer]== '\n')  /* search for \r\n in string */
        {
            buffer_pointer++;
        }
        else
        break;
    }
    

   // LCD_Command(0xc0);
    while(buff[buffer_pointer]!='\r')								   /* display response till "\r" */
    {
    //    LCD_Char(buff[buffer_pointer]);
        buffer_pointer++;
        lcd_pointer++;
    //    if(lcd_pointer==15)								               /* check for end of LCD line */
    //    LCD_Command(0x80);
    }
    buffer_pointer=0;
    memset(buff,0,strlen(buff));
}

void GSM_Msg_Read(int position)
{
    char read_cmd[10];
    sprintf(read_cmd,"AT+CMGR=%d\r",position);
    USART_SendString(read_cmd);							/* read message at specified location/position */
    GSM_Msg_Display();									/* display message */
}

void GSM_Msg_Display()
{
    
    if(!(strstr(buff,"+CMGR")))                         /*check for +CMGR response */
    {
//        LCD_String_xy(1,0,"No message");
    }
    else
    {
        buffer_pointer = 0;
        
        while(1)
        {
            if(buff[buffer_pointer]=='\r' || buff[buffer_pointer]== 'n')  /*wait till \r\n not over*/
            {
                buffer_pointer++;
            }
            else
            break;
        }
        
        /* search for 1st ',' to get mobile no.*/
        while(buff[buffer_pointer]!=',')
        {
            buffer_pointer++;
        }
        buffer_pointer = buffer_pointer+2;

        /* extract mobile no. of message sender */
        for(int i=0;i<=12;i++)
        {
            
            buffer_pointer++;
        }
        
        do
        {
            buffer_pointer++;
        }while(buff[buffer_pointer-1]!= '\n');
        
//        LCD_Command(0xC0);
        int i=0;

        /* display and save message */
        while(buff[buffer_pointer]!= '\r' && i<31)
        {
//            LCD_Char(buff[buffer_pointer]);
            message_received[i]=buff[buffer_pointer];
            
            buffer_pointer++;
            i++;
            //if(i==16)
//            LCD_Command(0x80);						/* display on 1st line */
        }
        
        buffer_pointer = 0;
        memset(buff,0,strlen(buff));
    }
    status_flag = 0;
}[/b]

Re: ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Чт ноя 26, 2020 00:44:46
A^ex
Здравствуйте,приобрёл SIM800C GSM GPRS модуль четырёхдиапазонная Плата развития с SMA антенной слот Micro SIM для Arduino Raspberry Pi,в место Arduino ,планирую использовать ATmega8,в таблице для модуля (SIM800C Плата развития с AliExpress,файл страница продавца) есть распиновка платы,по SPI,SIM800C_POWKEY,GND,5 В,3V3 всё понятно, а для чего вот эти: GPIO02----SDA, GPIO03---SCL, GPIO14---GSM_IN, GPIO1---GSM_OUT, GPIO18---SIM800C_NET, 27---ID_SD,28---ID_SC, и если на контактное имя GPIO нет описания,значит он к плате не подключен,есть ещё функция обнаружения глушения передачи сигнала GSM,как её использовать в программе ?с уважением.

Re: ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Чт ноя 26, 2020 11:43:24
xido
[uquote="Demiurg",url="/forum/viewtopic.php?p=3885737#p3885737"]Прикрепи архив со всем проектом. Ещё лучше, все материалы по этому проекту в архив и на файлообменник.
Валяется у меня макетка с модемом. Поиграюсь.[/uquote]

А еще лучше github ведь, разве нет? ;)

Re: ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Чт ноя 26, 2020 17:26:49
A^ex
нашёл описание распиновки SIM800C GSM GPRS модуль четырехдиапазонная Плата развития с SMA антенной слот Micro SIM для Arduino Raspberry Pi,вопрос остался про функцию обнаружения глушения передачи,с уважением.

Добавлено after 3 hours 16 minutes:
Распиновка Raspberry Pi,вот сайт:https://pinout.xyz/pinout/pin8_gpio14,с лева на картинке нажимаете на необходимый пин и с права появляется описание.для чего он нужен.с уважением.

Re: ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Сб ноя 28, 2020 18:08:00
A^ex
Здравствуйте,для записи телефона,с которого приходят смс,команда так записывается:char Mobile_no[14]="+79123456789"; /* мобильный ном. полученного сообщения */,
а если с двух номеров:
char Mobile_no[14]="+79123456789";
char Mobile_no2[14]="+79123456789";
скажите как продублировать,принять смс и отправить с двух номеров,записывать в коде проекта для каждого номера функции принять и отправить смс или можно в одной функцией обойтись ,пример если можно?
с уважением.

Re: ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Пн дек 07, 2020 19:04:39
A^ex
Здравствуйте,кому не трудно поделитесь ссылкой на русскоязычный сайт,
где понятным языком расписаны все функции в библиотеках Atmel Studio 6.2
или прокомментированы,в виде таблицы,например так:

extern void *memset(void *, int, size_t); ? пример:memset(buff,0,160);?//прокомментировать.

пример:atoi(msg_location);?//прокомментировать.

extern size_t strnlen(const char *, size_t) __ATTR_PURE__; ? пример:strlen(buff);?//прокомментировать.


P.S. В проекте без дисплея строку: if(strstr( message_received,"ON")) записал так: if(strstr( buff,"ON")) и светодиод загорелся.

Re: ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Пн дек 07, 2020 19:15:10
Аlex
Это не библиотеки Atmel Studio, это стандартные библиотеки языка Си.
Примеры использования можно найти в интернете.

Re: ATmega8+sim800 управление нагрузкой по СМС

Добавлено: Пн дек 07, 2020 23:45:40
Alek_von_German
A^ex, Здравствуйте, я как доберусь до исходников, смогу подсказать.