Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.

ViniciusKruz

Membros Plenos
  • Total de itens

    720
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

492

3 Seguidores

Sobre ViniciusKruz

  • Data de Nascimento 01-01-1979

Informações gerais

  • Cidade e Estado
    Unaí-MG
  • Sexo
    Masculino

Meu PC

  • Processador
    Intel DX2 66
  • Placa de vídeo
    VESA 8 Bits
  • Memória
    4M
  • Sistema Operacional
    Windows 3 11
  1. Já tentou fazer assim: if (millis() - previousTime < 3000 ) A única coisa de diferente que percebi foram os parênteses.
  2. @alexandro umbert O trecho do seu código que recebe os dados é este: #INT_RDA void Serial_isr(void) { char temp; temp = RCREG; TpS = 5; RxBuf[VetorPos] = temp; VetorPos++; if(VetorPos>1000){ TpS = 0; TemPacote = 1; return; } } Como pode-se observar, ele fica aguardando 1000 caracteres para fechar o pacote, como eu te disse, se eu entendi corretamente, o seu gps manda em torno de 60 caracteres, não entendi esse buffer gigantesco desse jeito. Proponho alterar esse buffer para 100 bytes: #define Buffer_Size 100 char RxBuf[Buffer_Size]; float latitude,longitude,latReal; char latCompleto[11];//memória para receber a latitude char longCompleto[12];//memória para receber a longitude void LimpRxBuf (void){ int16 i; for(i=0;i<100;i++){ RxBuf[i] = 0; } } int recebendoPacote=0; int pacoteCompleto=0; #INT_RDA void Serial_isr(void) { char temp; temp = RCREG; if(temp=="$"){//se for início de pacote... LimpRxBuf();//limpa o buffer recebendoPacote=1;//sinaliza que tem pacote sendo recebido } RxBuf[VetorPos] = temp;//guarda no buffer o caractere recebido VetorPos++; if(temp==0x0D){//Final de pacote <LF> VetorPos=0; pacoteCompleto=1;//recebeu um pacote completo } if(VetorPos>=100){//se for mais de 100 caracterees considera erro e zera o buffer de recepção LimpRxBuf();//limpa o buffer de recepção recebendoPacote=0;//reseta as flags de recepção pacoteCompleto=0; } } Esse código acima seria para a sua recepção do pacote, agora nesse seu laço for() ficaria assim: //formato dos dados recebidos: //$GPGLL,4717.11634,N,00833.91297,E,124923.00,A,A*6E //antes de pegar um novo valor, salva o valor antigo latReal= atof(latCompleto); if(pacoteCompleto == 1){ int virgula=0; for(k=0;k<100;k++){//filtra o pacote recebido pegando a latitude e longitude //como os dados são separados por vírgula, filtramos com base nela if(RxBuf[k]=="," && virgula==0){//pega a latitude int L; for(L=0;L<=11;L++){ latCompleto[L]=RxBuf[k+L+1]; } virgula++; } if(RxBuf[k]=="," && virgula==2){//pega a longitude int L; for(L=0;L<=12;L++){ longCompleto[L]=RxBuf[k+L+1]; } virgula++; } } //agora faz as conversões: latitude = atof(latCompleto); longitude = atof(longCompleto); lcd_gotoxy(1,1); lcd_putc("Lat "); printf(LCD_PUTC,"\f%1.5f ",latitude); lcd_gotoxy(1,2); lcd_putc("Lon "); printf(LCD_PUTC,"\f%1.5f ",longitude); if (latitude < latReal){ output_low(PIN_B0); } else{ output_high(PIN_B0); } O que estou sugerindo aqui é uma mudança significativa no seu código que pode fazer toda a diferença na velocidade do processamento. Na parte acima em que os valores são filtrados, é possível que seja necessário fazer alguns ajustes, até que seja pêgo o campo correto, pela lógica expressa no documento desse seu GPS, as informações chegam da seguinte forma: $GPGLL,4717.11634,N,00833.91297,E,124923.00,A,A*6E e o que eu fiz foi pegar 11 campos após a primeira virgula(latitude) e depois pegar mais 12 campos após a terceira vírgula(longitude), desta forma você pode fazer o mesmo para pegar qualquer informação baseada no separador(virgula). Testa aí e me fala o que deu. Seria interessante se você utilizasse um terminal serial para capturar o pacote enviado pelo gps, dar um print na tela e me mostrar para trabalhar melhor a filtragem. adicionado 6 minutos depois Material muito bom sobre seu GPS: https://www.u-blox.com/sites/default/files/products/documents/u-blox6_ReceiverDescrProtSpec_(GPS.G6-SW-10018)_Public.pdf?utm_source=en%2Fimages%2Fdownloads%2FProduct_Docs%2Fu-blox6_ReceiverDescriptionProtocolSpec_(GPS.G6-SW-10018).pdf
  3. @alexandro umbert Tem que ter alguma biblioteca de comunicação, ou no mínimo alguma função que inicializa o GPS e também funções de escrita e leitura nele, por exemplo esta variável: RxBuf[], tem alguma função que povoa ela para que você possa filtrar os dados desejados, onde estão estas funções? De qualquer maneira já consegui alguns materiais referentes ao seu GPS e pelo que pude verificar, o retorno dele é bem simples, algo tipo assim: $GPGLL,4717.11634,N,00833.91297,E,124923.00,A,A*6E Ou seja, 50 caracteres, só aí já daria uma enoooorme enxugada no seu código. Verifica aí e me passa a função que recebe esses dados para que eu possa te ajudar a melhorar a recepção.
  4. @alexandro umbert Você tem a biblioteca de comunicação desse GPS?
  5. @alexandro umbert Na documentação do seu GPS deve explicar melhor esse retorno, você tem esta documentação? Caso não tenha, informe o nome/modelo pra eu verificar.
  6. Na verdade seu problema de lentidão, acredito com quase 100% de certeza que está nesse trecho(já te alertei antes sobre esse problema): for(k=0;k<1000;k++){ Este laço está gigantesco, seu processador vai perder muito tempo percorrendo este trecho, pra resolver isso, tenta mudar esse tamanho, verifica se realmente seu GPS retorna uma variável de 1KB porque é isso o que você está processando, toda vez que seu GPS retorna os valores, seu processador vai precorrer 1KB para localizar as informações.
  7. @Victor 222222 Q erro da?
  8. Se for o ESP12 ele tem 4MB de memoria onde 1MB é para o programa e os outros 3MB são para dados, o Esp não possui eeprom fisica logo ele usa os 3MB para simular uma. Por exemplo, se definir a eeprom com 512, você terá 512 Bytes de 8 bits cada, ou seja, daria para armazenar uma frase com 512 caracteres. Para gravar/ler as informações nas eepron seja simulada ou fisica, tem que acessar endereço por endereço. Por exemplo, para gravar a palavra "senha" você envia cada caractere para uma posição espacífica da memória tipo assim: eeprom (0,"s") eeprom (1,"e") eeprom (2,"n") eeprom (3,"h") eeprom (4,"a") Depois para ler, pega de um po um: String pass; pas [0]=eeprom (0) pass [1]=eeprom (1) pass [2]=eeprom (2) pass[3]=eeprom (3) pass [4]=eeprom (4) Ignorem a sintaxe!
  9. @alexandro umbert Cara, se tá certo não sei, tem que testar. Olhando somente um trecho do código assim fica meio difícil de dizer. Uma coisa é certa, já observei que se você quiser ler a latitude usa assim: latCompleto [j]=RxBuf [k+7+j] e se você quiser pegar a longitude faça assim: longCompleto [j]=RxBuf [k+21+j] Observe esses detalhes q vai dar certo.
  10. @alexandro umbert beleza , entendi.
  11. @Júnio Teixeira Sim claro, eu só nunca utilizei porta serial simulada por software no arduino pra poder te dar um exemplo, mas pode pesquisar por aí que com certeza vai encontrar muito exemplo. Neste caso, a porta somulada vai ficar para o seu nfc.
  12. @Calep Acontece isso porque seu uno só tem uma porta serial, nesse caso basta remover do seu codigo os trechos onde cita a porta serial1. Só que aí no monitor serial não vai aparecer nada ou então um monte de lixo porque a única porta serial estará sendo usada pelo NFC.
  13. @lucianolcoa A quantidade de caracteres da senha tem que ser acima de 8 ou 9, não sei ao certo agora, mas vai testando que você descobre.
  14. @Victor 222222 Na verdade eu não configurei nada, neste exemplo que te dei apenas mostrei a lógica, neste caso estou pressupondo que todas as configurações já estão corretas inclusive essa sua rotina de interrupção: ISR_alta_prioridade(void) { piscou=true; } Pois a velocidade (frequência ) das piscadas vai depender disso.
  15. @alexandro umbert Para comparar duas variáveis na linguagem C, elas devem ser do mosmo tipo, antes é preciso fazer a conversão e depois a comparação. Quanto aos dois laços você já fez a captura da latitude agora faça o mesmo com o segundo laço pegando a longitude, tipo assim: char longCompleto[20]; lcd_gotoxy(1,2); lcd_putc("Lon "); for(j=0;j<10;j++){ longCompleto[j]= RxBuf[k+21+j]; } Note que criei uma nova variavel para conter a longitude daí é só fazer a conversão e a comparação: if (atof(latCompleto) < atof (longCompleto)){ ///executar a função }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×