NESTE ARTIGO, APRESENTAMOS O PROJETO EM DUAS VERSÕES:
A PRIMEIRA VERSÃO DO ANEMOMETRO NÃO POSSUI O TERMOMETRO, APENAS MEDE A VELOCIDADE DO VENTO.
A SEGUNDA VERSÃO DO PROJETO, CONTA COM DOIS SENSORES DE TEMPERATURA, UM INTERNO E OUTRO EXTERNO, BEM COMO O SENSOR DE VELOCIDADE DO VENTO CONFORME O MODELO MAIS SIMPLES
LOGO ABAIXO TEMOS O CODIGO PARA VOCE INSTALAR EM SEU PROJETO:
//CODIGO FONTE - PROJETO ANEMOMETRO E TERMOMETRO DIGITAL COM ARDUINO
//JANEIRO 2025 =========================================
//LICOTELECOM ASSIS ===================================
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16,2);
const float pi = 3.14159265; //Número de pi
int period = 5000; //Tempo de medida(miliseconds)
int delaytime = 1000; //Invervalo entre as amostras (miliseconds)
int radius = 105; //Raio do anemometro(mm)
unsigned int Sample = 0; //Armazena o número de amostras
unsigned int counter = 0; //Contador para o sensor
unsigned int RPM = 0; //Rotações por minuto
float speedwind = 0; //Velocidade do vento (m/s)
float windspeed = 0; //Velocidade do vento (km/h)
float temperatura1 = 0;
const double beta1 = 3600.0;
const int pinTermistor1 = A2;
const double t01 = 273.0 + 25.0;
const double r01 = 10000.0;
const double rx1 = r01 * exp(-beta1/t01);
const double vcc1 = 5.0;
const int nAmostras1 = 5;
const double Ra = 10000.0;
float temperatura2 = 0;
const double beta2 = 3600.0;
const int pinTermistor2 = A3;
const double t02 = 273.0 + 25.0;
const double r02 = 10000.0;
const double rx2 = r02 * exp(-beta1/t02);
const double vcc2 = 5.0;
const int nAmostras2 = 5;
const double Rb = 10000.0;
int sensorTensaoDC = A0;
int amostragem =100;
float valorTensaoDC;
float mediaTotalTensaoDC = 0;
float valorFinalTensaoDC = 0;
float R1 = 10000.0;
float R2 = 995.0;
float voltsporUnidade = 0.004887586;
const int Led3 = 3;
const int Led4 = 4;
const int Led5 = 5;
const int Led6 = 6;
const int Led7 = 7;
// ------ Configurações Inicias ----------------------------
void setup() {
lcd.backlight();
analogReference(DEFAULT);
pinMode(sensorTensaoDC, INPUT);
pinMode(Led3, OUTPUT);
pinMode(Led4, OUTPUT);
pinMode(Led5, OUTPUT);
pinMode(Led6, OUTPUT);
pinMode(Led7, OUTPUT);
lcd.init();
pinMode(1, INPUT); //configura pino 2 como entrada do pulso
digitalWrite(1, HIGH); //define pulso em pull-up
Serial.begin(9600); //inicia serial em 9600
lcd.setCursor(0,0);
lcd.print("Anemometro");
delay(500);
lcd.setCursor(6,1);
lcd.print("Termometro");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Licotelecom");
delay(500);
lcd.setCursor(8,1);
lcd.print("Assis SP");
delay(1000);
lcd.clear();
lcd.setCursor(0,1);
lcd.print("v.1.05 jan.2026");
delay(500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("Iniciando.");
delay(500);
lcd.setCursor(0,0);
lcd.print ("Iniciando..");
delay(500);
lcd.setCursor(0,0);
lcd.print ("Iniciando...");
delay(500);
lcd.setCursor(0,0);
lcd.print ("Iniciando....");
delay(500);
lcd.setCursor(0,0);
lcd.print ("Iniciando.....");
delay(1000);
lcd.setCursor(0,0);
lcd.print ("Iniciando......");
delay(500);
lcd.setCursor(0,0);
lcd.print ("Iniciando.......");
delay(500);
lcd.clear();
}
// ------ Loop Infinito -------------------------------------
void loop() {
//Calculo temperatura 1 -------------------------------------
int soma1 = 0;
for (int i = 0; i < nAmostras1; i++) {
soma1 += analogRead(pinTermistor1);
delay (10);
}
// Determina a resistência do termistor 1 -------------------
double v1 = (vcc1*soma1)/(nAmostras1*1024.0);
double rt1 = (vcc1*Ra)/v1 - Ra;
// Calcula a temperatura
double t1 = beta1 / log(rt1/rx1);
temperatura1 = (t1-273.0);
//Calculo temperatura 2 -------------------------------------
int soma2 = 0;
for (int i = 0; i < nAmostras2; i++) {
soma2 += analogRead(pinTermistor2);
delay (10);
}
// Determina a resistência do termistor 2 -------------------
double v2 = (vcc2*soma2)/(nAmostras2*1024.0);
double rt2 = (vcc2*Ra)/v2 - Rb;
// Calcula a temperatura
double t2 = beta2 / log(rt2/rx2);
temperatura2 = (t2-273.0);
//Economia de bateria ---------------------------------------
if(speedwind > 1)
lcd.backlight();
if(speedwind < 1)
lcd.noBacklight();
//Calculo da tensão ajustada no trimpot ---------------------
valorFinalTensaoDC = 0;
mediaTotalTensaoDC = 0;
for(int i=0; i < amostragem ; i++){
valorTensaoDC = analogRead(sensorTensaoDC);
valorTensaoDC =(valorTensaoDC*voltsporUnidade);
mediaTotalTensaoDC = mediaTotalTensaoDC+ (valorTensaoDC / (R2/(R1+R2)));
delay(1);
}
valorFinalTensaoDC = ((mediaTotalTensaoDC / amostragem) *2); // O ultimo valor do parentese serve para ajuste fino da velocidade do alarme
//Mensagens pagina serial arduino ---------------------------
Sample++;
Serial.print(Sample);
Serial.print(": Coletando dados...");
windvelocity();
Serial.println(" Calculado.");
Serial.print("Contador: ");
Serial.print(counter);
Serial.print("; RPM: ");
RPMcalc();
Serial.print(RPM);
Serial.print("; Vel. Vento: ");
//Indicador velocidade do vento em M/s ----------------------
WindSpeed();
Serial.print(windspeed);
Serial.print(" [m/s] ");
//Indicador velocidade do vento em Km/h ---------------------
SpeedWind();
Serial.print(speedwind);
Serial.print(" [km/h] ");
Serial.println();
//Informações no display -------------------------------------------------------------------------------------------
//Velocidade medida -------------------------------
//lcd.setCursor(0,0); //coluna, linha
//lcd.print(">");
lcd.setCursor(0,0); //coluna, linha
lcd.print(speedwind,0);
lcd.print(" Km/h ");
//Velocidade maxima ajustada -----------------------
lcd.setCursor(0,1);
lcd.print(valorFinalTensaoDC,0);
lcd.print(" max ");
//Temperaturas 1 e 2 --------------------------------
lcd.setCursor(9,1); //coluna, linha
lcd.print(temperatura1,0);
lcd.write(B11011111);
lcd.print(" ");
lcd.setCursor(13,1); //coluna, linha
if(temperatura2 > 1)
lcd.print(temperatura2,0);
lcd.write(B11011111);
if((temperatura2 < 1))
lcd.setCursor(14,1); //coluna, linha
lcd.print("---");
//Mensagem de status da velocidade ------------------
lcd.setCursor(9,0);
if((speedwind < valorFinalTensaoDC))
lcd.print("Normal ");
lcd.setCursor(9,0);
if(speedwind > (valorFinalTensaoDC - 10))
lcd.print("Cuidado");
lcd.setCursor(9,0);
if((speedwind > valorFinalTensaoDC))
lcd.print("Perigo ");
//Leds indicadores ----------------------------------
if((speedwind > valorFinalTensaoDC))
digitalWrite(Led3, HIGH);
else digitalWrite(Led3, LOW);
if(speedwind > (valorFinalTensaoDC - 10))
digitalWrite(Led4, HIGH);
else digitalWrite(Led4, LOW);
if((temperatura1 < 0))
digitalWrite(Led5, HIGH);
else digitalWrite(Led5, LOW);
delay(delaytime);
}
//Função para medir velocidade do vento ------------------------------------------------------------------------
void windvelocity() {
speedwind = 0;
windspeed = 0;
counter = 0;
attachInterrupt(0, addcount, RISING);
unsigned long millis();
long startTime = millis();
while (millis() < startTime + period) {}
}
//Função para calcular o RPM -----------------------------------------------------------------------------------------------
void RPMcalc() {
RPM = (((counter) * 60) / (period / 1000)*1.0); // O ultimo valor do parentese serve para ajuste fino da velocidade indicada
}
//Velocidade do vento em m/s
void WindSpeed() {
windspeed = (((2 * pi * radius * RPM) / 60) / 1000); //Calcula a velocidade do vento em m/s
}
//Velocidade do vento em km/h
void SpeedWind() {
speedwind = ((((2 * pi * radius * RPM) / 60) / 1000) * 3.6); //Calcula velocidade do vento em km/h
}
//Incrementa contador
void addcount() {
counter++;
}


Nenhum comentário:
Postar um comentário