风筝
发表于: 2020-10-13 22:21:50 | 显示全部楼层

在前篇文章中,我们介绍了一款如何使用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美元。

nokia-5110-lcd.jpg


诺基亚5110 LCD可以显示文本、图形以及位图。当该显示屏完全点亮时,它消耗约10mA电流,而在关闭背光的情况下,它消耗的电流低至0.4mA。与前一篇文章中使用的键盘LCD扩展模块相比,该显示屏消耗的功率非常低。


原理图

显示器有两个侧面,可以将插头引脚连接到该侧面。您可以选择一个侧面焊接插头,以便将显示屏牢固地安装在面包板上。显示屏在以3.3V电压供电时效果最佳。

5110-back.jpg

灯引脚接地时,将背光灯设为“ ON”,而将灯引脚连接至VCC时,背光灯为“ OFF”。

nokia-and-arduino.png


诺基亚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图形演示文件,然后将代码分解为几部分并进行解释。

  1. // It is assumed that the LCD module is connected to
  2. // the following pins using a levelshifter to get the
  3. // correct voltage to the module.
  4. //      SCK  - Pin 8
  5. //      MOSI - Pin 9
  6. //      DC   - Pin 10
  7. //      RST  - Pin 11
  8. //      CS   - Pin 12
  9. //
复制代码

在代码中,我们只需要更改一些内容。我们可以从上面的注释部分看到,显示器的RST引脚连接到引脚11,但在我们的示例中,我们将此引脚连接到Arduino Mega的引脚12。我们还必须将CS从引脚12更改为11。在注释部分之后的第一行,包括LCD5110库,然后创建了myGLCD对象,其数字为LCD连接到的引脚。 myGLCD对象中的最后两个值是RST和CS值,它们已按照最初的说明进行了更改。

  1. #include <LCD5110_Graph.h>
  2. LCD5110 myGLCD(8,9,10,12,11);
复制代码

完成此操作后,我们转到setup函数。在setup函数中,InitLCD方法用于初始化显示,该方法采用一个用于显示对比度的参数。对比度值介于0-127之间,并且由于我们未输入任何值,因此将使用默认值70。接下来,调用setFont方法,该方法将smallFont设置为显示字体样式,最后,使用randomSeed函数,该函数使用未连接引脚上的AnalogRead作为随机输入来初始化随机数生成器。

  1. void setup()
  2. {
  3.   myGLCD.InitLCD();
  4.   myGLCD.setFont(SmallFont);
  5.   randomSeed(analogRead(7));
  6. }
复制代码

在loop函数中,第一行使用clrScr方法清除屏幕缓冲区。使用drawBitmap方法绘制arduino徽标,并在调用该徽标时将其放置在屏幕缓冲区中。使用update方法将屏幕缓冲区复制到屏幕上,然后我们给它2秒钟的延迟,然后再次清除屏幕缓冲区。

  1. myGLCD.clrScr();
  2.   myGLCD.drawBitmap(0, 0, arduino_logo, 84, 48);
  3.   myGLCD.update();
  4.   delay(2000);
  5.   
  6.   myGLCD.clrScr();
  7.   myGLCD.print("LCD5110_Graph", CENTER, 0);
  8.   myGLCD.print("DEMO", CENTER, 20);
复制代码

接下来,使用drawRect方法绘制一个矩形。使用drawLine方法在for循环中绘制线,该方法采用四个参数(x1,y1,x2,y2)。字体更改为细字体,然后我们在屏幕上打印文本,并调用update方法将字符串缓冲区中的内容复制到屏幕上。插入清除屏幕的延迟时间为5秒钟。项目中使用的大多数功能的名称都是不言自明的,例如myGLCD.drawLine不需要解释,其功能是画一条线。

  1. myGLCD.drawRect(28, 18, 56, 28);
  2.   for (int i=0; i<6; i++)
  3.   {
  4.     myGLCD.drawLine(57, 18+(i*2), 83-(i*3), 18+(i*2));
  5.     myGLCD.drawLine((i*3), 28-(i*2), 28, 28-(i*2));
  6.   }
  7.   myGLCD.setFont(TinyFont);
  8.   myGLCD.print("(C)2015 by", CENTER, 36);
  9.   myGLCD.print("Henning Karlsen", CENTER, 42);
  10.   myGLCD.update();
  11.   
  12.   delay(5000);
  13.   
  14.   myGLCD.clrScr();
复制代码

