phpBB [media]
Сегодня мы узнаем, как создать собственное меню для популярного ЖК-дисплея Nokia 5110, которое позволит сделать наши проекты более удобными для пользователя и более функциональными. Сегодня мы будем использовать Arduino Uno, но вы, очевидно, можете использовать любую другую плату Arduino.
Цель работы над проектом проста. Когда устройство включено, появляется простое меню, и с помощью трех кнопок мы сможем перемещаться по меню с помощью кнопок «вверх», «вниз» и выбора пункт меню.
Первая опция в меню - установить контрастность дисплея. При выборе первой опции будет отображаться новый экран пользовательского интерфейса, а с помощью кнопок вверх и вниз мы можем изменить контрастность дисплея. Если мы снова нажмем среднюю кнопку, мы вернемся к основному экрану пользовательского интерфейса.
Второй пункт меню на главном экране пользовательского интерфейса помогает включить или выключить подсветку дисплея. Выбор его нажатием средней кнопки включает или выключает подсветку дисплея.
Наконец, если мы перейдем к последнему пункту меню, мы можем сбросить настройки дисплея до значений по умолчанию.
Этот проект является просто демонстрацией, демонстрирующей, что возможно в отношении размещения меню на ЖК-дисплее Nokia 5110, вы можете изменить проект, чтобы он соответствовал требованиям вашего собственного более сложного проекта.
Вот и все для ознакомления. Давайте теперь посмотрим, как построить этот проект.
Код: Выделить всё
RS
CE
DC
DIN(MOSI)
CLK (SCK)
Схема подключения:
- Спойлер
Как видно из схемы, кнопки подключены без резистора
Для этого проекта мы будем использовать две библиотеки от Adafruit, чтобы мы могли легко общаться с LCD во время написания кода.
Adafruit GFX
Nokia 5110
Код: Выделить всё
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
boolean backlight = true;
int contrast=50;
int menuitem = 1;
int page = 1;
volatile boolean up = false;
volatile boolean down = false;
volatile boolean middle = false;
int downButtonState = 0;
int upButtonState = 0;
int selectButtonState = 0;
int lastDownButtonState = 0;
int lastSelectButtonState = 0;
int lastUpButtonState = 0;
Adafruit_PCD8544 display = Adafruit_PCD8544( 5, 4, 3);
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(1, INPUT_PULLUP);
pinMode(0, INPUT_PULLUP);
pinMode(7,OUTPUT);
digitalWrite(7,LOW); //Включить подсветку
Serial.begin(9600);
display.begin();
display.setContrast(contrast); //Установите контраст до 50
display.clearDisplay();
display.display();
}
void loop() {
drawMenu();
downButtonState = digitalRead(2);
selectButtonState = digitalRead(1);
upButtonState = digitalRead(0);
checkIfDownButtonIsPressed();
checkIfUpButtonIsPressed();
checkIfSelectButtonIsPressed();
if (up && page == 1 ) {
up = false;
menuitem--;
if (menuitem==0)
{
menuitem=3;
}
}else if (up && page == 2 ) {
up = false;
contrast--;
setContrast();
}
if (down && page == 1) {
down = false;
menuitem++;
if (menuitem==4)
{
menuitem=1;
}
}else if (down && page == 2 ) {
down = false;
contrast++;
setContrast();
}
if (middle) {
middle = false;
if (page == 1 && menuitem==2)
{
if (backlight)
{
backlight = false;
turnBacklightOff();
}
else
{
backlight = true;
turnBacklightOn();
}
}
if(page == 1 && menuitem ==3)
{
resetDefaults();
}
else if (page == 1 && menuitem==1) {
page=2;
}
else if (page == 2) {
page=1;
}
}
}
void checkIfDownButtonIsPressed()
{
if (downButtonState != lastDownButtonState)
{
if (downButtonState == 0)
{
down=true;
}
delay(50);
}
lastDownButtonState = downButtonState;
}
void checkIfUpButtonIsPressed()
{
if (upButtonState != lastUpButtonState)
{
if (upButtonState == 0) {
up=true;
}
delay(50);
}
lastUpButtonState = upButtonState;
}
void checkIfSelectButtonIsPressed()
{
if (selectButtonState != lastSelectButtonState)
{
if (selectButtonState == 0) {
middle=true;
}
delay(50);
}
lastSelectButtonState = selectButtonState;
}
void drawMenu()
{
if (page==1)
{
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(15, 0);
display.print("MAIN MENU");
display.drawFastHLine(0,10,83,BLACK);
display.setCursor(0, 15);
if (menuitem==1)
{
display.setTextColor(WHITE, BLACK);
}
else
{
display.setTextColor(BLACK, WHITE);
}
display.print(">Contrast");
display.setCursor(0, 25);
if (menuitem==2)
{
display.setTextColor(WHITE, BLACK);
}
else
{
display.setTextColor(BLACK, WHITE);
}
display.print(">Light: ");
if (backlight)
{
display.print("ON");
}
else
{
display.print("OFF");
}
display.display();
if (menuitem==3)
{
display.setTextColor(WHITE, BLACK);
}
else
{
display.setTextColor(BLACK, WHITE);
}
display.setCursor(0, 35);
display.print(">Reset");
display.display();
}
else if (page==2)
{
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(15, 0);
display.print("CONTRAST");
display.drawFastHLine(0,10,83,BLACK);
display.setCursor(5, 15);
display.print("Value");
display.setTextSize(2);
display.setCursor(5, 25);
display.print(contrast);
display.setTextSize(2);
display.display();
}
}
void resetDefaults()
{
contrast = 50;
setContrast();
backlight = true;
turnBacklightOn();
}
void setContrast()
{
display.setContrast(contrast);
display.display();
}
void turnBacklightOn()
{
digitalWrite(7,LOW);
}
void turnBacklightOff()
{
digitalWrite(7,HIGH);
}
Есть также две очень важные глобальные переменные: страница переменной и пункт меню переменной. Страница переменной запоминает, какой экран пользовательского интерфейса в данный момент отображается на экране. Таким образом, если переменная страницы равна 1, мы находимся на главном экране пользовательского интерфейса, а если переменная равна 2, мы находимся на экране контрастного пользовательского интерфейса. Пункт меню запоминает выбранный пункт меню. Таким образом, если его значение равно 1, выбирается первый элемент меню, поэтому функция drawMenu должна нарисовать этот пункт меню как черный с белыми буквами. Если пункт меню равен 2, то выбирается второй пункт меню и так далее.