UV-indeksin mittauksesta

Aloittaja Mr, tiistai, 26.05.2020, 19:27

« edellinen - seuraava »

0 Jäsenet ja 2 Vieraat katselee tätä aihetta.

Mr

Tuli päivitettyä UV-indeksin mittalaitteita ja tulokset näyttävät DIY laitteeksi ihan kelpoisilta. UV-anturi on halpa UVM30A ja toisessa (sininen viiva) on 3mm paksu toisessa (punainen) 1mm paksu kvartsilasi päällä. Lasit on kiinasta ja JGS1 "laatua", jonka UV säteilyn läpäisy on hyvä. Vihreä referenssi on Davis VP2 aseman oma UV-anturi. Viimeinen kuva on Ilmatieteen laitoksen UV-indeksikuva samalta päivältä Helsingistä, joten aika samoissa mennään. UVM30A anturit on kytketty 16-bittiseen ADS1115 AD-muuntimeen, jota taas lukee Wemos D1 mini langaton kortti. Ohjelmoinnin pystyy suorittamaan langattomasti, joten purkeille menee vain sähkö 5V. Molemmilla antureilla on omat Wemokset ja AD-muuntimet. Yritin myös ohjelmoida Wemokset nukkumaan mittausten välillä, mutta jostain syystä WLAN reititin meni siitä aina solmuun n. päivän mittausten jälkeen. Wemokset tekevät UV-mittaukset 20 sec välein ja lähettävät ne eteenpäin tietokantaan tallennettavaksi. Kaikkineen yhden anturisysteemin hinnaksi tuli n. 30€, joka on huomattavasti vähemmän kuin Daviksen anturi.     

J.Jäntti

Erittäin mielenkiintoista ja ajankohtaistakin.
Minulla on Wemos D1:n pyörittämä ilmanlaatumittari ja olen pitkään miettinyt myös UV-säteilyn mittausta mutta implementointi on ollut hukassa ja laatikossa on noita Wemoseja useampia odottamassa jotain järjellista käyttöä.
Ajatus mittauksesta kaatui viimeksi Hobby Boards:n toiminnan päättymiseen ja siihen että kyseinen tilaamani UV-anturi sieltä oli DOA enkä koskaan saanut uutta tilalle, enkä yrityksistäni huolimatta itse anturia toimimaan vaikka sen pistin palasiksi ja takaisin kasaan vikaa etsiessäni.

Jos pystyt ja haluat, kuvia tuosta kokonaisuudesta kuten myös koodi, jolla Wemos:n koodasit toimimaan itsenäiseksi mittalaitteeksi olisivat erittäin tervetulleita.
Voisin itsekin kokeilla rakentaa vastaavanlaisen mittarin ja katsoa miten sen saisi sääasemani ilmanlaatu- ja taustasäteilyarvojen kanssa näkyviin.
Juha Jäntti
Foorumin ja sivuston ylläpitäjä
Finland Weather Exchange (FinWX)

http://www.finwx.net/
------------------------------------------
Ukkoskausi avattu Suomessa: --.--.2024
Ukkoskausi avattu Helsingissä: --.--.2024
-------------------------------------------
Ukkospäivälaskuri 2024; Helsinki/Viikinmäki
0 ukkospäivää.
------------------------------------------
X, FinWX:n ylläpidon ilmoitukset
------------------------------------------

Mr

Tuossa alla on kuvia osista ja kahdesta valmiista systeemistä. Kaikki modulit on koteloitu 50mm PVC putkeen ja putken hatussa on reikä sensoria varten,  päälle liimattu 37x37x1mm USG1 kvartsilasi. Kaikki osat PVC putkia lukuun ottamatta on tilattu kiinasta.
Wemos lähettää mittaukset UDP sanomina lähiverkkoon, joten niiden keruu verkosta on helppo tehdä vaikka useammallakin koneella. Voisihan tuolla päivittää myös suoraan nettisivun kautta tietokantaa, mutta toimintavarmuuden kannalta tuo UDP sanoma ollut paras (omasta mielestä). Koodista näkee kytkennät modulien välillä ja ne on tehty kiinalaisilla Dupont kaapeleilla. Niitä kannattaa tilata iso kasa ja samoin eri levyisiä hearder-paloja niihin.
UVM30A sensorit pelaavat hyvin vuosia ryömimättä tai aiheuttamatta mitään muuta ongelmaa. Ainoat ongelmat aikaisemmin ovat olleet veden pääsy liimausten välistä kotelon sisälle, viime talvena koko lasi oli irronnut (väärä liima) ja avattaessa koko kotelo oli täynnä vettä. Lintupiikki on myös hyvä lisävaruste ja sellaisen vääntää helposti kuparilangasta. Siitä vaan rakentamaan.


// Wemos D1 mini sekä ADS1115 muunnin ja siinä analoginen UVM30A UV-sensori, 20200524
// Arduino IDE: LOLIN(WEMOS) D1 R2 & mini

#include <Wire.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <Adafruit_ADS1015.h>

//ADS1115 VCC=3.3V
//UVM30A analog UV-sensor, connected to ADS1115-A0
//Connection between modules
//DC 5V supply to Wemos pin 5V and common ground
//ADS1115 pin VDD to Wemos 3.3V, pin GND to common ground, pin SCL to Wemos D1, pin SDA to Wemos D2
//ADS1115 pin A0 to UVM30A middle (OUT) pin, pin A3 to Wemos 3.3V
//UVM30A pin VCC to Wemos 3.3V and GND to common ground

#define MSECS_SEND_UV 17000  //17 sec

const short int BUILTIN_LED2 = 2; //GPIO

boolean useSerial =  true; //false;
boolean useEthernet = true;

unsigned long timeX; // Millis() at each start of loop().
unsigned long nextSendUV; // When we next send T/H

//===================ETHERNET============================
char ssid[] = "xxxxx";  //  your network SSID (name)
char pass[] = "xxxxx";       // your network password
unsigned int UDPPort = 18888;    // port where send UDP packets
IPAddress BCAddr(192, 168, 1, 255); // broadcast address
WiFiUDP Udp;

const char* OTAhost = "WEMOS-UV1";
const char* OTAPwd = "xxxxx";
//===================END ETHERNET========================

unsigned long iErrors = 0; //number of errors

Adafruit_ADS1115 ads(0x48);  /* Use this for the 16-bit version */

//This is UDP message send to local network
char UDPMsg[] = "UV|L=1|UV=0.0000|R=0000000|V33=0.00|";
//UV=MSg type, L=1 is location, UV=measured voltage, R=round, V33=measured 3.3 voltage from Wemos
float fUV = 0.0; //UV-volts
float fVolts = 0.0; //3.3V

unsigned long iRound = 0;
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
void setup() {
  pinMode(BUILTIN_LED2, OUTPUT); // Initialize the BUILTIN_LED2 pin as an output
  digitalWrite(BUILTIN_LED2, HIGH);

  if (useSerial) {
    Serial.begin(9600);
  }

  nextSendUV = millis();//

  if (useEthernet) {  // We start by connecting to a WiFi network
    if (useSerial) {
      Serial.print("Connecting to ");
      Serial.println(ssid);
    }
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, pass);

    while (WiFi.status() != WL_CONNECTED) {
      digitalWrite(BUILTIN_LED2, 0);
      if (useSerial) {
        Serial.print('.');
      }
      delay(700);
      digitalWrite(BUILTIN_LED2, 1);
      delay(300);
    }
    if (useSerial) {
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());
    }
  }
  ArduinoOTA.setHostname(host);
  ArduinoOTA.setPassword(OTAPwd);

  ArduinoOTA.onStart([]() { // switch off all the PWMs during upgrade
    if (useSerial) {
      Serial.println("Starting OTA");
    }
  });

  ArduinoOTA.onEnd([]() { //
    if (useSerial) {
      Serial.println("OTA End");
    }
  });

  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    if (useSerial) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    }
  });

  ArduinoOTA.onError([](ota_error_t error) {
    if (useSerial) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
      else if (error == OTA_END_ERROR) Serial.println("End Failed");
    }
  });

  /* setup the OTA server */
  ArduinoOTA.begin();

  ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 0.1875mV (default)
  ads.begin();

  if (useSerial) {
    Serial.println("Ready for service now!");
  }
}  //End Setup

//-------------------------------------------------------------------------
void loop() {
  ArduinoOTA.handle();
  unsigned int adc0, adc3;

  timeX = millis();
  if (timeX >= nextSendUV) {

    adc0 = averageADSRead(0);
    fUV = (adc0 * 0.1875) / 1000;
    adc3 = averageADSRead(3);
    fVolts = (adc3 * 0.1875) / 1000;

    CreateUDP_Packet();
    if (useEthernet) {
      sendUDPpacket(BCAddr, UDPMsg, UDPPort);
    }

    if (useSerial) {
      Serial.println(UDPMsg);
    }

    nextSendUV = timeX + MSECS_SEND_UV;
    iRound++;
  }
}
// ---------------------------------------------------------------
//Returns the average
int averageADSRead(int pinToRead)
{
  byte numberOfReadings = 8;
  unsigned int runningValue = 0;

  for (int x = 0 ; x < numberOfReadings ; x++) {
    runningValue += ads.readADC_SingleEnded(pinToRead);
    delay(150); //ADS1115 needs max 125 ms for conversion
  }
  runningValue /= numberOfReadings;

  return (runningValue);
}
// ---------------------------------------------------------------
//-----------------------------------------------------------------------------
unsigned long sendUDPpacket(IPAddress & address, char *buf_, int iPort) {
  if (Udp.begin(iPort) > 0) {
    digitalWrite(BUILTIN_LED2, LOW);
    delay(100);
    Udp.beginPacket(address, iPort);
    Udp.write(buf_);
    Udp.endPacket();
    delay(100);
    Udp.stop();
    digitalWrite(BUILTIN_LED2, HIGH);
  }
}
//----------------------------------------------------------
void CreateUDP_Packet() {
  //char UDPMsg[] = "UV|L=1|UV=0.0000|R=0000000|V33=0.00|
  char tbuff[10];
  int dstart = 0;
  int dlen = 0;
  dlen = 6;
  dtostrf(fUV, dlen, 4, tbuff);
  dstart = 10;
  for (int i = 0 + dstart; i <= dstart + dlen - 1; i++)
  {
    UDPMsg[i] = tbuff[i - dstart];
  }
  dlen = 7;
  dtostrf(iRound, dlen, 0, tbuff);
  dstart = 19;
  for (int i = 0 + dstart; i <= dstart + dlen - 1; i++)
  {
    UDPMsg[i] = tbuff[i - dstart];
  }
  dlen = 2;
  dtostrf(fVolts, dlen, 2, tbuff);
  dstart = 31;
  for (int i = 0 + dstart; i <= dstart + dlen - 1; i++)
  {
    UDPMsg[i] = tbuff[i - dstart];
  }
  replaceAll(UDPMsg, " ", "0");
}  //CreateUDP_Packet
//----------------------------------------------------------
//----------------------------------------------------------
void replaceAll(char *buf_, const char *find_, const char *replace_)
{
  char *pos;
  int replen, findlen;
  findlen = strlen(find_);
  replen = strlen(replace_);
  while ((pos = strstr(buf_, find_)))
  {
    strncpy(pos, replace_, replen);
    strcpy(pos + replen, pos + findlen);
  }
}
//---------------------------------------------------------------------------------------

ARosti

Kiitos, pitääpäs tutkia tätä!  8)

J.Jäntti

Kiitos, Mr, loistavasta tietopaketista ja koodista!

Pitääpä lähteä jossain välissä tilaamaan noita laseja ja antureita. Muita osia löytyy kyllä ja jostain Bauhaus:sta tai vastaavasta tullaan hommaamaan noille UV-antureille sopivat viemäriputkenpätkät.
Mitä liimaa olet käyttänyt saadaksesi paketin pysymään tiiviinä?
Juha Jäntti
Foorumin ja sivuston ylläpitäjä
Finland Weather Exchange (FinWX)

