Вы находитесь на странице: 1из 3

Cdigos Arduino;

Projeto 1:
//Indicador
boolean indicador = 0;
//Dados armazenados
byte novo_dado = 0;
byte anterior_dado = 0;
unsigned int tempo = 0; // mantm o tempo e envia os valores para armazenar temporizador []
int crono[10];// armazenamento para o sincronismo de eventos
int slope[10];// armazenamento para declive de eventos.
unsigned int totalCrono;//Usado para calculo do perodo
unsigned int periodo;//Armazenamento por um perodo
byte index = 0;//ndice atual de armazenamento
float frequencia;//Armazena a frequncia
int maxSlope = 0;//Usado para calcular declive mximo como ponto de disparo
int novoSlope;//Dados
do declive de entrada
// Variveis para decidir se voc tem uma correspondncia
byte nao_corresp = 0;// Conta quantas no-correspondncias para redefinir as variveis se voc recebeu tempo demais
byte slopeTol = 3;//Tolerncia Inclinao ajustar se preciso
int cronoTol = 10;//Tolerncia cronometro - adjust this if you need
//Variveis para deteco de amplitude
unsigned int ampCrono = 0;
byte maxAmp = 0;
byte checkMaxAmp;
byte ampLimiar = 30;//Limite para sinal muito barulhento.

void setup(){
Serial.begin(9600);

pinMode(13,OUTPUT);//Led indicador
pinMode(12,OUTPUT);//Sada
cli();//Desativa interrupes
// configurar amostragem contnua de pino analgico 0 em 38.5kHz
//limpar registros ADCSRA e ADCSRB
ADCSRA = 0;
ADCSRB = 0;
ADMUX |= (1 << REFS0); //Setar tenso de referncia
ADMUX |= (1 << ADLAR); // Alinhe esquerda o valor ADC - ento podemos ler mais que apenas 8 bits do registo ADCH .
ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //Seta o clock ADC com prescaler 32 - 16mHz/32=500kHz (taxa de amostragem)
ADCSRA |= (1 << ADATE); //Ativa o gatilho automtico
ADCSRA |= (1 << ADIE); // Habilitar interrupes quando completar medio
ADCSRA |= (1 << ADEN); //Ativa ADC
ADCSRA |= (1 << ADSC); //Inicia medies ADC
sei();//Ativa interrupes
}
//Interrupo para ADC
ISR(ADC_vect) {//Esperando novo valor ADC
PORTB & B11101111;//Seta pino 12 em nvel baixo
anterior_dado = novo_dado;//Armazena valor anterior
novo_dado = ADCH;//Novo valor de A0
if (anterior_dado < 127 & novo_dado >=127){//Se dado anterior menor que 127 e o novo maior que 127 ento
novoSlope = novo_dado - anterior_dado;//Calcula nova inclinao
if (abs(novoSlope-maxSlope)<slopeTol){//Se Slope so iguais
// gravar dados novos e redefinir o tempo
slope[index] = novoSlope;
if (novo_dado == 0 || novo_dado == 1023){//if indicador
indicador = 1;//currently indicador
Serial.println("indicador");
}
tempo++;//Incremento de tempo na taxa de 38.5kHz
ampCrono++;//Icrementa amplitude de tempo
if (abs(127-ADCH)>maxAmp){

maxAmp = abs(127-ADCH);
}
if (ampCrono==1000){
ampCrono = 0;
checkMaxAmp = maxAmp;
maxAmp = 0;
}
}
void reset(){//clean out some variables
index = 0;//reset index
nao_corresp = 0;//reset match couner
maxSlope = 0;//reset slope
}
Void checkIndicador(){//manage indicador indication
if (indicador){//if currently indicador
indicador = 0;
}
}
void loop(){
checkIndicador();
if (checkMaxAmp>ampLimiar){
frequencia = 38462/float(periodo);//calculate frequencia crono rate/periodo
//print results
Serial.print(frequencia);
Serial.println(" hz");
}
delay(100);}

Вам также может понравиться