terça-feira, 6 de janeiro de 2026

ANEMOMETRO - TERMOMETRO COM ARDUINO

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++;
  }