Boa Tarde Pessoal, fiz dois sensores um de frequência e outro de tensão, individualmente os 2 funcionam muito bem. Estou tentando por a frequencia pra rodar pelo timer1 e não consigo, alguem poder me ajudar.

Segue código:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <TimerOne.h>

LiquidCrystal_I2C lcd(0x20,20,4);

#define resistance_R500 1000000
#define resistance_V2 10000
#define caliberation_V2 1.05
#define range500_mul (resistance_R500 / resistance_V2) * caliberation_V2
#define resistance_R2 1000
int adc_value = 0;
int voltage_peak_value = 0;
float voltage_average_value = 0;
float dc_voltage_V0 = 0;
int ac_voltage_V0 = 0;
unsigned long sample_count = 0;

//=============================== SETUP ========================================//
void setup(){
lcd.init();
Serial.begin(9600);
pinMode(2,INPUT);
Timer1.initialize(500000); // Inicializa o Timer1 e configura para um período de 0,5 segundos
Timer1.attachInterrupt(frequencia); // Configura a função callback() como a função para ser chamada a cada interrupção do Timer1
}

//=============================== VOLTAGE ========================================//
void voltagem()
{
voltage_peak_value = 0;
for(sample_count = 0; sample_count < 5000; sample_count ++)
{
adc_value = analogRead(A1);
if(voltage_peak_value < adc_value)
voltage_peak_value = adc_value;
else;
delayMicroseconds(1);
}
dc_voltage_V0 = voltage_peak_value * 0.00488;
ac_voltage_V0 = (dc_voltage_V0 / 1.414) * range500_mul;
lcd.setCursor(0,0);
Serial.print("V");
lcd.setCursor(3,0);
Serial.print(ac_voltage_V0);
}

//=============================== FREQUENCY ========================================//
void frequencia()
{
volatile long freq, tempo;
volatile int pulsos;
boolean pulso;
pulso=HIGH;
tempo = millis();
if(digitalRead(2)==HIGH)
{
if(pulso==HIGH)
{
pulsos = pulsos + 1;
}

pulso=LOW;

}
else{
pulso=HIGH;
}

if(tempo%200==0){
freq = (pulsos)*4;
lcd.setCursor(7,1);
Serial.println(freq);
lcd.setCursor(13,1);
Serial.println("Hz");
}
pulsos=0;
}

//=============================== LOOP ========================================//
void loop()
{
voltagem();
frequencia();
}

Exibições: 2695

Responder esta

Respostas a este tópico

Rodrigo, boa tarde.

voce pode publicar o esquema dos circuitos externos ao Arduino, para facilitar o entendimento  do funcionamento?

Rui

Oi Rodrigo, bom dia.

Voce pode postar só a parte da frequencia que voce diz que funcionou, pois eu comentei a chamada da função de voltagem e deixei só a de frequência e não funcionou corretamente.

Rui

Oi Rodrigo, modifiquei o seu código,

veja se funciona este:

http://pastebin.com/6k1WHwjU

depois da um retorno.

Rui

Oi Rodrigo,

aqui funciona normal, só não usei o LCD, mas na serial mostra a frequencia certa e a voltagem.

Rui

Oi rodrigo segue desenho

A funcao lcd.setCursor(coluna, linha) define apenas a posicao onde comeca a mensagem no LCD.

Você se esqueceu de usar lcd.print("Hello, World"), que é a funcão que envia a mensagem.

nesse código que eu tinha postado eu tinha testado apenas no serial, mas já tinha posto o lcd.print, aparece apenas "FREQUENCIMETRO" no LCD, as variaveis de Voltagem e Frequencia não aparecem.

Acho que você tem que colocar todos os comandos de lcd.setCursor e lcd.print dentro do void loop() ou do void frequencia(), mas não no void setup(). Apague essas linhas do void setup():

lcd.begin(20, 2);
lcd.setCursor(3,0);
lcd.print("FREQUENCIMETRO");

Além disso, não está mandando imprimir a variavel, mas apenas a string  "FREQUENCIMETRO" 

Tente usar isso no void frequecia():

void frequencia()
{
tempo = micros();
TOld = tempo - TNew;
TNew = tempo;
freq = (10000000/TOld)+5; // +5 correção de erro de divisão

lcd.setCursor(0,1);

lcd.print(freq/10)
Serial.print(freq/10); 
Serial.println("Hz");
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço