|
在前篇文章中,我们介绍了一款如何使用DHT11、BMP180和Arduino开发板制作一个气象站。但是,该项目有一个缺点,那就是16X2 LCD的功耗。如果我们要搭建一个电池供电的项目,并且希望持续几个星期甚至几个月,例如一个气象站,那么我们就必须更换以前教程中的LCD键盘扩展模块,然后再尝试诺基亚5110 LCD显示屏。在本篇文章中,我们将向您展示如何使用Arduino驱动此显示屏,从而搭建一个具有更长电池寿命的项目。
所需的组件 由于我们只是要驱动显示屏,因此本篇文章将不需要传感器,但是,我们将需要下面列出的组件,其中包括诺基亚5110,并且将展示如何使用Arduino开发板驱动显示屏。 1. 诺基亚5110显示屏 2. Arduino Mega开发板 3. 跳线 4. 面包板 5. 移动电源诺
基亚5110显示屏基本上是用于许多应用程序的图形LCD显示屏。它最初旨在用作手机的屏幕,并在90年代用于许多手机。该显示屏使用低功耗CMOS LCD控制器/驱动器PCD8544,该驱动器驱动尺寸为84×48的图形显示器。它非常便宜,价格约为3美元。
诺基亚5110 LCD可以显示文本、图形以及位图。当该显示屏完全点亮时,它消耗约10mA电流,而在关闭背光的情况下,它消耗的电流低至0.4mA。与前一篇文章中使用的键盘LCD扩展模块相比,该显示屏消耗的功率非常低。
原理图 显示器有两个侧面,可以将插头引脚连接到该侧面。您可以选择一个侧面焊接插头,以便将显示屏牢固地安装在面包板上。显示屏在以3.3V电压供电时效果最佳。
灯引脚接地时,将背光灯设为“ ON”,而将灯引脚连接至VCC时,背光灯为“ OFF”。
诺基亚5110显示屏连接图 显示屏 | Arduino | 引脚1(RST) | D12 | 引脚2(CE) | D11 | 引脚3(DC) | D10 | 引脚4(DIN) | D9 | 引脚5(CLK) | D8 | 引脚6(VCC) | VCC | 引脚7(LIGHT) | GND | 引脚8(GND) | GND |
现在我们已经完成了原理图,现在转到该项目的代码。
代码 在开始为该项目编写代码之前,首先,我们需要下载由rink-dink电子产品制造的5110 LCD图形库。该库完成了大部分繁重的工作,使我们可以轻松使用LCD。单击此处访问下载页面,然后下载LCD5110_graph zip文件。完成后,将文件解压缩到您的首选位置,然后将解压缩的文件夹重命名为“ LCD5110”之类的简单名称。将此文件夹复制并粘贴到arduino库文件夹中,然后运行arduino IDE。 单击该文件,然后单击示例,然后单击LCD5110。由于我们使用的是Arduino Mega,因此在LCD5110下拉菜单中单击Arduino(AVR)并打开LCD图形演示文件,然后将代码分解为几部分并进行解释。 - // It is assumed that the LCD module is connected to
- // the following pins using a levelshifter to get the
- // correct voltage to the module.
- // SCK - Pin 8
- // MOSI - Pin 9
- // DC - Pin 10
- // RST - Pin 11
- // CS - Pin 12
- //
复制代码
在代码中,我们只需要更改一些内容。我们可以从上面的注释部分看到,显示器的RST引脚连接到引脚11,但在我们的示例中,我们将此引脚连接到Arduino Mega的引脚12。我们还必须将CS从引脚12更改为11。在注释部分之后的第一行,包括LCD5110库,然后创建了myGLCD对象,其数字为LCD连接到的引脚。 myGLCD对象中的最后两个值是RST和CS值,它们已按照最初的说明进行了更改。 - #include <LCD5110_Graph.h>
- LCD5110 myGLCD(8,9,10,12,11);
复制代码
完成此操作后,我们转到setup函数。在setup函数中,InitLCD方法用于初始化显示,该方法采用一个用于显示对比度的参数。对比度值介于0-127之间,并且由于我们未输入任何值,因此将使用默认值70。接下来,调用setFont方法,该方法将smallFont设置为显示字体样式,最后,使用randomSeed函数,该函数使用未连接引脚上的AnalogRead作为随机输入来初始化随机数生成器。 - void setup()
- {
- myGLCD.InitLCD();
- myGLCD.setFont(SmallFont);
- randomSeed(analogRead(7));
- }
复制代码
在loop函数中,第一行使用clrScr方法清除屏幕缓冲区。使用drawBitmap方法绘制arduino徽标,并在调用该徽标时将其放置在屏幕缓冲区中。使用update方法将屏幕缓冲区复制到屏幕上,然后我们给它2秒钟的延迟,然后再次清除屏幕缓冲区。 - myGLCD.clrScr();
- myGLCD.drawBitmap(0, 0, arduino_logo, 84, 48);
- myGLCD.update();
- delay(2000);
-
- myGLCD.clrScr();
- myGLCD.print("LCD5110_Graph", CENTER, 0);
- myGLCD.print("DEMO", CENTER, 20);
复制代码
接下来,使用drawRect方法绘制一个矩形。使用drawLine方法在for循环中绘制线,该方法采用四个参数(x1,y1,x2,y2)。字体更改为细字体,然后我们在屏幕上打印文本,并调用update方法将字符串缓冲区中的内容复制到屏幕上。插入清除屏幕的延迟时间为5秒钟。项目中使用的大多数功能的名称都是不言自明的,例如myGLCD.drawLine不需要解释,其功能是画一条线。 - myGLCD.drawRect(28, 18, 56, 28);
- for (int i=0; i<6; i++)
- {
- myGLCD.drawLine(57, 18+(i*2), 83-(i*3), 18+(i*2));
- myGLCD.drawLine((i*3), 28-(i*2), 28, 28-(i*2));
- }
- myGLCD.setFont(TinyFont);
- myGLCD.print("(C)2015 by", CENTER, 36);
- myGLCD.print("Henning Karlsen", CENTER, 42);
- myGLCD.update();
-
- delay(5000);
-
- myGLCD.clrScr();
复制代码
以下是此项目的完整代码。在本节的开始部分已经描述了一个来自名为LCD5110_Graph_Demo的库的示例,以及如何使用它。 - // LCD5110_Graph_Demo
- // Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
- // web: http://www.RinkyDinkElectronics.com/
- //
- // This program is a demo of most of the functions
- // in the library.
- //
- // This program requires a Nokia 5110 LCD module.
- //
- // It is assumed that the LCD module is connected to
- // the following pins using a levelshifter to get the
- // correct voltage to the module.
- // SCK - Pin 8
- // MOSI - Pin 9
- // DC - Pin 10
- // RST - Pin 11
- // CS - Pin 12
- //
- #include <LCD5110_Graph.h>
- LCD5110 myGLCD(8,9,10,12,11);
- extern uint8_t SmallFont[];
- extern uint8_t arduino_logo[];
- extern unsigned char TinyFont[];
- extern uint8_t The_End[];
- extern uint8_t pacman1[];
- extern uint8_t pacman2[];
- extern uint8_t pacman3[];
- extern uint8_t pill[];
- float y;
- uint8_t* bm;
- int pacy;
- void setup()
- {
- myGLCD.InitLCD();
- myGLCD.setFont(SmallFont);
- randomSeed(analogRead(7));
- }
- void loop()
- {
- myGLCD.clrScr();
- myGLCD.drawBitmap(0, 0, arduino_logo, 84, 48);
- myGLCD.update();
- delay(2000);
-
- myGLCD.clrScr();
- myGLCD.print("LCD5110_Graph", CENTER, 0);
- myGLCD.print("DEMO", CENTER, 20);
- myGLCD.drawRect(28, 18, 56, 28);
- for (int i=0; i<6; i++)
- {
- myGLCD.drawLine(57, 18+(i*2), 83-(i*3), 18+(i*2));
- myGLCD.drawLine((i*3), 28-(i*2), 28, 28-(i*2));
- }
- myGLCD.setFont(TinyFont);
- myGLCD.print("(C)2015 by", CENTER, 36);
- myGLCD.print("Henning Karlsen", CENTER, 42);
- myGLCD.update();
-
- delay(5000);
-
- myGLCD.clrScr();
- for (int i=0; i<48; i+=2)
- {
- myGLCD.drawLine(0, i, 83, 47-i);
- myGLCD.update();
- }
- for (int i=83; i>=0; i-=2)
- {
- myGLCD.drawLine(i, 0, 83-i, 47);
- myGLCD.update();
- }
- delay(2000);
-
- myGLCD.clrScr();
- myGLCD.drawRect(0, 0, 83, 47);
- for (int i=0; i<48; i+=4)
- {
- myGLCD.drawLine(0, i, i*1.75, 47);
- myGLCD.update();
- }
- for (int i=0; i<48; i+=4)
- {
- myGLCD.drawLine(83, 47-i, 83-(i*1.75), 0);
- myGLCD.update();
- }
- delay(2000);
-
- myGLCD.clrScr();
- for (int i=0; i<8; i++)
- {
- myGLCD.drawRoundRect(i*3, i*3, 83-(i*3), 47-(i*3));
- myGLCD.update();
- }
- delay(2000);
-
- myGLCD.clrScr();
- for (int i=0; i<17; i++)
- {
- myGLCD.drawCircle(41, 23, i*3);
- myGLCD.update();
- }
- delay(2000);
-
- myGLCD.clrScr();
- myGLCD.drawRect(0, 0, 83, 47);
- myGLCD.drawLine(0, 23, 84, 23);
- myGLCD.drawLine(41, 0, 41, 47);
- for (int c=0; c<4; c++)
- {
- for (int i=0; i<84; i++)
- {
- y=i*0.017453292519943295769236907684886;
- myGLCD.invPixel(i, (sin(y*6)*20)+23);
- myGLCD.update();
- delay(20);
- }
- }
- delay(2000);
- for (int pc=0; pc<3; pc++)
- {
- pacy=random(0, 28);
-
- for (int i=-20; i<84; i++)
- {
- myGLCD.clrScr();
- for (int p=4; p>((i+20)/20); p--)
- myGLCD.drawBitmap(p*20-8, pacy+7, pill, 5, 5);
- switch(((i+20)/3) % 4)
- {
- case 0: bm=pacman1;
- break;
- case 1: bm=pacman2;
- break;
- case 2: bm=pacman3;
- break;
- case 3: bm=pacman2;
- break;
- }
- myGLCD.drawBitmap(i, pacy, bm, 20, 20);
- myGLCD.update();
- delay(25);
- }
- }
- for (int i=0; i<25; i++)
- {
- myGLCD.clrScr();
- myGLCD.drawBitmap(0, i-24, The_End, 84, 24);
- myGLCD.update();
- delay(100);
- }
- myGLCD.setFont(SmallFont);
- myGLCD.print("Runtime (ms):", CENTER, 32);
- myGLCD.printNumI(millis(), CENTER, 40);
- myGLCD.update();
- for (int i=0; i<5; i++)
- {
- myGLCD.invert(true);
- delay(1000);
- myGLCD.invert(false);
- delay(1000);
- }
- }
复制代码
将开发板连接到PC,并确保选择了正确的开发板和COM端口。然后在工具菜单下,点击上传按钮。
演示效果 上载代码后,您应该看到如下图所示的输出。
|