LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

[PROJEKT] Wskaźnik promieniowania ultrafioletowego – Arduino, wyświetlacz E-PAPER oraz czujnik UV

Gdy demo zostało wyświetlone prawidłowo, można przejść do pisania programu wyświetlającego indeks UV. Program pobiera wartość analogową z czujnika promieniowania ultrafioletowego (pin A0), sprawdza jaki indeks UV odpowiada odczytanej wartości i ostatecznie wyświetla przypisaną wartość indeksu na wyświetlaczu E-PAPER. Pomiar oraz wyświetlanie wyniku odbywa się tylko raz – przy uruchomieniu programu. Aby wyzwolić kolejny pomiar należy nacisnąć przycisk RESET na płytce KAmduino UNO lub odłączyć zasilanie i podłączyć je ponownie.

Pełen kod programu znajduje się w sekcji Do pobrania na końcu artykułu.

Na początku programu dołączane są biblioteki do obsługi interfejsu SPI i wyświetlacza E-PAPER. Definiowane są również zmienne do wybierania koloru wyświetlanego tekstu

#include <SPI.h>
#include <epd2in7b.h>
#include <epdpaint.h> 

#define COLORED     1
#define UNCOLORED   0

Następnie w funkcji setup() ustawiana jest prędkość portu szeregowego oraz inicjalizowane jest działanie biblioteki. Gdy program nie wykryje podłączonego wyświetlacza, na port szeregowy zostanie wysłany komunikat „Inicjalizacja nieprawidlowa!„.

void setup() 
{
  Serial.begin(9600);
  Epd epd;
 
  if (epd.Init() != 0) 
  {
    Serial.print("Inicjalizacja nieprawidlowa! ");
    return;
  }

Czyszczona jest pamięć SRAM wyświetlacza oraz deklarowane są parametry potrzebne do prawidłowego wyświetlania tekstu oraz grafik na ekranie.

epd.ClearFrame(); // czyszczenie pamięci SRAM wyswietlacza E-PAPER

  unsigned char image[1024];
  Paint paint(image, 176, 24);    //width should be the multiple of 8

Następnie wyświetlany jest napis „MIKROKONTROLER.PL”. Jest on czarny (paint.Clear(UNCOLORED)), napisany czcionką font12 (dostępne są również czcionki font8, font12, font20 oraz font24). Umieszczono go centralnie w górnej cześć ekranu – pozycja x=35 (odsunięty od bocznej krawędzi o 32 pikseli), y=5 (odsunięty od górnej krawędzi o 5 pikseli).

paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 0, "MIKROKONTROLER.PL", &Font12, COLORED);
epd.TransmitPartialBlack(paint.GetImage(), 32, 5, paint.GetWidth(), paint.GetHeight());

Poniżej wyświetlony zostanie tekst „CZUJNIK UV”. Będzie on biały na czerwonym tle (paint.Clear(COLORED)), napisany czcionką font20.

  paint.Clear(COLORED);
  paint.DrawStringAt(20, 2, "CZUJNIK UV", &Font20, UNCOLORED);
  epd.TransmitPartialRed(paint.GetImage(), 0, 50, paint.GetWidth(), paint.GetHeight());

Oraz ostatni tekst stały – „Indeks UV wynosi”. Będzie on czarny (paint.Clear(UNCOLORED)), napisany czcionką font16.

paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 0, "Indeks UV wynosi", &Font16, COLORED);
epd.TransmitPartialBlack(paint.GetImage(), 0, 90, paint.GetWidth(), paint.GetHeight());

Teraz można przejść do pomiaru promieniowania ultrafioletowego. Wyjściem czujnika jest sygnał analogowy. Aby więc otrzymać interesujący nas indeks UV, należy przeliczyć zmierzoną wartość analogową według tabeli prezentowanej poniżej:

Rys. 5. Tabela do przeliczania wartości analogowej z czujnika promieniowania na wartość indeksu UV

Najpierw deklarujemy zmienne: indeks_UV oraz wartosc_analogowa. Funkcję do wyświetlania tekstu na wyświetlaczu E-PAPER przyjmuje tylko łańcuchy znaków. Potrzebna jest więc zmienna typu char – tekst[10].

int indeks_UV = 0;
int wartosc_analogowa = 0;
  
char tekst[10];

Następnie do zmiennej wartosc_analogowa zapisywana jest wartość zmierzona na pinie A0, a na podstawie tej wartości określana jest wartość zmiennej indeks_UV (zgodnie z tabelą z rysunku 5).

 wartosc_analogowa = analogRead(A0);
  

  if (wartosc_analogowa <10)
  {
    indeks_UV  = 0;
  }
  else if (wartosc_analogowa >=10 && wartosc_analogowa <46 )
  {
    indeks_UV  = 1;
  }
  else if (wartosc_analogowa >=46 && wartosc_analogowa <65 )
  {
    indeks_UV  = 2;
  }
  else if (wartosc_analogowa >=65 && wartosc_analogowa <83 )
  {
    indeks_UV  = 3;
  }
  else if (wartosc_analogowa >=83 && wartosc_analogowa <103 )
  {
    indeks_UV  = 4;
  }
  else if (wartosc_analogowa >=103 && wartosc_analogowa <124 )
  {
    indeks_UV  = 5;
  }
  else if (wartosc_analogowa >=124 && wartosc_analogowa <142 )
  {
    indeks_UV  = 6;
  }
   else if (wartosc_analogowa >=142 && wartosc_analogowa <162 )
  {
    indeks_UV = 7;
  } 
   else if (wartosc_analogowa >=162 && wartosc_analogowa <180 )
  {
    indeks_UV = 8;
  } 
   else if (wartosc_analogowa >=180 && wartosc_analogowa <200 )
  {
    indeks_UV = 9;
  } 
  else if (wartosc_analogowa >=200 && wartosc_analogowa <221)
  {
    indeks_UV = 10;
  } 
  else if (wartosc_analogowa >=221)
  {
    indeks_UV = 11;
  }

Wartość z zmiennej indeks_UV jest zapisywana do tablicy tekst przy pomocy funkcji sprintf.

sprintf(tekst,"%d", indeks_UV);

Ostatnim krokiem jest wyświetlenie wartości zmiennej indeks_UV na ekranie E-PAPER. Aby to zrobić, używany jest kod analogiczny jak przy poprzednich napisach z tą różnicą, że zamiast tekstu stałego, argumentem jest zmienna – tekst. Następnie wszystkie dane są wysyłane do wyświetlacza (epd.DisplayFrame()), a ekran zostaje wprowadzony w stan niskiego poboru energii (epd.Sleep()).

paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 0, tekst, &Font24, COLORED);
epd.TransmitPartialBlack(paint.GetImage(), 80, 120, paint.GetWidth(), paint.GetHeight());

epd.DisplayFrame(); // Wyslanie informacji do wyświetlacza Epaper

epd.Sleep();

}

Działanie programu zostało pokazane na poniższych zdjęciach:

Rys. 6. Pomiar w słoneczny dzień wykonany o godzinie 12

Rys;. 7. Pomiar w tym samym dniu o godzinie 16

Autor: Patryk Mądry