[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.
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