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.
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
1 2 3 4 5 6 |
#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!„.
1 2 3 4 5 6 7 8 9 10 |
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.
1 2 3 4 |
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).
1 2 3 |
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.
1 2 3 |
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.
1 2 3 |
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].
1 2 3 4 |
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).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
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.
1 |
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()).
1 2 3 4 5 6 7 8 9 |
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