• Welcome to LusoRobótica - Robótica em Português.
 

Módulo gsm

Started by dio123, 14 de November de 2015, 11:52

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

senso

O facto de tentares escrever no LCD enviando como comandos o que tens no buffer será um dos problemas.
Avr fanboy

dio123

#16
Já consegui,  apesar de aparecer um caracter estranho no final "OK&"

Kristey - Estou a utilizar lcd com 74hc595.

jm_araujo, senso- Sim as lib lcd não estao no site do arduino e afins, porque foi eu que as refiz tirei de um exemplo  pic.  Fica aqui o exemplo de como esta agora.
Agora vou tentar ligar a rede e fazer chamada.



//declaração  funções
void USART_init(void);
unsigned char USART_receive(void);
void USART_send( unsigned char data);
void USART_putstring(char* StringPtr);

// declaracao variaveis

int posicao=0;
volatile uint8_t buffer[16];
volatile uint8_t estado=0;


int main(void)
{
sei();
DDRD = 0b11100000;
USART_init();
lcd_begin();
lcd_msg("test usuart avr ");

while(1)
{
USART_putstring("AT\r\n");
_delay_ms(3000);

}
}

ISR(USART_RX_vect)
{
    buffer[posicao]=UDR0;         //le USART
    if(buffer[posicao++]=='\n')   //verifica o fim de linha
    {
while (posicao < 17){
buffer[posicao]=0x20;  //preencher resto da string com "espacos"
posicao++;
}
    estado = 1;        //string completa
    posicao=0;         // reset posicao string
    }

if (estado == 1)
{
lcd_gotoxy(0,1);
while(buffer[posicao]){
lcd_cmd(buffer[posicao++], 1);
}
posicao = 0;  //  reset posicao string
estado= 0;   // apaga string
}
}

senso

Escrever para o lcd que é super lento dentro de um interrupção é um erro crasso!
Avr fanboy

dio123

O ideal e usar interrupção apenas para escrever no buffer, e a escrita no lcd ficar dentro while certo?

Isto e apenas testes sem projecto a vista.

Como comparo buffer como determinada palavra?
Terei de converter o buffer e depois comparar?

dio123

Isto nao esta facil,  buffer[posicao = URD0 nao dá nada de jeito, porque envio o comando para dar-me imei, ele responde imei + ok. Entao será perciso tratar das coisas, e aqui nao estou a ver bem como.

Agora posso fazer este proceso no ISR(USART_RX_vect)

detectar 0x0D e 0x0A
gravar para o buffer[posicao++] -- aqui recebe o imei
detectar novamente 0x0D e 0x0A -- termina, aqui copiava para um outro buffer2 e apagava o actual
detectar mais uma vez 0x0D e 0x0A --
recebia o ok
detecta 0x0D e 0x0A.

jm_araujo

Deves ter o mínimo de código no ISR. Só meter o caracter num buffer e atualizar algum apontador para o mesmo ou flags.
A interpretação do conteúdo do buffer devias fazer numa máquina de estados no programa principal.

dio123

Bom dia,
Ora bem num buffer tenho 2 respostas imei e ok.
cr+cf do inicio anulei movendo o buffer da posicao 2 para 0  ficando buffer a começar logo com o imei.
funcao   memmove (receive+0,receive+2,40);.

Até aqui tranquilo, agora nao consigo e dividir a string.
Ou seja detecto 0x0D no final imei, receive[10]  agora quero copiar da posicao 10 ate 20 da string receive para uma outra string resposta, onde fica o OK.
  Na net encontrei 2 funcoes mas nao consegui fazer funcionar    
memcpy( resposta, &receive[posre] + 6, 20 );
strncpy(resposta, &receive[posre] + 6, 20);

Njay

Quote from: dio123 on 16 de December de 2015, 11:17
cr+cf do inicio anulei movendo o buffer da posicao 2 para 0  ficando buffer a começar logo com o imei.
funcao   memmove (receive+0,receive+2,40);.
Nem sempre é preciso mover, podemos pegar num ponteiro e apontá-lo para o inicio do que nos interessa.
Mas claro que para isso é preciso perceber ponteiros, que é uma cena extremamente simples mas da qual o pessoal faz um bicho de 500 cabeças, somente porque não entende o que é e como funciona a "memória" (que também é um conceito extremamente simples).

QuoteAté aqui tranquilo, agora nao consigo e dividir a string.
Ou seja detecto 0x0D no final imei, receive[10]  agora quero copiar da posicao 10 ate 20 da string receive para uma outra string resposta, onde fica o OK.
  Na net encontrei 2 funcoes mas nao consegui fazer funcionar    
memcpy( resposta, &receive[posre] + 6, 20 );
strncpy(resposta, &receive[posre] + 6, 20);
Qualquer uma delas poderia servir, mas para já é melhor usares o memcpy, ou memmove, vê o manual:

http://man7.org/linux/man-pages/man3/memcpy.3.html

O que não perceberes do manual, pergunta especificamente. Não te ponhas a experimentar à toa até (parecer) que acertas, não aprendes nada assim. Tens que entender o teu problema, entender as funções, e escrever o código seguindo a lógica.

dio123

Já consegui andar mais um pouco depois umas semanas de pausa.

Estou a usar esta função varias vezes pelo programa, só que no entanto nas sms nao esta a funcionar.
chega examente isto; +CMTI: "SM",1
a funcao if (strcmp(buffer, "\r\n+CMTI: "SM",1\r\n") == 0) {} da erro devido as "" do SM  ainda troquei por 'SM' mas nao deu.
Alguma ideia de como resolver o problema das aspas?

Obrigado


dio123

é isso jm_araujo, eu bem meti \0x22 mas passava-lhe ao lado. Refiz o codigo, e desta fez penso ja ter atinado +/- com o código.

Agora na alimentação é que esta um problema,  ao fazer chamadas ou receber sms de fez em quando desliga-se assim como ao ligar o modulo de vez em quando desliga-se. 
tenho fonte alimentação(home made 3A)no lugar da bateria. voltagem 3.7v fui aumentado até  4.18v mas desliga-se sempre.
Acrescentei um condensador 6800uF na entrada da bateria junto com 100nf nao resolveu, e cada vez que recebo chamada ou sms o lcd da fonte alimentação fica maluco.

E neste caso estou a pensar em colocar uma bateria, e queria saber se a pilha ultrafire servirá ou uma bateria de telemovel de 2A seria melhor?
Obrigado

dio123

Boa tarde
preciso de uma coisa que aparenta ser simples mas não consigo.
Tenho as coordenadas e 123456789 e preciso de adicionar um espaço para ficar 12 3456789.
Estou a tentar colocar dentro clico FOR que copia as coordenadas para latitude mas não dá.


void coordendas_gps(void)
{
memcpy (data2-10 , buffer , 100);
pch = strstr(data2,"N");
for(char i=0;i<11;)
{

Latitude[10-i]= *(pch-i);
i++;
}
Latitude[9]= 0x4e; // igual "N"
Latitude[10]= 0x00; //NULL
}
r

senso

Porque é que não usas 'N' em vez de código hex?
Avr fanboy

KammutierSpule

Esse codigo esta mesmo complicado, nao consigo perceber o que pretende fazer.
Nao queres dar exemplos do input e output que pretendes?

Geralmente se o codigo esta muito complicado e nao se entende ah primeira, e' porque nao esta bem :P

dio123

#29
calhou, meter em hex.
O basico  é localizar a letra N e W, copiar para as variaveis latitute e longitude e meter um espaço.

void coordendas_gps(void)
{
memcpy (data2-10 , buffer , 100);  //copia do buffer para data2 e apaga +GPSINF: (No data2 fica altitute latitude longitude velocidade,speed,...)
pch = strstr(data2,"N");  //Localiza a latitude até  letra N
for(char i=0;i<11;)
{
Latitude[10-i]= *(pch-i);  //Aqui o ciclo for copia  do N para trás ficando na variavel latitude assim 3051.8007,N .
i++;
}
Latitude[9] ='N';  // substitui a virgula por N
Latitude[10]= 0x00; //NULL   // apaga o N.
}
r