Ir ao conteúdo
  • Cadastre-se

ViniciusKruz

Membro Pleno
  • Posts

    724
  • Cadastrado em

  • Última visita

Tudo que ViniciusKruz postou

  1. @Renato.88 matou a pau, valeu, muito obrigado mesmo.
  2. @Renato.88 a ideia é só fazer funcionar mesmo, depois eu levo lá pra oficina e alinho a frequência no osciloscopio, lógico, com a plaquinha montada e tudo mais adicionado 31 minutos depois @Isadora Ferraz minina você até leu o artigo no site só pra me ajudar, mocionei... Eu entendi que a fórmula é em farads, porém como eu disse antes, o resultado foi muito aquém do esperado ( provavelmente erro meu na matemática elementar ) agora vou tentar me explicar, eu refiz o circuito substituindo o resistor por um de 4,7k e dois capacitores em paralelo, um de 47n e outro de 22n, total de 69n, logo na formula ficou assim: f=1/1453xRtxCt f=1/1453x4700x0,000000069 f=1/0,4712079 f=2,12 Viu só? A frequência no circuito fisico, com esse novo arranjo está na casa de 1khz, sei disso pelo ruído do trafo, porém na fórmula está dando 2hz. Risca o fosque do seu conhecimento na maconha das minhas duvidas e me mostra meu erro na interpretacao da formula pelo amorrrrr...
  3. @Isadora Ferraz entendi, eu fiquei em dúvida na fórmula pois colocando desta forma como você sugeriu(10^-6) porém havia dado um valor muito abaixo de 1hz, daí eu coloquei o capacitor como vem na nomenclatura 102(eu coloquei 1000 na formula), deu um valor em 60hz. Pode ter sido vacilo meu no uso da calculadora rsrsrs, vou refazer aqui. Obrigado
  4. @Renato.88 segue o esquema... Estou usando o CI IRS2453 com um trafo comum. Esse integrado foi projetado para trabalhar com 50/60hz embora eu percebi por dedução que ele pode gerar frequências bastante altas, o site que peguei as informações foi este: https://makingcircuits.com/blog/h-bridge-inverter-circuit-using-ic/
  5. Boa tarde pessoal, estou com uma dúvida para calcular uma frequência cuja fórmula é: 1/1453 x Rt x Ct Rt=resistor (ohms) Ct=capacitor (farads) Preciso de uma frequência de 60hz, com base nesta fórmula cheguei ao resistor com 88R e o capacitor com 1uf(102 ceramico), por se tratar de um inversor de 12v p/127v, a frequência é bem crítica e pior que que não tenho um osciloscopio pra confirmar a frequência, de ouvido mesmo da pra perceber pelo chiado no trafo, que a frequência está na casa de alguns quilohertz, o que faz com que o trafo não consiga fazer a inversão. Usando um trafo bem menor, até que deu inversao, porém com tensão abaixo do esperado no secundário. Qualquer ajuda é bem vinda, obrigado.
  6. Já tentou fazer assim: if (millis() - previousTime < 3000 ) A única coisa de diferente que percebi foram os parênteses.
  7. @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
  8. @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.
  9. @alexandro umbert Você tem a biblioteca de comunicação desse GPS?
  10. @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.
  11. 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.
  12. 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!
  13. @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.
  14. @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.
  15. @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.
  16. @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.
  17. @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.
  18. @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 }
  19. @alexandro umbert Não precisa desse trecho abaixo: matrix[0][1]= latitude; printf(LCD_PUTC,"\f%1.5f ",matrix[0][1]); No caso basta fazer assim: printf(LCD_PUTC,"\f%1.5f ",latitude); Outra coisa, porque que você ta mostrando no lcd duas vezes, a primeira quando filtra os caracteres recebidos: lcd_putc(Lat); E a segunda vez com o printf: printf(LCD_PUTC,"\f%1.5f ",latitude); O primeiro, é desnecessário. Aqui neste trecho abaixo também tem um problema, veja: for(j=0;j<10;j++){ Lat = RxBuf[k+7+j]; lcd_putc(Lat);////////////desnecessário latCompleto[j]=Lat; } lcd_gotoxy(1,2); lcd_putc("Lon "); for(j=0;j<10;j++){ Lat = RxBuf[k+21+j]; lcd_putc(Lat);////////////desnecessário } break;////havalie se ele também não está atrapalhando porque aqui será encerrada toda a rotina Além desses possíveis problemas que comentei no código acima, estou com dúvida sobre esses laços "for()": No primeiro, a variável latCompleto está pegando 10 caracteres do buffer de recepção(RxBuf) e seguindo pela lógica tem o segundo laço "for()" que vai pegar mais 10 caracteres do RxBuf, esse segundo laço está apenas mostrando no lcd, ele não deveria estar armazenando também na variável latCompleto? Caso sim, tome cuidado porque os dados já gravados pelo primeiro laço irão sobrepor os dados gravados pelo primeiro laço. Outra coisa, quando te passei o exemplo da variável laço completo(char latCompleto[10];), como pode ser observado, ela comporta apenas 10 posições de memória, logo, se você for colocar mais dados tem que mudar esta quantidade de posições como por exemplo: char latCompleto[20]; ou char latCompleto[30]; ou quantas posições forem necessárias. adicionado 9 minutos depois Outra coisa que eu ia me esquecendo, para o LCD mostrar um float, tem que configurar corretamente a opção printf(LCD_PUTC,"\f%1.5f ",latitude); Esta configuração: \f%1.5f se não me engano, está incorreta, não me recordo direito agora como utilizá-la, mas acho que no seu caso seria algo assim: printf(LCD_PUTC,"\f%10.5f ",latitude); onde o "10" seria a quantidade de caracteres e o "5" seria a quantidade de casas depois do ponto ".", verifica isso aí.
  20. @alexandro umbert Olha só, sua variável Lat só armazena um caractere por vez e esta variável está sendo convertida para o tipo float. Pra que funcione, você tem que pegar a cadeia inteira e só depois fazer a conversão, algo tipo assim: char latCompleto[10]; for(j=0;j<10;j++){ Lat = RxBuf[k+21+j]; latCompleto[j]=Lat; } latitude= atof(latCompleto); printf(LCD_PUTC,"\f%1.5f ",latitude); Explicando: a variável latCompleto é um array que vai armazenar todos os caracteres e só depois desse armazenamento será feita a conversão com o atof e também mostrado no lcd. Tenta aí pra ver.
  21. @Victor 222222 Você colocou a varredura dos botões dentro da interrupção, eu tentaria fazer diferente, usaria a interrupção apenas para sinalizar que ela aconteceu e o restante seria dentro do main. Não sei como está funcionando esta sua interrupção nem sei como ela foi configurada, mas a minha lógica seria assim: bool piscou=false; void ISR_alta_prioridade(void) { piscou=true; } daí dentro do main, no laço eterno while, faça o restante: int piscaLed1=0; while(1){ //checa se houve interrupção if(piscou){//caso tenha havido interrupção... if(piscaLed1==1){//se o botão foi pressionado... LED1 = 1; //acende o led }else{//se não foi pressionado... LED1 = 0; //apaga o led } LED2 = 1; //acende o led 2 piscou = false;//aguarda nova interrupção }else{//se a não houve ou se a interrupção já passou, apaga o led LED1 = 0; LED2 = 0; //apaga o led 2 } //varre o botão 1 if(B1){//se o botao 1 foi pressionado... while(B1){}//como não pod usar delay, pode usar esta trava para evitar que o botão seja apertado repetitivamente piscaLed1=1;//autoriza o led1 a pescar } //varre o botão 2 if(B2){//se o botão 2 foi pressionado... while(B1){}//como não pod usar delay, pode usar esta trava para evitar que o botão seja apertado repetitivamente piscaLed1=0;//proíbe o led1 de piscar } } Não sei se está correto, fiz de cabeça, podem haver erros, mas lógica seria essa.
  22. @alexandro umbert Se puder, poste esse trecho completo: for(k=0;k<1000;k++){ Para eu poder compreender a lógica usada, preciso ver esse laço completamente, o que você postou está faltando um pedaço. Só para constar, o laço completo começa com uma chave e termina com outra "{}".
  23. @alexandro umbert Aqui vai um exemplo de uso do atof e mostra no display: float x; char s[] = "2309.12e15"; x = atof(s); printf("x = %e\n",x); Veja se resolve. adicionado 7 minutos depois Esse seu codigo de recepção esta realmente muito estranho rsrs, veja o trecho acima, ele está dizendo que vai receber 1kb do gps. Isso está certo? adicionado 8 minutos depois

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...