LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

Czujnik światła ultrafioletowego ML8511 + przykład na Arduino

Światło ultrafioletowe jest powszechnym elementem świata dookoła nas. W przyrodzie jest ono emitowane przez słońce, ale ludzkość również nauczyła się nad nim panować. Jest szeroko stosowane w lampach dezynfekujących oraz w kosmetologii. Niestety, światło ultrafioletowe ma niekorzystny wpływ na zdrowie, w skrajnych przypadkach mając nawet wpływ na rozwój nowotworów. Z tego powodu istnieje potrzeba pomiarów natężenia światła ultrafioletowego na zewnątrz, a w niektórych wypadkach również wewnątrz pomieszczeń.

W artykule opiszę jeden z ogólnie dostępnych analogowych czujników UV – ML8511 firmy LAPIS Semiconductor. Dodatkowo zaprezentuję prosty sposób implementacji pomiarów na platformie Arduino

Czujnik UV ML8511

ML8511 to sensor światła ultrafioletowego, który reaguje na zakresy UV-A oraz UV-B, tj. światło długości 280 – 400 nm. Zawiera wbudowany wzmacniacz, który ma za zadanie konwertować prąd generowany przez fotoczujnik na napięcie proporcjonalne do natężenia światła. Taka architektura pozwala na łatwą komunikację z układami zewnętrznymi, jak np. przetwornik ADC. Układ zapewnia też niewielki pobór prądu, rzędu 300 µA, a w trybie obniżonego poboru energii jedynie 0,1 µA. Pozwala to wydłużyć czas pracy urządzenia na baterii.

Producent podaje, że czujnik ML8511 jest przeznaczony m.in. do smartfonów, zegarków, stacji pogodowych oraz nawigacji rowerowych.

W dokumentacji można znaleźć charakterystykę czujnika rozumianą jako napięcie wyjściowe w funkcji natężenia UV. Prezentuję ją na rysunku 1. Jak widać jest ona w zasadzie liniowa i wykazuje niewielkie przesunięcia przy zmianie temperatury otoczenia. To bardzo dobrze świadczy o jakości sensora.

Rys. 1. Charakterystyka czujnika ML8511

Zmierzona charakterystyka spektralna czujnika wykazuje, że najlepiej reaguje on na długości ok. 310 – 370 nm. Jest to więc mniej więcej zakres pasma UV-A, który obejmuje 97% ultrafioletu docierającego do powierzchni ziemi. Charakterystyka czujnika odpowiada więc naturalnemu promieniowaniu słonecznemu obecnemu na zewnątrz. W przypadku aplikacji wewnątrz pomieszczeń należy znać tą charakterystykę, gdyż nie zawsze może ona odpowiadać specyficznym potrzebom konkretnego projektu.

Rys. 2. Charakterystyka spektralna sensora ML8511

Aby w prosty sposób podłączyć sensor do płytki głównej zastosowałem moduł z analogowym czujnikiem UV ML8511. Jest to prosta płytka typu breakout, która ma za zadanie uprościć połączenie z sensorem lub dołączenie modułu do płytki stykowej. Moduł ma wyprowadzone na złącze piny zasilania i masy oraz wyjściowy OUT. Wyprowadzono także pin EN odpowiadający za to, czy czujnik jest włączony czy wyłączony. Jest on jednak na płytce dołączony do zasilania przez rezystor, a więc można go pozostawić niepodłączonym, jeśli nie planujemy wyłączać czujnika. Moduł zawiera także stabilizator LDO ustalający napięcie zasilania na 3,3 V. Pozwala więc na podłączenie nieco wyższego napięcia zasilania (np. 5 V) do portu VIN.

Rys. 3. Moduł z analogowym czujnikiem UV ML8511

Rys. 4. Uproszczony schemat płytki z sensorem

Do modułu dołączono również 5-pinowe złącze szpilkowe proste, które można przylutować do płytki.

Przykład na platformę Arduino