http://www.finwx.net/
------------------------------------------
Ukkoskausi avattu Suomessa: --.--.2024
Ukkoskausi avattu Helsingissä: --.--.2024
-------------------------------------------
Ukkospäivälaskuri 2024; Helsinki/Viikinmäki
0 ukkospäivää.
------------------------------------------
X, FinWX:n ylläpidon ilmoitukset
------------------------------------------

Mr

Nykyinen liima on Loctite Power Glue, joka ei kovetu kuivuessaan vaan jää elastiseksi. Kovettuvat liimat irtoavat kovasta kvartsilasista lämpötilavaihteluiden johdosta. Tilasin Englannista valkoisia 50mm Teflon kiekkoja, pitää kesällä kokeilla miten ne läpäisevät UV-säteilyä. Noiden saatavuus on ehkä parempi kuin kiinasta tilattavien lasien. Davisin anturissa lienee myös Teflon päällimmäisenä.

weatherc

Hieno tietopaketti, kiitos.
Itsellä voisi olla kiinnostusta väsätä auringonsäteily-mittari (Kemiönsaarelle vertailuun säteily vs paneelien antama teho)

Mr

Tuossa on vielä kuva putken päästä, missä on liimattu lasi. Siistin saa jos jaksaa yrittää, mutta tärkeintä on pitää lasi puhtaana anturin kohdalta ja anturi tiukasti lasia vasten.
Auringon säteilyä varten pitäisi löytää sopivan laajakaistainen photodiodi. Kokeilin ML8511 anturia, joka on UV-alueelle aktiivinen ja sen lukemat W/m2 olivat noin kymmenesosa Davisin säteilymittarin arvoista. Eli kun Davis näytti keskipäivällä 800 W/ m2, näytti ML8511 n. 80 W/ m2. Jotkut ovat tehneet noita säteilymittareita purkamalla puutarhan aurinkokennovaloja ja kalibroimalla sen kennon arvot jollain tapaa numeerisiksi. Hyvää noissa olisi valmis säänkestävä kotelo.
Nyt odottelen postista VEML6075 UV-antureita ja niitä teflon-kiekkoja.

Mr

Perjantaiksi 12.6.2020 on annettu UV-varoitus, eli UV indeksi voi nousta etelässä yli kuuden. Tänään Ilmatieteen laitoksen Helsingin miittausasemalla arvot olivat lähes kuusi ja Kuopiossakin yli viiden. Omat mittauksen Helsingistä vähän pohjoiseen olivat viiden paikkeilla Davis anturilla ja omatekemillä runsas neljä. Tuossa taitaa vaikuttaa se kuinka leveältä kaistalta sensori mittaa, eli olisiko Davisin sensori vähän "leveämpi" kuin nuo UVM30A sensorit ja IL sensorit vieläkin leveämpiä.

Mr

Posti toi eilen valkoiset teflonkiekot ja tietenkin piti heti kokeilla toimivuutta. Toimitus kesti vajaat kaksi viikkoa ja yhden kiekon hinta oli noin kuusi euroa. Kiekot vaikuttivat tavallisilta abs-muoveilta, olivat taipuisia ja muutenkin vähän epäilytti. Päätykappaleeseen 25 reikä ja hionta tasaiseksi, jonka jälkeen liimaus. Teflonin liimaukseen suositellaan Loctite 406 liimaa, koska siihen ei tartu mikään. Pieni purkki maksaa lähes 40 euroa (enemmän kuin koko laitos), joten päätin kokeilla tavallista Power Glue liimaa. Se otti hyvin kiinni ja illalla anturi ulos odottamaan säteilyn alkamista.
Alla näkyvässä kuvassa on punaisella Teflon-anturi ja sinisellä kvartsilasi. Teflonin pitäisi päästää UV säteily läpi erittäin hyvin, joten kuvan perusteella voi todeta asiakasta taas huijatun. Kiekot ovat erittäin todennäköisesti tavallista abs muovia, mutta teflonin hinnalla.