MyWindSensor



  • Made een Windsensor for MySensors, Works well!
    used an adafruit https://www.adafruit.com/product/1733 windmeter.

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * versie 1.1 bert ramselaar  
     * Used an UNO with a NRF24+ with external antenna
     *
     * DESCRIPTION
     * Arduino Wind Sensor
     * Adafruit Anemometer Wind Speed Sensor -> https://www.adafruit.com/product/1733
     * connect the sensor as follows :
     *   VCC  (brown)      >>> 5V
     *   A    (blue)      >>> A0 or any other analog pin
     *   GND  (black)      >>> GND
     *
    
     *
     */
    
    // Enable debug prints
    #define MY_DEBUG
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    #include <MySensors.h>
    
    #define CHILD_ID_WIND 0
    #define WIND_SENSOR_ANALOG_PIN 0
    
    unsigned long SLEEP_TIME = 2000; // Sleep time between reads (in milliseconds)
    
    // VARIABLES
    float W_Raw_A0 = 0; // stores the RAW value coming from the sensor 0 to 1023
    float W_Volt = 0; // stores voltage calculated form A0
    float W_WindSpeed = 0; // Windspeed in meters per second (m/s)
    float W_WindSpeed_last = 0; // previus Windspeed sended
    float W_Voltage_Conversion = .004882814; //This constant maps the value provided from the analog read function, which ranges from 0 to 1023, to actual voltage, which ranges from 0V to 5V
    float W_voltageMin = .4; // Mininum output voltage from anemometer in mV.
    float W_voltageMax = 2.0; // Maximum output voltage from anemometer in mV.
    float W_windSpeedMin = 0; // Wind speed in meters/sec corresponding to minimum voltage
    float W_windSpeedMax = 32; // Wind speed in meters/sec corresponding to maximum voltage
    int W_beaufort = 0; // Calculated beaufort scale
    
    MyMessage windMsg(CHILD_ID_WIND, V_WIND);
    
    void presentation()
    {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Wind Sensor", "1.1");
    
      // Register all sensors to gateway (they will be created as child devices)
      present(CHILD_ID_WIND, S_WIND);
    }
    
    void loop()
    {
      W_Raw_A0 = analogRead(WIND_SENSOR_ANALOG_PIN); // Get WIND value from A0
      W_Volt = W_Raw_A0 * W_Voltage_Conversion; //Convert sensor value to actual voltage
    
    //Convert voltage value to wind speed using range of max and min voltages and wind speed for the anemometer
    if (W_Volt <= W_voltageMin)
    {
     W_WindSpeed = 0; //Check if voltage is below minimum value. If so, set wind speed to zero.
    }
    else 
    {
      // calculate winspeed in Meters per Second 
      W_WindSpeed = (W_Volt - W_voltageMin) * W_windSpeedMax / (W_voltageMax - W_voltageMin); //For voltages above minimum value, use the linear relationship to calculate wind speed.
      // corrected // ~~W_WindSpeed = W_WindSpeed * 3.6 // convert from m/s to km/h~~
    }
    
      Serial.print("Raw Signal Value (0-1023): ");
      Serial.print(W_Raw_A0);
    
      Serial.print(" - Voltage: ");
      Serial.print(W_Volt);
    
      Serial.print(" - Windspeed M/S: ");
      Serial.print(W_WindSpeed); // unit: M/S
    
      Serial.print(" - Beaufort: ");
      Serial.println(beaufort()); // unit: beaufort scale
    
      if (ceil(W_WindSpeed) != W_WindSpeed_last) 
      {
    **/// CHANGED convert float to de nearest integer and converted (W_WindSpeed * 3.6) to km/h ///**
    send(windMsg.set((int16_t)ceil(W_WindSpeed * 3.6))); 
     W_WindSpeed_last = ceil(W_WindSpeed);
    
        //beaufort(); // option windspeed in beafort
        //send(windMsg.set(W_beaufort)); // option windspeed in beafort
      }
    
      sleep(SLEEP_TIME);
    }
    
    int beaufort(void)
    { 
        if (W_WindSpeed < 0.39)
        {
        W_beaufort = 0;
        return W_beaufort;
        } 
        else if (W_WindSpeed >= 0.3 & W_WindSpeed <= 1.5)
        {
        W_beaufort = 1;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 1.6 & W_WindSpeed <= 3.3)
        {
        W_beaufort = 2;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 3.4 & W_WindSpeed <= 5.4)
        {
        W_beaufort = 3;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 5.5 & W_WindSpeed <= 7.9)
        {
        W_beaufort = 4;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 8.0 & W_WindSpeed <= 10.7)
        {
        W_beaufort = 5;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 10.8 & W_WindSpeed <= 13.8)
        {
        W_beaufort = 6;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 13.9 & W_WindSpeed <= 17.1)
        {
        W_beaufort = 7;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 17.2 & W_WindSpeed <= 20.7)
        {
        W_beaufort = 8;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 20.8 & W_WindSpeed <= 24.4)
        {
        W_beaufort = 9;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 24.5 & W_WindSpeed <= 28.4)
        {
        W_beaufort = 10;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 28.5 & W_WindSpeed <= 32.6)
        {
        W_beaufort = 11;
        return W_beaufort;
        }
        else if (W_WindSpeed >= 32.7)
        {
        W_beaufort = 12;
        return W_beaufort;
        }
     }
    

  • Mod

    @Bert-Ramselaar HI and welcome to the forum!
    I modified your post slightly to include code tags, which improves readability.
    Could you give some more info on your project (which sensor did you use? And did I mention that we simply looooove pictures ;-))?


  • Mod

    @Yveaux He actually posted the link to the sensor :)
    It is rather expensive but since it isn't a pulse counter sensor but it gives a voltage to read it is probably why it isn't cheap.


  • Mod

    @gohan @Bert-Ramselaar sorry, I'd better not browse the forum on my phone anymore :grimacing:


  • Mod

    @gohan said in MyWindSensor:

    since it isn't a pulse counter sensor but it gives a voltage to read it is probably why it isn't cheap

    A simple pro-mini can do the same; only costs a few €...
    Looks like it's full metal, so probably a lot more durable than the plastic ones that tend to agree rapidly in the sun...


Log in to reply
 

Looks like your connection to MySensors Forum was lost, please wait while we try to reconnect.