Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Hardware
  3. fody weather station, wind sensor

fody weather station, wind sensor

Scheduled Pinned Locked Moved Hardware
windwinddirectiongusthyt221weatherwindspeedfodyhytht01dweather station
36 Posts 7 Posters 14.9k Views 7 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A AWI

    @flopp the Ir 'emitter' is probably a led so you need a current of a few milli amps. Start low (1 kOhm in series) and find out when it starts to function.

    F Offline
    F Offline
    flopp
    wrote on last edited by flopp
    #4

    @AWI
    Thanks.
    EDIT: give it 3,3 or 5 volt, use 512 ohm works.

    1 Reply Last reply
    0
    • F Offline
      F Offline
      flopp
      wrote on last edited by flopp
      #5

      EDIT: I use digital input with pullup to see what sensor that receives the light
      So far I have a code for reading the direction and sending it to Controller.
      I will continue to add code for WindSpeed, Temp, Hum and Rain

      1 Reply Last reply
      1
      • F Offline
        F Offline
        flopp
        wrote on last edited by
        #6

        It was a HT-01D sensor for measuring temp/hum. It is I2C and address is 0x28.
        I found code for HYT 221 that worked fine.
        https://github.com/stylesuxx/Arduino-HYT-221-I2C

        1 Reply Last reply
        1
        • gohanG Offline
          gohanG Offline
          gohan
          Mod
          wrote on last edited by
          #7

          I was looking at another product but your seems more easily hackable :)

          1 Reply Last reply
          0
          • D Offline
            D Offline
            dbemowsk
            wrote on last edited by dbemowsk
            #8

            For anyone interested, I am in the process of designing a fully 3D printable weather station. The plan for the 3D printable parts will be:

            • rain gauge
            • combined wind speed and wind direction sensors
            • radiation shield that will house sensors for temp, humidity, barometric pressure and possibly a lux sensor.
            • central brain box for holding the MySensors electronics to control everything.

            I am just finishing the wind speed and direction sensor parts today. I will post pics later. I have a post in this category for the rain gauge that will be part of the station. I am designing all the parts myself. I still need to figure out a few more parts plus the MySensors electronics and code. I'll post everything as I get the different parts done.

            Vera Plus running UI7 with MySensors, Sonoffs and 1-Wire devices
            Visit my website for more Bits, Bytes and Ramblings from me: http://dan.bemowski.info/

            1 Reply Last reply
            1
            • F Offline
              F Offline
              flopp
              wrote on last edited by flopp
              #9
              This post is deleted!
              gohanG 1 Reply Last reply
              0
              • F flopp

                This post is deleted!

                gohanG Offline
                gohanG Offline
                gohan
                Mod
                wrote on last edited by
                #10

                @flopp are you still using old library version? Are you going to make it a battery powered node or else? I noticed you didn't use any sleep in the code

                F 1 Reply Last reply
                0
                • gohanG gohan

                  @flopp are you still using old library version? Are you going to make it a battery powered node or else? I noticed you didn't use any sleep in the code

                  F Offline
                  F Offline
                  flopp
                  wrote on last edited by flopp
                  #11

                  @gohan said in fody weather station, wind sensor:

                  @flopp are you still using old library version?

                  Yes, this is for 1.5

                  Are you going to make it a battery powered node or else?I noticed you didn't use any sleep in the code

                  This is powered from a PC, not battery. I want data very often that's why it is not battery powered. I can also change the code if something is wrong.

                  1 Reply Last reply
                  0
                  • F Offline
                    F Offline
                    flopp
                    wrote on last edited by
                    #12
                    This post is deleted!
                    S 1 Reply Last reply
                    1
                    • F flopp

                      This post is deleted!

                      S Offline
                      S Offline
                      sundberg84
                      Hardware Contributor
                      wrote on last edited by sundberg84
                      #13

                      @flopp - any more images? :)

                      Controller: Proxmox VM - Home Assistant
                      MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
                      MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
                      RFLink GW - Arduino Mega + RFLink Shield, 433mhz

                      F 1 Reply Last reply
                      0
                      • S sundberg84

                        @flopp - any more images? :)

                        F Offline
                        F Offline
                        flopp
                        wrote on last edited by flopp
                        #14

                        @sundberg84
                        Can upload some later today.
                        I found that I have some problem with the NRf, so I need to open it up.
                        Will upload new code later today, as well.

                        1 Reply Last reply
                        1
                        • F Offline
                          F Offline
                          flopp
                          wrote on last edited by flopp
                          #15
                          This post is deleted!
                          1 Reply Last reply
                          1
                          • F Offline
                            F Offline
                            flopp
                            wrote on last edited by
                            #16

                            some pictures
                            0_1493054883191_20170424_160412832_iOS.jpg 0_1493054891231_20170424_160402858_iOS.jpg 0_1493054901570_20170424_160025939_iOS.jpg 0_1493054908764_20170424_160020368_iOS.jpg

                            1 Reply Last reply
                            1
                            • F Offline
                              F Offline
                              flopp
                              wrote on last edited by flopp
                              #17

                              I am using this water proof connector for USB connection.
                              https://www.aliexpress.com/item/Free-Shipping-3-Sets-All-New-4-Pin-Waterproof-Electrical-Wire-Connector-Plug-HID-Male-female/32264045957.html

                              in sweden you can buy it at Biltema

                              1 Reply Last reply
                              0
                              • F Offline
                                F Offline
                                flopp
                                wrote on last edited by
                                #18

                                I have not verify all the code yet.
                                Wind direction is correct.
                                Temp is little bit higher then another temp that I have on shadow so maybe the radiation shield is not working 100%
                                Hum: my other sensor that I have outdoor broke a few weeks ago, so nothing to compare with
                                Wind Speed: I want to verify with an RPM tool. I get some extra indication from reeed switch.
                                Every second indication is below 1000 micros which is 1 millisecond, which is 1000m/s
                                Rain: lucky or unlucky I have not had any rain when the mast was up and running

                                1 Reply Last reply
                                0
                                • gohanG Offline
                                  gohanG Offline
                                  gohan
                                  Mod
                                  wrote on last edited by
                                  #19

                                  Maybe you need a better heat shield, did you try some aluminum foil?

                                  F 1 Reply Last reply
                                  0
                                  • gohanG gohan

                                    Maybe you need a better heat shield, did you try some aluminum foil?

                                    F Offline
                                    F Offline
                                    flopp
                                    wrote on last edited by
                                    #20

                                    @gohan said in fody weather station, wind sensor:

                                    Maybe you need a better heat shield, did you try some aluminum foil?

                                    Good idea :)
                                    Should I have the foil inside the shield or outside?
                                    Any pics if you done it yourself?
                                    I think I need some air through the shield so it can cool down.

                                    1 Reply Last reply
                                    0
                                    • gohanG Offline
                                      gohanG Offline
                                      gohan
                                      Mod
                                      wrote on last edited by
                                      #21

                                      I haven't done anything yet, I'm just trying to apply some cheap physics 😀
                                      I'd start from the outside and see what happens

                                      F 1 Reply Last reply
                                      0
                                      • gohanG gohan

                                        I haven't done anything yet, I'm just trying to apply some cheap physics 😀
                                        I'd start from the outside and see what happens

                                        F Offline
                                        F Offline
                                        flopp
                                        wrote on last edited by
                                        #22

                                        @gohan
                                        Ok, thanks.

                                        I will try it tomorrow

                                        1 Reply Last reply
                                        0
                                        • F Offline
                                          F Offline
                                          flopp
                                          wrote on last edited by flopp
                                          #23

                                          New code again :frowning:
                                          Wind speed: it compare between two interrupts if it is too quick, if more than 100000 micros it will not use it

                                          #include <SPI.h>
                                          #include <MySensor.h>  
                                          #include <Wire.h>
                                          
                                          #define WIND_CHILD 0
                                          #define TEMP_CHILD 1
                                          #define HUM_CHILD 2
                                          #define RAIN_CHILD 3
                                          
                                          MySensor gw;
                                          
                                          MyMessage WSMsg(WIND_CHILD, V_WIND);
                                          MyMessage WGMsg(WIND_CHILD, V_GUST);
                                          MyMessage WDMsg(WIND_CHILD, V_DIRECTION);
                                          MyMessage TempMsg(TEMP_CHILD, V_TEMP);
                                          MyMessage HumMsg(HUM_CHILD, V_HUM);
                                          MyMessage RainMsg(RAIN_CHILD, V_RAIN);
                                          MyMessage RainCounterMsg(RAIN_CHILD,V_VAR1);
                                          
                                          //Wind Speed
                                          volatile unsigned long lastPulse = 0;
                                          volatile unsigned long intervalSum;
                                          unsigned long lastInterval = 0;
                                          unsigned long looptime;
                                          float WS = 0;
                                          float WG = 0;
                                          int WScount = 0;
                                          
                                          //Wind Direction
                                          int WDarray[8] = {0,45,90,135,180,225,270,315};
                                          int WD;
                                          
                                          //Rain
                                          volatile float hwRainVolume = 0;   // Current rainvolume calculated in hardware.
                                          float bucketSize = 0.4;   // mm per tip
                                          boolean pcReceived = false; 
                                          volatile unsigned long lastSend = 0;
                                          
                                          // Temperature/Humidity
                                          double hum = 0;
                                          double temp = 0;
                                          
                                          void setup() {
                                            
                                            Wire.begin();   //start i2c
                                            
                                            gw.begin(incomingMessage, AUTO, false);
                                          
                                            // Send the sketch version information to the gateway and Controller
                                            gw.sendSketchInfo("WeatherMast", "170427");
                                          
                                            gw.present(WIND_CHILD, S_WIND);
                                            gw.present(TEMP_CHILD, S_TEMP);
                                            gw.present(HUM_CHILD, S_HUM);
                                            gw.present(RAIN_CHILD, S_RAIN);
                                          
                                            gw.request(RAIN_CHILD, V_VAR1);
                                            gw.wait(5000);
                                            //pin 2 is rain, pin 3 is wind speed
                                            //pin 4-8, 14-16 is wind direction
                                            //configure pin 2-8 as an input and enable the internal pull-up resistor
                                            for (int i=2 ; i < 9 ; i++) {
                                              pinMode(i, INPUT_PULLUP);
                                            }
                                            //configure pin 14-16(A0-A2) as an input and enable the internal pull-up resistor
                                            for (int i=14 ; i < 17 ; i++) {
                                              pinMode(i, INPUT_PULLUP);
                                            }
                                            attachInterrupt(0, Rain, FALLING);    //rain
                                            attachInterrupt(1, WindSpeed, FALLING);   //wind speed
                                          }
                                          
                                          void loop()
                                          {
                                            gw.wait(60000);
                                            detachInterrupt(1);
                                            looptime = micros();
                                            readTempHum();    //read temperature and humidity
                                            readWindDirection();    //read wind direction
                                            resend((WSMsg.set(WS, 1)),3);
                                            WS = 0;  //reset wind speed, useful if there is no wind otherwise old value will be sent to Controller
                                            resend((WGMsg.set(WG, 1)),3);
                                            WG = 0;   //reset gust
                                            resend((WDMsg.set(WD, 1)),3);
                                            resend((RainMsg.set((float)hwRainVolume,2)),3);
                                            resend((TempMsg.set(temp, 1)),3);
                                            resend((HumMsg.set(hum, 1)),3);
                                            lastPulse += micros() - looptime;
                                            attachInterrupt(1, WindSpeed, FALLING);   //wind speed
                                          }
                                          
                                          void readWindDirection()
                                          {
                                            //check in what direction the wind is. First sensor that have light will be the direction
                                            int i = 4;
                                            for (i; i < 9 ; i++){
                                              if (!digitalRead(i)){
                                                WD = WDarray[i-4];
                                                return;
                                              }
                                            }
                                            i = 14;
                                            for (i; i < 17 ; i++){
                                              if (!digitalRead(i)){
                                                WD = WDarray[i-9];
                                                return;
                                              }
                                            }
                                          }
                                          
                                          void Rain()
                                          { 
                                            unsigned long currentTime = millis();
                                            if (!pcReceived) {      
                                              gw.request(RAIN_CHILD, V_VAR1);
                                              Serial.println("Request rainCount");
                                              gw.process();
                                              return;
                                            }
                                            if (currentTime - lastSend > 5000) {      
                                            hwRainVolume = hwRainVolume + bucketSize;
                                            resend((RainCounterMsg.set(hwRainVolume,2)),3);
                                            resend((RainMsg.set((float)hwRainVolume,2)),3);
                                            lastSend=currentTime;
                                            }
                                          }
                                          
                                          void WindSpeed()
                                          {
                                            detachInterrupt(1);
                                            volatile unsigned long newPulse = micros();  
                                            unsigned long interval = newPulse-lastPulse;
                                            if (interval<16000L) { // Sometimes we get wrong interrupt. 16000L = ~30 m/s
                                              attachInterrupt(1, WindSpeed, FALLING);
                                              lastPulse = newPulse;
                                              return;
                                            }
                                            long a = interval-lastInterval;
                                            a = abs(a);
                                            lastInterval = interval;
                                            if (a > 100000) {  
                                              lastPulse = newPulse;
                                              attachInterrupt(1, WindSpeed, FALLING);
                                              return;
                                            }
                                            else {
                                              lastPulse = newPulse;
                                              WS = (0.4775/(interval/1000000.0));   
                                              if (WS > WG) {
                                                WG = WS;
                                              }
                                            }
                                            attachInterrupt(1, WindSpeed, FALLING);
                                          }
                                          
                                          void readTempHum()
                                          {
                                            Wire.beginTransmission(0x28);   // Begin transmission with given device on I2C bus
                                            Wire.requestFrom(0x28, 4);      // Request 4 bytes 
                                            if(Wire.available() == 4) {                   
                                              int b1 = Wire.read();
                                              int b2 = Wire.read();
                                              int b3 = Wire.read();
                                              int b4 = Wire.read();
                                              
                                              Wire.endTransmission();           // End transmission and release I2C bus
                                              
                                              // combine humidity bytes and calculate humidity
                                              int rawHumidity = b1 << 8 | b2;
                                              // compound bitwise to get 14 bit measurement first two bits
                                              // are status/stall bit (see intro text)
                                              rawHumidity =  (rawHumidity &= 0x3FFF);
                                              hum = 100.0 / pow(2,14) * rawHumidity;
                                              
                                              // combine temperature bytes and calculate temperature
                                              b4 = (b4 >> 2); // Mask away 2 least significant bits see HYT 221 doc
                                              int rawTemperature = b3 << 6 | b4;
                                              temp = 165.0 / pow(2,14) * rawTemperature - 40;
                                             }
                                          }
                                          
                                          void incomingMessage(const MyMessage &message)
                                          {
                                            if (message.type==V_VAR1) {
                                              hwRainVolume = message.getFloat();
                                              pcReceived = true;
                                              Serial.print("Received last pulse count from gw: ");
                                              Serial.println(hwRainVolume,2);   
                                            }
                                          }
                                          
                                          void resend(MyMessage &msg, int repeats)
                                          {
                                            int repeat = 1;
                                            int repeatdelay = 0;
                                            boolean sendOK = false;
                                          
                                            while ((sendOK == false) and (repeat < repeats)) {
                                              if (gw.send(msg)) {
                                                sendOK = true;
                                              }
                                              else {
                                                sendOK = false;
                                                Serial.print("Error ");
                                                Serial.println(repeat);
                                                repeatdelay += 500;
                                              }
                                              repeat++; delay(repeatdelay);
                                            }
                                          }
                                          

                                          EDIT: added

                                          WS = 0;
                                          

                                          in loop

                                          1 Reply Last reply
                                          0

                                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                                          With your input, this post could be even better 💗

                                          Register Login
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          15

                                          Online

                                          12.0k

                                          Users

                                          11.2k

                                          Topics

                                          113.4k

                                          Posts


                                          Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • MySensors
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular