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();
}
Tags:
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:
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
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");
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por