W dalszej części artykułu zaprezentuję przykład wykorzystania czujnika na platformie Arduino. Przykład będzie miał za zadanie zmierzyć sygnał z sensora, a następnie obliczyć natężenie światła UV, która to wartość zostanie wypisana na port szeregowy. Jako płytki bazowej użyję Cytron Maker Uno, w pełni zgodną z Arduino Uno. Użyję również płytki stykowej, a także przewodów męsko-męskich.

Podłączenie modułu o płytki Arduino wygląda następująco – użyjemy zasilania 3,3 V, które podłączymy do pinu 3V3, a więc ominiemy stabilizator LDO. Masę połączymy z GND a wyprowadzenie sygnału OUT do portu analogowego A0. Poniżej prezentuję tabelę oraz fotografię połączonego układu.

Tabela 1. Połączenie modułu z sensorem ML8511 do Arduino UNO

Moduł z sensorem ML8511 Arduino Uno
3V3 3.3V
GND GND
OUT A0

Rys. 5. Moduł z czujnikiem ML8511 podłączony do Arduino UNO

Kod przykładu

Na początku programu definiujemy zmienną wejscieUV przechowującą numer portu analogowego, do którego podłączono wyjście sensora.

int wejscieUV = A0;

W funkcji setup definiujemy tryb pinu wejściowego oraz uruchamiamy połączenie za pomocą portu szeregowego.

void setup()
{
  pinMode(wejscieUV, INPUT);
  Serial.begin(9600);
}

W pętli głównej będziemy dokonywać niezbędnych obliczeń oraz wypisywać dane na port szeregowy. Rozpoczniemy od pobrania i uśrednienia danych z portu analogowego.

int poziomUV = averageAnalogRead(wejscieUV);

Polecenie korzysta z funkcji averageAnalogRead. Ma ona za zadanie uśrednić ostatnie 10 pomiarów i zwrócić średnią. Poniżej prezentuję kod tej funkcji.

int averageAnalogRead(int pinToRead)
{
  byte numberOfReadings = 10;
  unsigned int runningValue = 0;

  for(int x = 0 ; x < numberOfReadings ; x++)
    runningValue += analogRead(pinToRead);
  
  runningValue /= numberOfReadings;

  return(runningValue);
}

Kolejny krok to obliczenie z wartości zwróconej przez ADC aktualnego napięcia wyjściowego czujnika. Korzystamy tu z faktu, że ADC działa w zakresie 0 – 5 V i jest ma rozdzielczość 10 bitów, a więc zwraca wartości z zakresu 0 – 1023.

float napiecieWejsciowe = 5.0 * poziomUV/1024;

W następnym kroku obliczymy natężenie światła ultrafioletowego. Aby to zrobić użyjemy funkcji mapfloat, która dokonuje przekształcenia liniowego napięcia na natężenie światła. Korzystamy z faktu, że charakterystyka czujnika jest liniowa, przy czym natężenie 0 mW/cm2 oznacza ok. 1 V na wyjściu, a 15 mW/cm2 (maksimum) – ok. 3 V. Wartości te można odczytać z przytoczonego wcześniej wykresu z dokumentacji.

float natezenieUV = mapfloat(napiecieWejsciowe, 0.99, 2.9, 0.0, 15.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;
}

Ostatnim krokiem w pętli głównej jest wypisanie obliczonej wartości na port szeregowy oraz wprowadzenie przerwy w wykonaniu kodu, co pozwoli na przejrzysty odczyt wyjścia.

Serial.print("Natezenie swiatla UV: ");
Serial.print(natezenieUV);
Serial.print(" mW/cm^2");
Serial.println();

delay(400);

Wynik działania kodu można obejrzeć na poniższym zrzucie ekranu. Pełen kod przykładu można pobrać poniżej, w sekcji Do pobrania.

Rys. 6. Efekt działania przykładu na platformie Arduino

Wszystkie komponenty wykorzystane do budowy przykładu są dostępne w sklepie Kamami.pl

Do pobrania