You are on page 1of 5

#include "TimerOne.

h" // Interrupcion de temporizador ajustado en 2 segundos


para sensores de lectura

#include <math.h>

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 7, 6, 5, 4, 3);

#define WindSensorPin (2) // La ubicacion de pines del sensor anemmetro

#define WindVanePin (A4) // El pasador de la sonda de hlice est conectada a

#define VaneOffset 0; // define el anemmetro desplazamiento desde el norte


magntico

int VaneValue; // valor analgico en bruto de veleta

int Direction; // traducida 0-360 direccin

int CalDirection; // valor convertido con ajuste aplicada

int LastValue; // ltimo valor de direccin

volatile bool IsSampleRequired; // Esto se establece cada cierto 2.5 s.


Consigue una velocidad del viento

volatile unsigned int TimerCount; // se utiliza para determinar 2.5 s. cuenta


del temporizador

volatile unsigned long Rotations; // Contador de rotacin copa usada en la


rutina de interrupcin

volatile unsigned long ContactBounceTime; // Temporizador para evitar el


rebote de contactos en ISR

float WindSpeed; // velocidad en milla por hora

void setup() {

Serial.begin(9600);

lcd.begin(16, 2);

LastValue = 0;

IsSampleRequired = false;

TimerCount = 0;

Rotations = 0; // establecer rotaciones a 0 listos para los calculos


Serial.begin(9600);

pinMode(WindSensorPin, INPUT);

attachInterrupt(digitalPinToInterrupt(WindSensorPin),isr_rotation, FALLING);

Serial.println("Proyecto Anemometro Jhon Cisneros Francia");

Serial.println("Vel.(MPH)\tKnots\tDireccion\tIntensidad");

// Configuracin de la interrupcin de temporizador

Timer1.initialize(500000);// Timer interrupt every 2.5 seconds

Timer1.attachInterrupt(isr_timer);

void imprimir()

lcd.setCursor(0, 1);

lcd.print("VV ");

lcd.setCursor(5, 1);

lcd.print(WindSpeed);

lcd.print("MPH");

lcd.setCursor(11, 1);

lcd.print(WindSpeed);

lcd.print("Kt");

lcd.setCursor(0, 2);

lcd.print("DV ");

lcd.setCursor(5, 2);

lcd.print(CalDirection);

lcd.print("o");

void loop() {

getWindDirection();

// Actualizar la pantalla solo si el cambio es de ms de 5 grados


if(abs(CalDirection - LastValue) > 5) {

LastValue = CalDirection;

if(IsSampleRequired) {

// Convertir a mph usando la frmula V = P (2,25 / T)

// V = P(2.25/2.5) = P * 0.9

WindSpeed = Rotations * 0.9;

Rotations = 0; // Restablecer recuento de muestra siguiente

IsSampleRequired = false;

Serial.print(WindSpeed); Serial.print("\t\t");

Serial.print(getKnots(WindSpeed)); Serial.print("\t");

Serial.print(CalDirection);

getHeading(CalDirection); Serial.print("\t\t");

getWindStrength(WindSpeed);

// Manejador de ISR de interrupcin del temporizador

void isr_timer() {

TimerCount++;

if(TimerCount == 6)

IsSampleRequired = true;

TimerCount = 0;

// Esta es la funcin que la interrupcin llama a incrementar la cuenta de la


rotacin

void isr_rotation() {
if((millis() - ContactBounceTime) > 15 ) { // Eliminar el rebote del contacto
del interruptor.

Rotations++;

ContactBounceTime = millis();

// Convertidor de MPH a nudos

float getKnots(float speed) {

return speed * 0.868976;

// Obtener direccion del viento

void getWindDirection() {

VaneValue = analogRead(WindVanePin);

Direction = map(VaneValue, 0, 1023, 0, 360);

CalDirection = Direction + VaneOffset;

if(CalDirection > 360)

CalDirection = CalDirection - 360;

if(CalDirection < 0)

CalDirection = CalDirection + 360;

// Convierte direccion de la brujula a la partida

void getHeading(int direction) {

if(direction < 22)

Serial.print(" N");

else if (direction < 67)

Serial.print(" NE");

else if (direction < 112)

Serial.print(" E");

else if (direction < 157)


Serial.print(" SE");

else if (direction < 202)

Serial.print(" S");

else if (direction < 247)

Serial.print(" SO");

else if (direction < 292)

Serial.print(" O");

else if (direction < 337)

Serial.print(" NO");

else

Serial.print(" N");

// convierte la velocidad del viento, en intensidad del viento

void getWindStrength(float speed) {

if(speed < 2)

Serial.println("Calma");

else if(speed >= 2 && speed < 4)

Serial.println("Aire ligera");

else if(speed >= 4 && speed < 8)

Serial.println("Brisa ligera");

else if(speed >= 8 && speed < 13)

Serial.println("Brisa suave");

else if(speed >= 13 && speed < 18)

Serial.println("Brisa moderada");

else if(speed >= 18 && speed < 25)

Serial.println("Brisa fresca");

else if(speed >= 25 && speed < 31)

Serial.println("Brisa fuerte");

else if(speed >= 31 && speed < 39)

Serial.println("Viento fuerte");

else

Serial.println("RUN");