以下是此项目的完整代码。在本节的开始部分已经描述了一个来自名为LCD5110_Graph_Demo的库的示例,以及如何使用它。

  1. // LCD5110_Graph_Demo
  2. // Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
  3. // web: http://www.RinkyDinkElectronics.com/
  4. //
  5. // This program is a demo of most of the functions
  6. // in the library.
  7. //
  8. // This program requires a Nokia 5110 LCD module.
  9. //
  10. // It is assumed that the LCD module is connected to
  11. // the following pins using a levelshifter to get the
  12. // correct voltage to the module.
  13. //      SCK  - Pin 8
  14. //      MOSI - Pin 9
  15. //      DC   - Pin 10
  16. //      RST  - Pin 11
  17. //      CS   - Pin 12
  18. //
  19. #include <LCD5110_Graph.h>
  20. LCD5110 myGLCD(8,9,10,12,11);
  21. extern uint8_t SmallFont[];
  22. extern uint8_t arduino_logo[];
  23. extern unsigned char TinyFont[];
  24. extern uint8_t The_End[];
  25. extern uint8_t pacman1[];
  26. extern uint8_t pacman2[];
  27. extern uint8_t pacman3[];
  28. extern uint8_t pill[];
  29. float y;
  30. uint8_t* bm;
  31. int pacy;
  32. void setup()
  33. {
  34.   myGLCD.InitLCD();
  35.   myGLCD.setFont(SmallFont);
  36.   randomSeed(analogRead(7));
  37. }
  38. void loop()
  39. {
  40.   myGLCD.clrScr();
  41.   myGLCD.drawBitmap(0, 0, arduino_logo, 84, 48);
  42.   myGLCD.update();
  43.   delay(2000);
  44.   
  45.   myGLCD.clrScr();
  46.   myGLCD.print("LCD5110_Graph", CENTER, 0);
  47.   myGLCD.print("DEMO", CENTER, 20);
  48.   myGLCD.drawRect(28, 18, 56, 28);
  49.   for (int i=0; i<6; i++)
  50.   {
  51.     myGLCD.drawLine(57, 18+(i*2), 83-(i*3), 18+(i*2));
  52.     myGLCD.drawLine((i*3), 28-(i*2), 28, 28-(i*2));
  53.   }
  54.   myGLCD.setFont(TinyFont);
  55.   myGLCD.print("(C)2015 by", CENTER, 36);
  56.   myGLCD.print("Henning Karlsen", CENTER, 42);
  57.   myGLCD.update();
  58.   
  59.   delay(5000);
  60.   
  61.   myGLCD.clrScr();
  62.   for (int i=0; i<48; i+=2)
  63.   {
  64.     myGLCD.drawLine(0, i, 83, 47-i);
  65.     myGLCD.update();
  66.   }
  67.   for (int i=83; i>=0; i-=2)
  68.   {
  69.     myGLCD.drawLine(i, 0, 83-i, 47);
  70.     myGLCD.update();
  71.   }
  72.   delay(2000);
  73.   
  74.   myGLCD.clrScr();
  75.   myGLCD.drawRect(0, 0, 83, 47);
  76.   for (int i=0; i<48; i+=4)
  77.   {
  78.     myGLCD.drawLine(0, i, i*1.75, 47);
  79.     myGLCD.update();
  80.   }
  81.   for (int i=0; i<48; i+=4)
  82.   {
  83.     myGLCD.drawLine(83, 47-i, 83-(i*1.75), 0);
  84.     myGLCD.update();
  85.   }
  86.   delay(2000);
  87.   
  88.   myGLCD.clrScr();
  89.   for (int i=0; i<8; i++)
  90.   {
  91.     myGLCD.drawRoundRect(i*3, i*3, 83-(i*3), 47-(i*3));
  92.     myGLCD.update();
  93.   }
  94.   delay(2000);
  95.   
  96.   myGLCD.clrScr();
  97.   for (int i=0; i<17; i++)
  98.   {
  99.     myGLCD.drawCircle(41, 23, i*3);
  100.     myGLCD.update();
  101.   }
  102.   delay(2000);
  103.   
  104.   myGLCD.clrScr();
  105.   myGLCD.drawRect(0, 0, 83, 47);
  106.   myGLCD.drawLine(0, 23, 84, 23);
  107.   myGLCD.drawLine(41, 0, 41, 47);
  108.   for (int c=0; c<4; c++)
  109.   {
  110.     for (int i=0; i<84; i++)
  111.     {
  112.       y=i*0.017453292519943295769236907684886;
  113.       myGLCD.invPixel(i, (sin(y*6)*20)+23);
  114.       myGLCD.update();
  115.       delay(20);
  116.     }
  117.   }
  118.   delay(2000);
  119.   for (int pc=0; pc<3; pc++)
  120.   {
  121.     pacy=random(0, 28);
  122.   
  123.     for (int i=-20; i<84; i++)
  124.     {
  125.       myGLCD.clrScr();
  126.       for (int p=4; p>((i+20)/20); p--)
  127.         myGLCD.drawBitmap(p*20-8, pacy+7, pill, 5, 5);
  128.       switch(((i+20)/3) % 4)
  129.       {
  130.         case 0: bm=pacman1;
  131.                 break;
  132.         case 1: bm=pacman2;
  133.                 break;
  134.         case 2: bm=pacman3;
  135.                 break;
  136.         case 3: bm=pacman2;
  137.                 break;
  138.       }
  139.       myGLCD.drawBitmap(i, pacy, bm, 20, 20);
  140.       myGLCD.update();
  141.       delay(25);
  142.     }
  143.   }
  144.   for (int i=0; i<25; i++)
  145.   {
  146.     myGLCD.clrScr();
  147.     myGLCD.drawBitmap(0, i-24, The_End, 84, 24);
  148.     myGLCD.update();
  149.     delay(100);
  150.   }
  151.   myGLCD.setFont(SmallFont);
  152.   myGLCD.print("Runtime (ms):", CENTER, 32);
  153.   myGLCD.printNumI(millis(), CENTER, 40);
  154.   myGLCD.update();
  155.   for (int i=0; i<5; i++)
  156.   {
  157.     myGLCD.invert(true);
  158.     delay(1000);
  159.     myGLCD.invert(false);
  160.     delay(1000);
  161.   }
  162. }
复制代码

将开发板连接到PC,并确保选择了正确的开发板和COM端口。然后在工具菜单下,点击上传按钮。


演示效果

上载代码后,您应该看到如下图所示的输出。

output-5110.png

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-27 00:03 , Processed in 0.047636 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表