查看: 4366|回复: 1

[教程] 树莓派 之 使用Nokia5110显示屏显示系统信息

[复制链接]

该用户从未签到

发表于 2018-4-3 11:20:08 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 斗战神 于 2018-4-3 11:22 编辑

Nokia5110显示屏价格低廉,仅需要¥11就可以买到,比LCD1602和LCD12864更加便宜,最重要的是Nokia5110可以显示更多的字符。本文在树莓派上使用Nokia5110显示屏来显示树莓派的启动时间、CPU占用、已经使用的内存量、内存占用百分比、当前的时间、IP地址等信息,包括树莓派与Nokia5110显示屏的硬件连接、显示程序。

一、为什么要加显示屏

树莓派可以看作一台计算机,具有HDMI接口,可以连接到显示器上,但是如果我们不用树莓派的图形界面,经常使用SSH远程登录来管理树莓派,那么就没有必要来使用显示器。在SSH远程登录时,如果树莓派使用的动态ip地址,那么每次登录都需要去路由器上查看树莓派的ip地址,非常的不方便,在前面的文章中,我们可以听到树莓派的ip地址,教程在这儿: 。如果我们希望通过更加直观的方式来查看树莓派的ip地址,那么我们可以为树莓派添加一个显示屏,来显示当前的ip地址,同时也可以显示树莓派的时间、内存占用、系统负载等信息。

关于树莓派显示屏的选用,可以选择的有LCD1602、LCD12864、Nokia5110等,由于LCD1602、LCD12864占用的IO口较多,并且LCD1602显示字符较少,而Nokia5110占用的IO口只有4个,同时能够显示足够多的字符,所以选择Nokia5110作为树莓派信息显示的显示屏。

二、Nokia5110显示屏介绍

Nokia5110显示屏有8个引脚,引脚介绍如下:
RST:外部复位引脚
CE:显示屏使能引脚
DC:数据/命令引脚
Din:串行数据输入端
CLK:串行时钟输入端
Vcc:电源引脚
BL: 亮度调节
Gnd:地

三、Nokia5110与树莓派连接方式

Nokia5110显示屏与树莓派连接,以下gpio编号使用wiringPi编号。
RST、——21
CE——22
DC——23
Din——24
CLK——25
Vcc——28
BL——29
Gnd——0V

四、Nokia显示程序

