MPL3115A2 - Opis
Parametry czujnika:
- Wartość napięcia zasilania od 1,95 do 3,6V;
- Wyprowadzenia pracują z napięciem od 1,6V do 3,6V;
- Komunikacja poprzez interfejs I2C;
- Barometr: zakres pracy od 50 do 110 kPa, dokładnosć +/- 0,05kPa, rozdzielczość 20 bitów;
- Termometr: zakres pomiarowy od -40 do 85 st. C, dokładność +/- 1 st. C dla 25 st. C, +/- 3 w pozostałym zakresie;
- Wysokość: dokładność do 30cm, rodzielczość 20 bitów;
- Wbudowana kolejka FIFO;
Rys. 1. Moduł Sparkfun z czujnkiem MPL3115A2
Płytka przedstawiona na rysunku zawiera czujnik MPL3115A2. Dodatkowo na płytce umieszczono dodatkowe kondensatory filtrujące oraz rezystory podciągające linie SDA oraz SCL do zasilania.
Rys. 2. Schemat płytki
Czujnik oraz wspomniana płytka prototypowa posiada następujące wyprowadzenia z układu:
- INT2 - wyzwalanie dla przerwań od układu;
- INT1 - wyzwalanie dla przerwań od układu;
- SDA - linia danych;
- SCL - linia zegarowa;
- VCC - zasilanie układu, akceptowane od 1,95 do 3,6V;
- GND - masa układu;
Podłączenie
Układ należy podłączyć do płytki Arduino w następujący sposób:
- INT2 - NC
- INT1 - NC
- SDA - SDA Arduino
- SCL - SCL Arduino
- VCC - 3.3V
- GND - GND
Jeśli wykorzystuje się Arduino Uno posiadające piny 5V wtedy należy zastosować konwerter poziomów logicznych. W przypadku montażu rezystorów, jak opisano na stronie producenta, nie udaje się skomunikować z czujnikiem. Konwerter można pominąć w przypadku obsługi układu na Arduino Pro mini.
Biblioteka
Poniżej przedstawię opis biblioteki układu wraz z opisem poszczególnych rejestrów oraz głównych funkcji.
Biblioteka dla obsługi interfejsu I2C wykorzystuje wire.h, Główna część biblioteki MPL3115A2 zawiera sposób rozpoczęcia transmisji oraz pobrania danych.
Podstawowym elementem jest opis poszczególnych adresów rejestrów czujnika:
- #define MPL3115A2_ADDRESS 0x60
- #define STATUS 0x00
- #define OUT_P_MSB 0x01
- #define OUT_P_CSB 0x02
- #define OUT_P_LSB 0x03
- #define OUT_T_MSB 0x04
- #define OUT_T_LSB 0x05
- #define DR_STATUS 0x06
- #define OUT_P_DELTA_MSB 0x07
- #define OUT_P_DELTA_CSB 0x08
- #define OUT_P_DELTA_LSB 0x09
- #define OUT_T_DELTA_MSB 0x0A
- #define OUT_T_DELTA_LSB 0x0B
- #define WHO_AM_I 0x0C
- #define F_STATUS 0x0D
- #define F_DATA 0x0E
- #define F_SETUP 0x0F
- #define TIME_DLY 0x10
- #define SYSMOD 0x11
- #define INT_SOURCE 0x12
- #define PT_DATA_CFG 0x13
- #define BAR_IN_MSB 0x14
- #define BAR_IN_LSB 0x15
- #define P_TGT_MSB 0x16
- #define P_TGT_LSB 0x17
- #define T_TGT 0x18
- #define P_WND_MSB 0x19
- #define P_WND_LSB 0x1A
- #define T_WND 0x1B
- #define P_MIN_MSB 0x1C
- #define P_MIN_CSB 0x1D
- #define P_MIN_LSB 0x1E
- #define T_MIN_MSB 0x1F
- #define T_MIN_LSB 0x20
- #define P_MAX_MSB 0x21
- #define P_MAX_CSB 0x22
- #define P_MAX_LSB 0x23
- #define T_MAX_MSB 0x24
- #define T_MAX_LSB 0x25
- #define CTRL_REG1 0x26
- #define CTRL_REG2 0x27
- #define CTRL_REG3 0x28
- #define CTRL_REG4 0x29
- #define CTRL_REG5 0x2A
- #define OFF_P 0x2B
- #define OFF_T 0x2C
- #define OFF_H 0x2D
Procedura rozpoczęcia transmisji jest inicjowana poprzez wywołanie funkcji z biblioteki Wire.h
- bool MPL3115A2::begin(void)
- {
- Wire.begin();
- }
Następnie pojawiają się funkcje obsługujące odczytywanie wartości. W pierwszej kolejneści pojawia się opcja odczytania wysokości nad poziomem morza. Zdefiniowane są jej dwa warianty, zwracające wartość w metrach oraz stopach. Gdy wystąpi błąd odczytu to zwrócona zostanie wartość -1.
- float MPL3115A2::readAltitude()
- {
- //Ustawienie i wyzerowanie bitu OST, pozwalającemu na ponowny odczyt danych
- toggleOneShot();
- //Czekanie na bit PDR, informujący o pobraniu nowych danych
- int counter = 0;
- while( (IIC_Read(STATUS) & (1<<1)) == 0)
- {
- //Wywołanie errora po max 512ms
- if(++counter > 600) return(-999);
- delay(1);
- }
- //Odczytanie danych z rejestru
- Wire.beginTransmission(MPL3115A2_ADDRESS);
- //Adres danych do pobrania
- Wire.write(OUT_P_MSB);
- //Zakonczenie transmisji, przesłanie danych przez I2C z opcją ponownego startu
- Wire.endTransmission(false);
- //Ządanie 3 bitów
- Wire.requestFrom(MPL3115A2_ADDRESS, 3); // Request three bytes
- //Odczekanie na dostępność danych
- counter = 0;
- while(Wire.available() < 3)
- {
- if(counter++ > 100) return(-999); ==
- delay(1);
- }
- //Odczytanie danych
- byte msb, csb, lsb;
- msb = Wire.read();
- csb = Wire.read();
- lsb = Wire.read();
- //Dane sa 4 bitowe, nalezy przesunąc je o 4 bity i podzielic przez 16
- //poniewaz na 4 bitach mozna zapisac 16 wartosci
- float tempcsb = (lsb>>4)/16.0;
- //Obliczenie wysokosci
- float altitude = (float)( (msb << 8) | csb) + tempcsb;
- return(altitude);
- }
Następna funkcja odczytuje wartość ciśnienia:
- float MPL3115A2::readPressure()
- {
- //Sprawdzenie czy bit PDR jest ustawiony, jak nie to wlaczenie
- //i wylaczenie bitu OST
- if(IIC_Read(STATUS) & (1<<2) == 0) toggleOneShot();
- //Odczekanie na bit PDR
- int counter = 0;
- while(IIC_Read(STATUS) & (1<<2) == 0)
- {
- if(++counter > 600) return(-999);
- delay(1);
- }
- // Odczytanie danych z rejestru
- Wire.beginTransmission(MPL3115A2_ADDRESS);
- Wire.write(OUT_P_MSB); // Address of data to get
- Wire.endTransmission(false);
- Wire.requestFrom(MPL3115A2_ADDRESS, 3); // Request three bytes
- //Odczekanie na dane
- counter = 0;
- while(Wire.available() < 3)
- {
- if(counter++ > 100) return(-999);
- delay(1);
- }
- //Odczytanie danych
- byte msb, csb, lsb;
- msb = Wire.read();
- csb = Wire.read();
- lsb = Wire.read();
- //Wlaczenie i wylaczenie OST
- toggleOneShot();
- //Wartość cisnienia jako przesunięty w lewo 20 bitowy
- long pressure_whole = (long)msb<<16 | (long)csb<<8 | (long)lsb;
- pressure_whole >>= 6;
- //Bity 5/4 reprezentują część ulamkowa
- lsb &= 0b00110000;
- lsb >>= 4;
- float pressure_decimal = (float)lsb/4.0;
- float pressure = (float)pressure_whole + pressure_decimal;
- return(pressure);
- }
Dalej funkja odczytująca temperaturę:
- float MPL3115A2::readTemp()
- {
- if(IIC_Read(STATUS) & (1<<1) == 0) toggleOneShot();
- int counter = 0;
- while( (IIC_Read(STATUS) & (1<<1)) == 0)
- {
- if(++counter > 600) return(-999);
- delay(1);
- }
- //Odczytanie danych dotyczacych temperatury
- Wire.beginTransmission(MPL3115A2_ADDRESS);
- Wire.write(OUT_T_MSB); // Address of data to get
- Wire.endTransmission(false);
- //Rządanie dwóch bytow
- Wire.requestFrom(MPL3115A2_ADDRESS, 2);
- //Czekanie na dane
- counter = 0;
- while(Wire.available() < 2)
- {
- if(counter++ > 100) return(-999);
- delay(1);
- }
- byte msb, lsb;
- msb = Wire.read();
- lsb = Wire.read();
- toggleOneShot();
- word foo = 0;
- bool negSign = false;
- //Czekanie na przeslanie wszystkich danych
- if(msb > 0x7F)
- {
- foo = ~((msb << 8) + lsb) + 1;
- msb = foo >> 8;
- lsb = foo & 0x00F0;
- negSign = true;
- }
- float templsb = (lsb>>4)/16.0;
- float temperature = (float)(msb + templsb);
- if (negSign) temperature = 0 - temperature;
- return(temperature);
- }
Pozostałe funkcje służą do ustawienia odpowiednich parametrów transmisji i do odpowiedniego zainicjowania transmisji.
- //Ustawienie pomiaru ciśnienia
- void MPL3115A2::setModeBarometer()
- {
- //Odczytanie aktualnych ustawien z rejestru
- byte tempSetting = IIC_Read(CTRL_REG1);
- //Wyczyszczenie bitu ALT
- tempSetting &= ~(1<<7);
- //Wprowadzenie ustawien
- IIC_Write(CTRL_REG1, tempSetting);
- }
- //Ustawienie pomiaru wysokości
- void MPL3115A2::setModeAltimeter()
- {
- byte tempSetting = IIC_Read(CTRL_REG1);
- tempSetting |= (1<<7);
- IIC_Write(CTRL_REG1, tempSetting);
- }
- //Wprowadzenie czujnika w tryb StandBy
- void MPL3115A2::setModeStandby()
- {
- byte tempSetting = IIC_Read(CTRL_REG1);
- //Czyszczenie bitu SBYB
- tempSetting &= ~(1<<0);
- IIC_Write(CTRL_REG1, tempSetting);
- }
- //Wprowadzenie ukladu w tryb aktywny
- void MPL3115A2::setModeActive()
- {
- byte tempSetting = IIC_Read(CTRL_REG1);
- //Bit SBYB ustawiony na 1
- tempSetting |= (1<<0);
- IIC_Write(CTRL_REG1, tempSetting);
- }
- //Wywowywane z parametrem od 0 do 7. Ustawianie ilości probek od 1 do 128.
- //Im większa liczba próbek tym większa doklodnosc oraz wiekszy czas pomiedzy
- //kolejnymi próbkami danych
- void MPL3115A2::setOversampleRate(byte sampleRate)
- {
- if(sampleRate > 7) sampleRate = 7;
- //Ustawienie dla rejestry CTRL
- sampleRate <<= 3;
- //Odczytanie aktyalnych ustawien
- byte tempSetting = IIC_Read(CTRL_REG1);
- //Wyczyszczenie bitow OS
- tempSetting &= 0b11000111;
- //Zamaskowanie bitow
- tempSetting |= sampleRate;
- //Wprowadzenie danych
- IIC_Write(CTRL_REG1, tempSetting);
- }
- //Wlaczenie flag wystąpienia zdarzenia dla temperatur, i cisnienia
- void MPL3115A2::enableEventFlags()
- {
- IIC_Write(PT_DATA_CFG, 0x07);
- }
- //Czysci i ustawia bit OST, co powoduje ponowny odczyt danych,
- void MPL3115A2::toggleOneShot(void)
- {
- byte tempSetting = IIC_Read(CTRL_REG1);
- //Czyszczenie bitu OST
- tempSetting &= ~(1<<1);
- IIC_Write(CTRL_REG1, tempSetting);
- tempSetting = IIC_Read(CTRL_REG1);
- //ustawianie bitu OST
- tempSetting |= (1<<1);
- IIC_Write(CTRL_REG1, tempSetting);
- }
- // Odczytanie jednego byta danych
- byte MPL3115A2::IIC_Read(byte regAddr)
- {
- //Rozpoczęcie transmisji
- Wire.beginTransmission(MPL3115A2_ADDRESS);
- //Wprowadzenie adresu rejestru kontrolnego
- Wire.write(regAddr);
- Wire.endTransmission(false);
- //Zadanie danych
- Wire.requestFrom(MPL3115A2_ADDRESS, 1); // Request the data...
- return Wire.read();
- }
- //Wpisanie za pomocą interfejsu I2C
- void MPL3115A2::IIC_Write(byte regAddr, byte value)
- {
- Wire.beginTransmission(MPL3115A2_ADDRESS);
- Wire.write(regAddr);
- Wire.write(value);
- Wire.endTransmission(true);
- }
Programowanie
Programowanie najlepiej rozpocząć od wgrania biblioteki, która znacząco ułatwi wykonanie całego projektu.
Poniżej pierwszy z programów. Będzie on w pętli odczytywał i wyświetlał dane poprzez port szeregowy. Jest to mała przeróbka jednego z programów jakie można znaleźć w przykładach.
- #include <Wire.h>
- #include "SparkFunMPL3115A2.h"
- //Stworzenie obiektu funkcji
- MPL3115A2 MPL311;
- void setup()
- {
- //Wlaczenie transmisji po interfejsie I2C
- Wire.begin();
- //Opcje transmisji po porcie szeregowym
- Serial.begin(9600);
- //Rozpoczęcie pracy z czujnikiem
- MPL311.begin(); // Get sensor online
- //Konfiguracja czujnikow
- MPL311.setModeAltimeter();
- MPL311.setModeBarometer();
- MPL311.setOversampleRate(3);
- MPL311.enableEventFlags();
- }
- void loop()
- {
- float altitude = myPressure.readAltitude();
- Serial.print("Wysokosc npm(m):");
- Serial.print(altitude, 2);
- float pressure = myPressure.readPressure();
- Serial.print("Cisnienie(Pa):");
- Serial.print(pressure, 2);
- float temperature = myPressure.readTemp();
- Serial.print("Temperatura(c):");
- Serial.print(temperature, 2);
- delay(1000);
- Serial.println();
- }
Oprócz opisanej powyżej biblioteki można jeszcze wykorzystać bibliotekę udostępnioną przez Adafruit. Poniżej zmodyfikowany przykład do obsługi czujnika:
- #include <Wire.h>
- #include <Adafruit_MPL3115A2.h>
- Adafruit_MPL3115A2 MPL311 = Adafruit_MPL3115A2();
- void setup()
- {
- Serial.begin(9600);
- Serial.println("MPL3115A2!");
- }
- void loop()
- {
- float altm, pascals, tempC;
- //Wlaczenie czujnika, sprawdzenie odpowiedzi
- if (!MPL311.begin())
- {
- Serial.println("Couldnt find sensor");
- return;
- }
- //Odebranie cisnienia
- pascals = MPL311.getPressure();
- Serial.print(pascals/3377);
- Serial.println(" - Cisnienie");
- altm = MPL311.getAltitude();
- Serial.print(altm);
- Serial.println(" - Wysokosc");
- tempC = MPL311.getTemperature();
- Serial.print(tempC);
- Serial.println(" - Temperatura");
- delay(1000);
- }
- #include <Wire.h>
- #include <SparkFunMPL3115A2.h>
- #include <SD.h>
- #include <SPI.h>
- #define PIN_CE 7
- #define PIN_RESET 6
- #define PIN_DC 5
- #define PIN_DIN 4
- #define PIN_CLK 3
- #define LCD_C LOW
- #define LCD_D HIGH
- #define LCD_X 84
- #define LCD_Y 48
- char buff1[10];
- char buff2[10];
- char buff3[10];
- const int CSPin = 10;
- int czas=0;
- static const byte ASCII[][5] =
- {
- {0x00, 0x00, 0x00, 0x00, 0x00} // 20
- ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
- ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
- ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
- ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
- ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
- ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
- ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
- ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
- ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
- ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
- ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
- ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
- ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
- ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
- ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
- ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
- ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
- ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
- ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
- ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
- ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
- ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
- ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
- ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
- ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
- ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
- ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
- ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
- ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
- ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
- ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
- ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
- ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
- ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
- ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
- ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
- ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
- ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
- ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
- ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
- ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
- ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
- ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
- ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
- ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
- ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
- ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
- ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
- ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
- ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
- ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
- ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
- ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
- ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
- ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
- ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
- ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
- ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
- ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
- ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
- ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
- ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
- ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
- ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
- };
- MPL3115A2 MPL311;
- void LcdCharacter(char);
- void LcdClear(void);
- void LcdString(char *);
- void LcdWrite(byte, byte);
- void setup()
- {
- Serial.begin(9600);
- Serial.println("MPL3115A2!");
- LcdInitialise();
- LcdClear();
- //Rozpoczęcie pracy z czujnikiem
- MPL311.begin(); // Get sensor online
- //Konfiguracja czujnikow
- MPL311.setModeAltimeter();
- MPL311.setModeBarometer();
- MPL311.setOversampleRate(3);
- MPL311.enableEventFlags();
- pinMode(CSPin, OUTPUT);
- if (!SD.begin(CSPin))
- {
- Serial.println("Blad inicjalizacji karty");
- return;
- }
- Serial.println("Karta zostala poprawnie zainicjalizowana");
- }
- void loop()
- {
- float altitude = MPL311.readAltitude();
- Serial.print("Wysokosc: ");
- Serial.print(altitude, 2);
- dtostrf(altitude, 2, 2, buff1);
- LcdString(buff1);
- float pressure = MPL311.readPressure();
- Serial.print("Cisnienie: ");
- Serial.print(pressure, 2);
- dtostrf(pressure, 2, 2, buff1);
- LcdString(buff2);
- float temperature = MPL311.readTemp();
- Serial.print("Temperatura: ");
- Serial.print(temperature, 2);
- dtostrf(temperature, 2, 2, buff1);
- LcdString(buff3);
- delay(1000);
- Serial.println();
- File myFile = SD.open("test.txt", FILE_WRITE);
- if (myFile)
- {
- myFile.print("Wysokosc: ");
- myFile.print(buff1);
- myFile.print("Cisnienie: ");
- myFile.print(buff2);
- myFile.print("Temperatura: ");
- myFile.print(buff3);
- myFile.println();
- myFile.close();
- Serial.print("Dane zapisane");
- }
- else
- {
- Serial.println("Blad otwarcia pliku");
- }
- delay(2000);
- }
- void LcdWrite(byte dc, byte data)
- {
- //Wysłanie podanej wartości na wyświetlacz
- digitalWrite(PIN_DC, dc);
- //Podanie stanu niskiego na pin wybrania urządzenia
- digitalWrite(PIN_CE, LOW);
- //Funckja shiftOut przesyła jeden bit danych co sygnał zegara
- //Wysłanie danych na pin wejścia danych, oraz sygnału zegarowego na CLK
- //transmisja rozpoczęta od najbardziej znaczącego bitu
- shiftOut(PIN_DIN, PIN_CLK, MSBFIRST, data);
- //Podanie stanu wysokiego na pin wybrania urządzenia, zakońćzenie transmisji
- digitalWrite(PIN_CE, HIGH);
- }
- void LcdString(char *characters)
- {
- //Funckja działająca dopóki są znaki w odwołaniu do funkcji
- while (*characters)
- {
- //Wprowadzanie kolejnego znaku
- LcdCharacter(*characters++);
- }
- }
- void LcdInitialise(void)
- {
- //Inicjalizacja poszczególnych pinów
- pinMode(PIN_CE, OUTPUT);
- pinMode(PIN_RESET, OUTPUT);
- pinMode(PIN_DC, OUTPUT);
- pinMode(PIN_DIN, OUTPUT);
- pinMode(PIN_CLK, OUTPUT);
- digitalWrite(PIN_RESET, LOW);
- digitalWrite(PIN_RESET, HIGH);
- //Ustawienie odpowiednich komend na wyświetlacz
- //000100001 Wybranie zewnętrznych instrukcji
- LcdWrite(LCD_C, 0x21 );
- //010110001 Ustawienie kontrastu
- LcdWrite(LCD_C, 0xB1 );
- //000000100 Współczynnik temperaturowy na 0
- LcdWrite(LCD_C, 0x04 );
- //000010011 Ustawienie wartości Bias mode
- //na 4 dla MUX rate 1:48
- LcdWrite(LCD_C, 0x13 );
- //000100000 Właczenie podstawowych komend
- LcdWrite(LCD_C, 0x20 ); // LCD Basic Commands
- //000001100 Normalny tryb pracy
- LcdWrite(LCD_C, 0x0C );
- }
- void LcdClear(void)
- {
- //Funckja przechodzi pomiędzy wszystkimi pikselami na tablicy
- //i wprodzana do nich wartość 0, czyli czyści ekran z umieszczonych znaków.
- for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
- {
- LcdWrite(LCD_D, 0);
- }
- }
- void LcdCharacter(char character)
- {
- //Stan wysoki na wyświetlacz wpisanie 0
- LcdWrite(LCD_D, 0);
- //Pętla przechodząca pomiędzy wszystkimi elementami
- for (int index = 0; index < 5; index++)
- {
- /*
- * Wystawienie stanu wysokiego , znaku z kolejnego miejsca
- * W tablicy jest - 0x20 ponieważ przetwarza znak na kod ASCII,
- * który jest wpisany do tablicy, a numerowanie w tablicy od 0
- */
- LcdWrite(LCD_D, ASCII[character - 0x20][index]);
- }
- //Zakończenie wpisanie 0
- LcdWrite(LCD_D, 0);
- }