Ir ao conteúdo
  • Cadastre-se

LEOPUENA

Membro Pleno
  • Posts

    748
  • Cadastrado em

  • Última visita

Tudo que LEOPUENA postou

  1. @chacalgbi Depois de muito tentar os programas em LUA sem sucesso, passei a programar o ESP usando o arduino IDE. A programação é igual ao arduino, e por isso, mais fácil. Para tal só precisas ter a ultima versão do IDE e fazer a configuração para incluir o modulo nos "boards" do IDE.
  2. @ o líquido deve ser combustível. então não serve. @victhor393 Não preciso de um equipamento preciso, pelo contrário, preciso de algo simples e instantaneo. Os problemas relativos as diferenças de produção do petroleo seriam irrelevantes. @MOR A intenção é fazer medição em pequenas quantidades, a destilação iria destruir o produto a ser medido. Mas me parece ser uma boa ideia para casos maiores, onde um único dispositivo faria a medição de vários tipos de combustíveis diferentes. Pesquisando pela net vi que a gasolina é composta essencialmente de hidrocarbonetos. Talvez devo procurar por aí.
  3. O que pretendo é mesmo um sensor que detectasse qualquer tipo de combustível, podendo ser um único tipo, como gasolina. Desde que seja líquido. Conheço vários sensores de gases, mas não é disso que preciso. Procurando pela net apenas encontro sensores de níveis.
  4. Ola pessoal. Estava a pensar em desenvolver um dispositivo capaz de detectar combustíveis derivados do petróleo. Seria um dispositivo em que um led acenderia se seus terminais fosse posto num liquido como gasolina, gasóleo, querosene ou outro parecido, ainda que misturado com agua. Agradeço qualquer ideia.
  5. Vou postar o código aqui mesmo, assim se mais alguém quiser é só seguir. Codigo do Tx: #byte portb=0x06#bit led=portb.0char i;////////////////////////////////////////////////////////////////////////////////void main(){ int x=2; set_tris_a(0); set_tris_b(0xf2); port_b_pullups(TRUE); led=0; while(true) { i='A'; while(i=='A'){ output_a(0x0E) ; if(input(pin_b4)==0){ i='1'; led=1; delay_ms(1);} if(input(pin_b5)==0){ i='4'; led=1; delay_ms(1);} if(input(pin_b6)==0){ i='7'; led=1; delay_ms(1);} if(input(pin_b7)==0){ x='1'; led=1; delay_ms(1);} output_a(0x0D) ; if(input(pin_b4)==0){ i='2'; led=1; delay_ms(1);} if(input(pin_b5)==0){ i='5'; led=1; delay_ms(1);} if(input(pin_b6)==0){ i='8'; led=1; delay_ms(1);} if(input(pin_b7)==0){ i='0'; led=1; delay_ms(1);} output_a(0x0B) ; if(input(pin_b4)==0){ i='3'; led=1; delay_ms(1);} if(input(pin_b5)==0){ i='6'; led=1; delay_ms(1);} if(input(pin_b6)==0){ i='9'; led=1; delay_ms(1);} if(input(pin_b7)==0){ i='C'; led=1; delay_ms(1);} } printf("%c",i); led=0; }} Codigo do Rx: #byte porta=0x05#byte portb=0x06#bit carga1=porta.0#bit carga2=porta.1#bit carga3=porta.2 #bit siren=porta.3int16 dimer;short q,p;////////////////////////////////////////////////////////////////////////////////void bip(){ int16 x; for(x=0;x<300;x++){ output_high(pin_a3); delay_us(100); output_low(pin_a3); delay_us(100); }}////////////////////////////////////////////////////////////////////////////////void main(){ char rx; set_tris_a(0x80); set_tris_b(0xC2); port_b_pullups(TRUE); while(true){ if(kbhit()){ rx=getc(); switch(rx){ case '1': carga1=!carga1; bip(); break; case '2': carga2=!carga2; bip(); break; case '3': carga3=!carga3; bip(); break; case '4': if(dimer>0) dimer--; break; //diminui frequencia para dimer case '6': if(dimer<1024) dimer++; break; //aumenta frequencia para dimer case '5': if(q==0){dimer=1023; q=1;} //maxima & minima frequencia para dimer else {dimer=0; q=0;} bip(); break; case '7': carga1=carga2=carga3=1; dimer=1023; bip(); break; //liga todas cargas case '8': carga1=carga2=carga3=dimer=0; bip(); break; //desliga todas cargas case '9': carga1=carga2=carga3=0; bip(); break; //desliga todas cargas excepto dimer } delay_ms(100); } set_pwm1_duty(dimer); //FREQUENCIA DO PWM PARA O DIMER }} Os codigos foram feitos usando CCS Compiler. Eliminei algumas partes que achei que não seria necessário, portanto é possível que hajam erros ao compliar. Foi usado o PIC16F628A em cada programa, tal como visto no circuito.
  6. Há várias formas de fazer isso. Uma delas: int tempo1=0, tempo2=0, tempo3=0, void loop { if(tempo1==50) { if(led1) led1=0; else led1=1; tempo1=0; } if(tempo2==100) { if(led2) led2=0; else led2=1; tempo2=0; } if(tempo3==200) { if(led3) led3=0; else led3=1; tempo3=0; } delay(10); tempo1++;tempo2++;tempo3++; } Repara que usei apenas um único delay pra fazer piscar cada led. Depois usei 3 variaveis que contam o tempo individual pra cada led.
  7. Só podes usar o delay para o tempo menor. para os outros tempos usa uma variável que é incrementada em relação ao menor tempo. Convém criar funções para fazer isso.
  8. @aphawk Talvez um desse resolve o problema.
  9. Há uma centena de formas de fazer isso. Tem alguma ideia de como fazer? Fiz algo parecido usando dois PIC16F628A. iCASA - 628.bmp
  10. Tens que levar em conta a capacidade do buffer do PIC. O arduino envia o dado a cada 200ms. No programa desde o inicio do teste da recepção até o fim, passam 800ms. Nesse tempo o PIC recebe o dado três vezes e pode entrar em overflow. Tenta aumentar o tempo de envio, ou limpar o buffer.
  11. Vin é a tensão de entrada para o regulador (tensão já tratada). Vout é a tensão de saída pra carga. Repara que o Vin tem de ser superior ao Vout maximo (25v). Contudo, te aconselho a cemeçar com algo mais suave antes de fazer a "fonte".
  12. Adiciona no programa um led a piscar, assim poderas ver se o PIC está em funcionamento. Verifica as condições do oscilador. Ouvi dizer que esses LCDs não têm os pinos na mesma sequência que outros. os pinos 15 e 16 vêm antes do pino 1.
  13. Há um bom tempo atrás usava esse esquema para gravar o PIC pela porta serial, e o software IC-PROG. Funciona sem problemas desde que seja bem montado, e suporta o PIC18F4520.
  14. Existe támbém o livro "Use a Cabeça - C#" é muito bom pra aprender a programar C# usando o visual Studio.
  15. Ola pessoal. Estou a desenvolver um programa usando o Visual Studio 2012 [C#], que mostra em uma textbox aquilo que é digitado no teclado do computador mesmo sem foco na aplicação. Para tal, fiz uso da classe GlobalKeyboardHook, que encontrei varias versões na net. Porém em nenhuma versão encontrada consigo exibir caracteres acentuados. Quando digito um sinal de acentuação, ele aparece repetido no programa onde está a ser digitado, e nem aparece no meu aplicativo. Alguém já fez algo parecido ou poderia dar alguma ajuda? Obrigado pela atenção.
  16. Percebi a ideia que postaste @aphawk. Mas pela explicação do @kelvin silva a ideia é 'oscilar' de acordo com a transmissão. Mas não creio que seja propriamente um oscilador.
  17. Talvez a forma mais simples de fazer isso é ligar o led em questão no pino Tx e outro no pino Rx. Assim, os led piscariam em função do fluxo de informação.
  18. Aproveitando o tópico. Já alguém usou este modulo? É um adaptador para trabalhar com o NRF com interface UART. Tenho tentado usa-lo, mas até agora não tive sucesso.
  19. A função teclado() não separa os números da string, ela na verdade converte uma string com números em um número do tipo float, que pode ter 10 algarismos antes e depois da virgula. Podes usar a função pra números inteiros sem problema. O vector num[] armazena cada algarismo enviado pela serial. Depois é feita uma composição do numero por cálculo exponencial. Vou postar aqui mais detalhes do programa, e simplificar um pouco: #include <math.h>char rx;float valor,valor1;int8 num[10], num2[10],x;int16 duty=0;int1 v;float teclado();////////////////////////////////////////////////////////////////////////////////#int_RDAvoid RDA_isr(void) { rx=getc(); switch(rx) { case 'V': duty=(teclado()/100)*1023; break; default: puts(" INVALIDO "); break; } }////////////////////////////////////////////////////////////////////////////////float teclado(){ valor=valor1=0; x=0; i=i2=v=0; while(x==0){ rx=getc(); // RECEBE A STRING switch(rx){ // E CONVERTE DE ASCII PRA DECIMAL case '0': num[i]=0; i++; break; case '1': num[i]=1; i++; break; case '2': num[i]=2; i++; break; case '3': num[i]=3; i++; break; case '4': num[i]=4; i++; break; case '5': num[i]=5; i++; break; case '6': num[i]=6; i++; break; case '7': num[i]=7; i++; break; case '8': num[i]=8; i++; break; case '9': num[i]=9; i++; break; case 13 : x=1; break; case ' ': x=1; break; } } x=1; k=i; for(j=0;j<k;j++){if(i==0) { x=0; break;} valor=valor+num[j]*pow(10,(i-1)); i--; } return (valor);}////////////////////////////////////////////////////////////////////////////////void main(){ setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(0); set_pwm2_duty(0); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); while(true) { set_pwm1_duty(duty); }} Por outro lado, fazer getc()-'0' também funciona como uma conversão de ASCII pra Decimal. Portanto, #define toint( c ) ((int)(( c )-'0')) também deve funcionar. EDIT: Há também a função atol(string); na biblioteca stdlib.h. A função é a mesma, mas é muito mais eficaz. A bibliteca teclado() me permite fazer muita coisa. Mas para esse caso especifico o ideal é mesmo o atoi, atol e atoi32. Outro problema é a memória usada pela função teclado() quando usamos um PIC de 2K.
  20. Qual é o tamanho que a tua "placa única" pode ter? E qual microcontrolador está a pensar em usar? Creio que os chips dos módulos vêm programados. Mas pela quantidade de components no módulo penso que aquele é o menor tamanho possível.
  21. Fiz algo parecido para um controlo de velocidade. Enviava uma letra (V) e depois o número correspondente, ex: V80. Atenção que dessa forma não é aconselhável enviar uma palavra com mais de duas letras antes do número. A função teclado() é muito pesada, mas pode ser reduzida para números inteiros. ////////////////////////////////////////////////////////////////////////////////#int_RDAvoid RDA_isr(void) { rx=getc(); switch(rx) { case 'V': duty=(teclado()/100)*1023; printf("VELOCIDADE: "); break; default: puts(" INVALIDO "); break; } set_pwm1_duty(duty);}...////////////////////////////////////////////////////////////////////////////////float teclado(){ valor=valor1=0; x=0; i=i2=v=0; while(x==0){ rx=getc(); switch(rx){ //TRATAMENTO DA INFORMAÇÃO (CONVERSÃO DE ASCII PRA DECIMAL) case '0': if(!v){ num[i]=0; i++; } else{ num2[i2]=0; i2++; } break; case '1': if(!v){ num[i]=1; i++; } else{ num2[i2]=1; i2++; } break; case '2': if(!v){ num[i]=2; i++; } else{ num2[i2]=2; i2++; } break; case '3': if(!v){ num[i]=3; i++; } else{ num2[i2]=3; i2++; } break; case '4': if(!v){ num[i]=4; i++; } else{ num2[i2]=4; i2++; } break; case '5': if(!v){ num[i]=5; i++; } else{ num2[i2]=5; i2++; } break; case '6': if(!v){ num[i]=6; i++; } else{ num2[i2]=6; i2++; } break; case '7': if(!v){ num[i]=7; i++; } else{ num2[i2]=7; i2++; } break; case '8': if(!v){ num[i]=8; i++; } else{ num2[i2]=8; i2++; } break; case '9': if(!v){ num[i]=9; i++; } else{ num2[i2]=9; i2++; } break; case '.': v=1; break; case 13 : x=1; break; case ' ': x=1; break; } } x=1; k=i; for(j=0;j<k;j++){if(i==0){ x=0; break;} valor=valor+num[j]*pow(10,(i-1)); i--; } x=1; k=i2; i2=0;for(j=0;j<k;j++){if(i2==k){ x=0; break;} valor1=valor1+num2[j]/pow(10,(i2+1)); i2++; } valor=valor+valor1; return (valor);}
  22. Se estás a aprender ASM talvez devias começar com algo mais simples. Creio que o teu compilador é o CCS. Se for, há uma opção nele que "converte" o codigo em C e mostra em ASM. Vai â aba "compile" e dê um click em "C/ASM List".
  23. Baixei o MPLABX 1.81, a interface é totalmente diferente, a forma de criação de projectos também é diferente mas com quase todas as mesmas opções. Os ficheiros gerados são armazenados em pastas por categoria. Quanto ao código não muda nada (afinal ainda é assembly), apenas alguns aspectos gráficos como cor dos registros. Não testei a simulação.

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!