Доброго здоровья всем! На просторах интернета нашел исходник управления модулем SIM800l по USART при помощи ATMEGA32. В нем присутствует вывод на дисплей 16*2. Сам код предполагает при получении сообщения с определённым текстом перезванивать на номер отправителя. Для моих целей нужно, чтоб по сообщению с определенным текстом включалась/выключалась нагрузка. Я переписал код под свои цели и всё заработало. Потом я портировал код с ATMEGA32 на ATMEGA8, всё так же заработало. НО, мне теперь дисплей не нужен, т.к., смотреть на нём нечего, занимает место и память контроллера. При попытке вырезать всё, что с ним связано- нагрузка перестала вкл/откл. Подскажите, что конкретно нужно вырезать, дабы оставить только прием сообщения и управление нагрузкой. Спасибо.
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();
/*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);
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)); }
Добавлено 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) {
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 */ }
Здравствуйте,приобрёл 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,как её использовать в программе ?с уважением.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
нашёл описание распиновки SIM800C GSM GPRS модуль четырехдиапазонная Плата развития с SMA антенной слот Micro SIM для Arduino Raspberry Pi,вопрос остался про функцию обнаружения глушения передачи,с уважением.
Добавлено after 3 hours 16 minutes: Распиновка Raspberry Pi,вот сайт:https://pinout.xyz/pinout/pin8_gpio14,с лева на картинке нажимаете на необходимый пин и с права появляется описание.для чего он нужен.с уважением.
Здравствуйте,для записи телефона,с которого приходят смс,команда так записывается:char Mobile_no[14]="+79123456789"; /* мобильный ном. полученного сообщения */, а если с двух номеров: char Mobile_no[14]="+79123456789"; char Mobile_no2[14]="+79123456789"; скажите как продублировать,принять смс и отправить с двух номеров,записывать в коде проекта для каждого номера функции принять и отправить смс или можно в одной функцией обойтись ,пример если можно? с уважением.
Здравствуйте,кому не трудно поделитесь ссылкой на русскоязычный сайт, где понятным языком расписаны все функции в библиотеках Atmel Studio 6.2 или прокомментированы,в виде таблицы,например так:
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения