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. My Project
  3. UV Sensor ML8511

UV Sensor ML8511

Scheduled Pinned Locked Moved My Project
13 Posts 5 Posters 7.0k Views 4 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.
  • mrc-coreM Offline
    mrc-coreM Offline
    mrc-core
    wrote on last edited by
    #4

    I have done some changings to the code and corrected de 3.3V = A1 Pin that i did not had in the first code.
    Onde day has passed with the changes and the result off this days is what you can see on the image below:

    0_1463007856557_UV_Sensor _Chart.png

    I dont now if this results are correct. I'm going to let the sensor outiside until the end of the week and see the results.
    Does anyone in the forum have a UV sensor working? Is this chart correct ??

    AWIA 1 Reply Last reply
    0
    • mrc-coreM mrc-core

      I have done some changings to the code and corrected de 3.3V = A1 Pin that i did not had in the first code.
      Onde day has passed with the changes and the result off this days is what you can see on the image below:

      0_1463007856557_UV_Sensor _Chart.png

      I dont now if this results are correct. I'm going to let the sensor outiside until the end of the week and see the results.
      Does anyone in the forum have a UV sensor working? Is this chart correct ??

      AWIA Offline
      AWIA Offline
      AWI
      Hero Member
      wrote on last edited by
      #5

      @mrc-core looks like you are using Domoticz.. Look for the Weather Underground virtual hardware.

      You can have WU report most of the weather related data from a station nearby. This includes UV measurement in a similar graph you have.

      Or my opinion : It looks like a correct graph to me but will depend on your local sun intensity.

      1 Reply Last reply
      0
      • epierreE Offline
        epierreE Offline
        epierre
        Hero Member
        wrote on last edited by
        #6

        a quick question as I try to revive a node with UV sensor (a UVM-30A) : is there a simple way to simulate the UV after sundown which is the time I can test it ?

        z-wave - Vera -> Domoticz
        rfx - Domoticz <- MyDomoAtHome <- Imperihome
        mysensors -> mysensors-gw -> Domoticz

        AWIA 1 Reply Last reply
        0
        • epierreE epierre

          a quick question as I try to revive a node with UV sensor (a UVM-30A) : is there a simple way to simulate the UV after sundown which is the time I can test it ?

          AWIA Offline
          AWIA Offline
          AWI
          Hero Member
          wrote on last edited by
          #7

          @epierre UV led? :bowtie:

          1 Reply Last reply
          0
          • mrc-coreM Offline
            mrc-coreM Offline
            mrc-core
            wrote on last edited by
            #8

            Ok i have now configured the Weather Underground virtual hardware let's see what will happen during the day off tomorrow.
            For what i can seen the UV sensor is detecting the UV normally between 11h and 17h....
            I'm going to make one new change on the code to introduce the reading s of the MP8511 voltage.

            And i'm going to change the location off the prototype in my house.

            To test the UV sensor at night you can use a UV light.

            1 Reply Last reply
            0
            • epierreE Offline
              epierreE Offline
              epierre
              Hero Member
              wrote on last edited by
              #9

              @mrc-core said:

              To test the UV sensor at night you can use a UV light.

              does a halogen lamp does this ?

              z-wave - Vera -> Domoticz
              rfx - Domoticz <- MyDomoAtHome <- Imperihome
              mysensors -> mysensors-gw -> Domoticz

              AWIA 1 Reply Last reply
              0
              • epierreE epierre

                @mrc-core said:

                To test the UV sensor at night you can use a UV light.

                does a halogen lamp does this ?

                AWIA Offline
                AWIA Offline
                AWI
                Hero Member
                wrote on last edited by
                #10

                @epierre The spectrum of UV is between 10 en 400 nanometer. so in relation to the spectrum of UV:
                0_1463141831569_upload-7c6d41cc-0a2d-4066-8102-63f44f3af6ea

                and an excerpt from medical study:

                "Halogen lamps emit significant levels of ultraviolet radiation and should be doped or covered with glass prior to use"

                0_1463141787908_upload-de6f625b-62b8-4a8e-b3c7-fe996aa277a7

                But in summary: not much

                1 Reply Last reply
                1
                • mrc-coreM Offline
                  mrc-coreM Offline
                  mrc-core
                  wrote on last edited by
                  #11

                  This is my new code for this sensor and reajusted to library 2.1.1

                  /**
                   * 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
                   * Version 1.0 - epierre
                   * Contribution: bulldoglowell, gizmocuz
                   *
                   * DESCRIPTION
                   * Connect sensor ML8511 / Arduino:
                   *
                   *  3.3V = 3.3V
                   *  OUT = A0
                   *  GND = GND
                   *  EN = 3.3V
                   *  Arduino 3.3V = Arduino A1
                   *
                   * License: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
                   */
                  
                  // Enable debug prints
                  #define MY_DEBUG
                  
                  // Enable and select radio type attached 
                  #define MY_RADIO_NRF24
                  //#define MY_RADIO_RFM69
                  //#define MY_RS485
                  
                  #include <SPI.h>
                  #include <MySensors.h>  
                  #include <SPI.h>
                  
                  //Hardware pin definitions
                  int REF_3V3 = A1;
                  int UVOUT = A0;
                  
                  #define CHILD_ID_UV 0
                  
                  unsigned long SLEEP_TIME = 30*1000; // Sleep time between reads (in milliseconds)
                  
                  MyMessage uvMsg(CHILD_ID_UV, V_UV);
                  
                  float lastUV = -1;
                  unsigned long lastSend =0; 
                  
                  void presentation()
                  {
                    // Send the sketch version information to the gateway and Controller
                    sendSketchInfo("UV Sensor", "3.0");
                  
                    // Register all sensors to gateway (they will be created as child devices)
                    present(CHILD_ID_UV, S_UV, "ML8511_UV");
                  }
                  
                  void setup()  
                  { 
                    //gw.begin(NULL, 9, true);
                    pinMode(UVOUT, INPUT);
                    pinMode(REF_3V3, INPUT);
                  }
                  
                  void loop()      
                  {
                    int uvLevel = averageAnalogRead(UVOUT);
                    int refLevel = averageAnalogRead(REF_3V3);
                    unsigned long currentTime = millis();
                  
                    //Use the 3.3V power pin as a reference to get a very accurate output value from sensor
                    float outputVoltage = 3.3 / refLevel * uvLevel;
                   
                    //float outputVoltage = 5.0 * uvLevel/1024;
                    float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0);          //Convert the voltage to a UV intensity level
                  
                    Serial.print("output: ");
                    Serial.print(refLevel);
                  
                    Serial.print("ML8511 output: ");
                    Serial.print(uvLevel);
                  
                    Serial.print(" / ML8511 voltage: ");
                    Serial.print(outputVoltage);
                  
                    Serial.print(" / UV Intensity (mW/cm^2): ");
                    Serial.print(uvIntensity);
                  
                    Serial.println();
                  
                    if ((uvIntensity != lastUV)||(currentTime-lastSend >= 5*60*1000)) 
                    {
                        lastSend=currentTime;
                        send(uvMsg.set(uvIntensity,2));
                        lastUV = uvIntensity;
                    }
                    delay(100);
                  }
                   
                  //Takes an average of readings on a given pin
                  //Returns the average
                  int averageAnalogRead(int pinToRead)
                  {
                    byte numberOfReadings = 8;
                    unsigned int runningValue = 0; 
                  
                    for(int x = 0 ; x < numberOfReadings ; x++)
                      runningValue += analogRead(pinToRead);
                    runningValue /= numberOfReadings;
                  
                    return(runningValue);  
                  }
                  
                  //The Arduino Map function but for floats
                  //From: http://forum.arduino.cc/index.php?topic=3922.0
                  float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
                  {
                    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
                  }```
                  BeniKB 1 Reply Last reply
                  1
                  • mrc-coreM mrc-core

                    This is my new code for this sensor and reajusted to library 2.1.1

                    /**
                     * 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
                     * Version 1.0 - epierre
                     * Contribution: bulldoglowell, gizmocuz
                     *
                     * DESCRIPTION
                     * Connect sensor ML8511 / Arduino:
                     *
                     *  3.3V = 3.3V
                     *  OUT = A0
                     *  GND = GND
                     *  EN = 3.3V
                     *  Arduino 3.3V = Arduino A1
                     *
                     * License: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
                     */
                    
                    // Enable debug prints
                    #define MY_DEBUG
                    
                    // Enable and select radio type attached 
                    #define MY_RADIO_NRF24
                    //#define MY_RADIO_RFM69
                    //#define MY_RS485
                    
                    #include <SPI.h>
                    #include <MySensors.h>  
                    #include <SPI.h>
                    
                    //Hardware pin definitions
                    int REF_3V3 = A1;
                    int UVOUT = A0;
                    
                    #define CHILD_ID_UV 0
                    
                    unsigned long SLEEP_TIME = 30*1000; // Sleep time between reads (in milliseconds)
                    
                    MyMessage uvMsg(CHILD_ID_UV, V_UV);
                    
                    float lastUV = -1;
                    unsigned long lastSend =0; 
                    
                    void presentation()
                    {
                      // Send the sketch version information to the gateway and Controller
                      sendSketchInfo("UV Sensor", "3.0");
                    
                      // Register all sensors to gateway (they will be created as child devices)
                      present(CHILD_ID_UV, S_UV, "ML8511_UV");
                    }
                    
                    void setup()  
                    { 
                      //gw.begin(NULL, 9, true);
                      pinMode(UVOUT, INPUT);
                      pinMode(REF_3V3, INPUT);
                    }
                    
                    void loop()      
                    {
                      int uvLevel = averageAnalogRead(UVOUT);
                      int refLevel = averageAnalogRead(REF_3V3);
                      unsigned long currentTime = millis();
                    
                      //Use the 3.3V power pin as a reference to get a very accurate output value from sensor
                      float outputVoltage = 3.3 / refLevel * uvLevel;
                     
                      //float outputVoltage = 5.0 * uvLevel/1024;
                      float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0);          //Convert the voltage to a UV intensity level
                    
                      Serial.print("output: ");
                      Serial.print(refLevel);
                    
                      Serial.print("ML8511 output: ");
                      Serial.print(uvLevel);
                    
                      Serial.print(" / ML8511 voltage: ");
                      Serial.print(outputVoltage);
                    
                      Serial.print(" / UV Intensity (mW/cm^2): ");
                      Serial.print(uvIntensity);
                    
                      Serial.println();
                    
                      if ((uvIntensity != lastUV)||(currentTime-lastSend >= 5*60*1000)) 
                      {
                          lastSend=currentTime;
                          send(uvMsg.set(uvIntensity,2));
                          lastUV = uvIntensity;
                      }
                      delay(100);
                    }
                     
                    //Takes an average of readings on a given pin
                    //Returns the average
                    int averageAnalogRead(int pinToRead)
                    {
                      byte numberOfReadings = 8;
                      unsigned int runningValue = 0; 
                    
                      for(int x = 0 ; x < numberOfReadings ; x++)
                        runningValue += analogRead(pinToRead);
                      runningValue /= numberOfReadings;
                    
                      return(runningValue);  
                    }
                    
                    //The Arduino Map function but for floats
                    //From: http://forum.arduino.cc/index.php?topic=3922.0
                    float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
                    {
                      return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
                    }```
                    BeniKB Offline
                    BeniKB Offline
                    BeniK
                    wrote on last edited by
                    #12

                    @mrc-core Thanks for the code. The code works fine but I am seing the node reporting direct measurements to the gateway every single second, spamming the gateway.

                    Is there anything I can do to stop this behavior and transmit averages; in example - every minute or every 5 minutes?

                    Thanks in advance!

                    alexsh1A 1 Reply Last reply
                    0
                    • BeniKB BeniK

                      @mrc-core Thanks for the code. The code works fine but I am seing the node reporting direct measurements to the gateway every single second, spamming the gateway.

                      Is there anything I can do to stop this behavior and transmit averages; in example - every minute or every 5 minutes?

                      Thanks in advance!

                      alexsh1A Offline
                      alexsh1A Offline
                      alexsh1
                      wrote on last edited by
                      #13

                      @benik change

                       delay(100);
                      

                      to

                      delay(300000); //5 mins reporting
                      
                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      17

                      Online

                      11.7k

                      Users

                      11.2k

                      Topics

                      113.1k

                      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