collapse

* Posts Recentes

Arame de Estendal por almamater
[Ontem às 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Emulador NES em ESP32 por dropes
[10 de Abril de 2024, 15:30]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]

Autor Tópico: Módulo gsm  (Lida 30227 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Módulo gsm
« Responder #15 em: 07 de Dezembro de 2015, 09:08 »
O facto de tentares escrever no LCD enviando como comandos o que tens no buffer será um dos problemas.
Avr fanboy

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Módulo gsm
« Responder #16 em: 07 de Dezembro de 2015, 11:09 »
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.


Código: [Seleccione]
//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
}
}
« Última modificação: 07 de Dezembro de 2015, 11:11 por dio123 »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Módulo gsm
« Responder #17 em: 07 de Dezembro de 2015, 11:34 »
Escrever para o lcd que é super lento dentro de um interrupção é um erro crasso!
Avr fanboy

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Módulo gsm
« Responder #18 em: 08 de Dezembro de 2015, 18:12 »
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?

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Módulo gsm
« Responder #19 em: 14 de Dezembro de 2015, 11:39 »
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.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.948
  • NERD!
Re: Módulo gsm
« Responder #20 em: 14 de Dezembro de 2015, 11:58 »
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.

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Módulo gsm
« Responder #21 em: 16 de Dezembro de 2015, 11:17 »
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);

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Módulo gsm
« Responder #22 em: 16 de Dezembro de 2015, 14:09 »
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).

Citar
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);
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.

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Módulo gsm
« Responder #23 em: 10 de Fevereiro de 2016, 11:40 »
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

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.948
  • NERD!

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Módulo gsm
« Responder #25 em: 11 de Fevereiro de 2016, 22:50 »
é 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

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Módulo gsm
« Responder #26 em: 28 de Fevereiro de 2016, 17:23 »
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á.


Código: [Seleccione]
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

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Módulo gsm
« Responder #27 em: 28 de Fevereiro de 2016, 17:28 »
Porque é que não usas 'N' em vez de código hex?
Avr fanboy

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.482
Re: Módulo gsm
« Responder #28 em: 28 de Fevereiro de 2016, 18:26 »
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

Offline dio123

  • Mini Robot
  • *
  • Mensagens: 1.032
Re: Módulo gsm
« Responder #29 em: 28 de Fevereiro de 2016, 19:22 »
calhou, meter em hex.
O basico  é localizar a letra N e W, copiar para as variaveis latitute e longitude e meter um espaço.

Código: [Seleccione]
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
« Última modificação: 28 de Fevereiro de 2016, 19:25 por dio123 »