登陆树莓派,点此下载nokia5110显示程序:nokia510,然后解压文件,进入cpu_show目录。
tar -xvf cpu_show.tarcd cpu_show/
我们看到有三个文件:PCD8544.c PCD8544.h pcd8544_rpi.c
其中PCD8544.c为Nokia5110显示屏的驱动文件,PCD8544.h为驱动文件的头文件,我们主要看下显示程序pcd8544_rpi.c,主要程序和注释如下。

  1. /*
  2. =================================================================================
  3. Name        : pcd8544_rpi.c
  4. Version     : 0.1

  5. Copyright (C) 2012 by Andre Wussow, 2012, desk@binerry.de

  6. Description :
  7.      A simple PCD8544 LCD (Nokia3310/5110) for Raspberry Pi for displaying some system informations.
  8.          Makes use of WiringPI-library of Gordon Henderson (https://projects.drogon.net/raspberry-pi/wiringpi/)
  9. */
  10. #include
  11. #include
  12. #include
  13. #include
  14. #include
  15. #include
  16. #include <sys/sysinfo.h>
  17. #include "PCD8544.h"

  18. //devin modify
  19. #include <sys/types.h>
  20. #include <sys/stat.h>
  21. #include
  22. #include <sys/ioctl.h>
  23. #include <sys/socket.h>
  24. #include <arpa/inet.h>
  25. #include <netinet/in.h>
  26. #include <net/if.h>

  27. #define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp"
  28. #define MAX_SIZE 32
  29. #define NETWORK_FILE "/etc/network/interfaces"

  30. // 引脚连接
  31. int _din = 24;
  32. int _sclk = 25;
  33. int _dc = 23;
  34. int _rst = 21;
  35. int _cs = 22;

  36. int _vcc = 28;
  37. int _bl = 29;

  38. // 对比度调节,根据屏幕亮度选择
  39. //may be need modify to fit your screen!  normal: 30- 90 ,default is:45 !!!maybe modify this value!
  40. int contrast = 30;

  41. time_t timep;
  42. struct tm *p;
  43. char *wday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};

  44. char get_temp(void);
  45. char* getip(char* ip_buf);
  46. char* get_temp2(void);
  47. int min,hour,sec,mday;
  48. char week;
  49. struct tm *localtime(const time_t *timep);
  50. int main(void)
  51. {

  52. // 打印程序运行信息
  53.   printf("Raspberry Pi Nokia5110 sysinfo display\n");
  54.   printf("========================================\n");

  55.   // 检查wiringPi是否启动
  56.   if (wiringPiSetup() == -1)
  57.   {
  58.         printf("wiringPi-Error\n");
  59.     exit(1);
  60.   }

  61.   // 初始化Nokia并且清楚显示
  62.   LCDInit(_sclk, _din, _dc, _cs, _rst, _vcc, _bl, contrast);
  63.   LCDclear();

  64.   // 显示树莓派Logo
  65.   LCDshowLogo();

  66.   delay(2000);

  67.   for (;;)
  68.   {
  69.           // 清楚屏幕显示
  70.           LCDclear();

  71.           //获得当前时间
  72.           char timeInfo[16];
  73.           time(&timep);
  74.           p=localtime(&timep);
  75.           mday=p->tm_mday;
  76.           min=p->tm_min;
  77.           week=p->tm_wday;
  78.           hour=p->tm_hour;
  79.           sec=p->tm_sec;
  80.           sprintf(timeInfo, "%d %d:%d:%d",mday,hour,min,sec);

  81.           // 获得 system usage / info
  82.           struct sysinfo sys_info;
  83.           if(sysinfo(&sys_info) != 0)
  84.           {
  85.                 printf("sysinfo-Error\n");
  86.           }

  87.           // 启动时间
  88.           char uptimeInfo[15];
  89.           unsigned long uptime = sys_info.uptime / 60;
  90.           sprintf(uptimeInfo, "Up %ld min", uptime);

  91.           // CPU占用
  92.           char cpuInfo[10];
  93.           unsigned long avgCpuLoad = sys_info.loads[0] / 1000;
  94.           sprintf(cpuInfo, "CPU %ld%%\r", avgCpuLoad);

  95.           // 内存使用量及占用
  96.           char ramInfo[10];
  97.           unsigned long totalRam = sys_info.totalram / 1024 / 1024;
  98.           unsigned long freeRam = sys_info.freeram /1024 /1024;
  99.           unsigned long usedRam = totalRam - freeRam;
  100.           unsigned long ram_load = (usedRam * 100) / totalRam;
  101.           sprintf(ramInfo, "RAM %.3dM %.2d", usedRam,ram_load);

  102.           // 树莓派温度
  103.           char tempInfo[10];
  104.           sprintf(tempInfo, "TEM %.2dC %s", get_temp(),wday[week]);

  105.           //IP 信息
  106.           char ipInfo[16];
  107.           getip(ipInfo);

  108.           //开始显示
  109.           LCDdrawstring(0, 0, uptimeInfo);
  110.           LCDdrawstring(0, 8, cpuInfo);
  111.           LCDdrawstring(0, 16, ramInfo);
  112.           LCDdrawstring(0, 24, tempInfo);
  113.           LCDdrawstring(0, 32, timeInfo);
  114.           LCDdrawstring(0, 40, ipInfo);
  115.           LCDdisplay();

  116.           delay(1000);
  117.   }
  118.   return 0;
  119. }

  120. //decin modify

  121. char get_temp(void)
  122. {
  123.     int fd;
  124.     double temp = 0;
  125.     char buf[MAX_SIZE];

  126.     // 打开/sys/class/thermal/thermal_zone0/temp
  127.     fd = open(TEMP_PATH, O_RDONLY);
  128.     if (fd < 0) {
  129.         fprintf(stderr, "failed to open thermal_zone0/temp\n");
  130.                 // 关闭文件
  131.                 close(fd);
  132.         return -1;
  133.     }

  134.     // 读取内容
  135.     if (read(fd, buf, MAX_SIZE) < 0) {
  136.         fprintf(stderr, "failed to read temp\n");
  137.                 // 关闭文件
  138.                 close(fd);
  139.         return -1;
  140.     }

  141.     // 转换为浮点数打印
  142.     temp = atoi(buf) / 1000.0;
  143.         // 关闭文件
  144.         close(fd);
  145.         return temp;
  146. }

  147. // 获取eth0端口的IP地址,可根据需要设置为WAN0
  148. char* getip(char* ip_buf)
  149. {
  150.     struct ifreq temp;
  151.     struct sockaddr_in *myaddr;
  152.     int fd = 0;
  153.     int ret = -1;
  154.     strcpy(temp.ifr_name, "eth0");
  155.     if((fd=socket(AF_INET, SOCK_STREAM, 0))<0)
  156.     {
  157.         return NULL;
  158.     }
  159.     ret = ioctl(fd, SIOCGIFADDR, &temp);
  160.     close(fd);
  161.     if(ret < 0) return NULL; myaddr = (struct sockaddr_in *)&(temp.ifr_addr); strcpy(ip_buf, inet_ntoa(myaddr->sin_addr));
  162.         //printf("IP: %s", ip_buf);
  163.     return ip_buf;
  164. }
复制代码

五、编译运行

接下来需要编译显示程序,在cpu_show目录下编译生成cpushow。

cc -o cpushow pcd8544_rpi.c PCD8544.c -L/usr/local/lib -lwiringPi
编译完成后,会在当前目录下生成可执行文件 cpushow ,然后将nokia5110显示屏按照第三部分的介绍连接,连接完成后执行这个文件。

sudo ./cpushow
可以看到nokia5110显示屏上首先显示一个树莓派的logo,然后显示树莓派的启动时间、CPU占用、已经使用的内存量、内存占用百分比、当前的时间、IP地址等信息。如下图所示。
1625225-c3967a5331ebe4f4.jpg
回复

使用道具 举报

该用户从未签到

发表于 2018-7-20 14:59:25 | 显示全部楼层
66666666666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条



手机版|小黑屋|与非网

GMT+8, 2024-4-26 02:49 , Processed in 0.128820 second(s), 18 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.