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; } }
-
@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 ;-))?
-
@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.
-
@gohan @Bert-Ramselaar sorry, I'd better not browse the forum on my phone anymore
-
@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...
Suggested Topics
-
Welcome
Announcements • • hek