- 本文參考科技愛好者博客
摘抄如下:
Nokia5110顯示屏價(jià)格低廉,僅需要¥11就可以買到图筹,比LCD1602和LCD12864更加便宜帅刀,最重要的是Nokia5110可以顯示更多的字符。本文在樹莓派上使用Nokia5110顯示屏來顯示樹莓派的啟動(dòng)時(shí)間、CPU占用劝篷、已經(jīng)使用的內(nèi)存量哨鸭、內(nèi)存占用百分比、當(dāng)前的時(shí)間娇妓、IP地址等信息,包括樹莓派與Nokia5110顯示屏的硬件連接、顯示程序。
一、為什么要加顯示屏
樹莓派可以看作一臺(tái)計(jì)算機(jī),具有HDMI接口,可以連接到顯示器上凿蒜,但是如果我們不用樹莓派的圖形界面,經(jīng)常使用SSH遠(yuǎn)程登錄來管理樹莓派,那么就沒有必要來使用顯示器渴肉。在SSH遠(yuǎn)程登錄時(shí),如果樹莓派使用的動(dòng)態(tài)ip地址眯娱,那么每次登錄都需要去路由器上查看樹莓派的ip地址嘁信,非常的不方便,在前面的文章中,我們可以聽到樹莓派的ip地址贬芥,教程在這兒: 疲扎。如果我們希望通過更加直觀的方式來查看樹莓派的ip地址椒丧,那么我們可以為樹莓派添加一個(gè)顯示屏壹甥,來顯示當(dāng)前的ip地址,同時(shí)也可以顯示樹莓派的時(shí)間壶熏、內(nèi)存占用句柠、系統(tǒng)負(fù)載等信息。
關(guān)于樹莓派顯示屏的選用棒假,可以選擇的有LCD1602溯职、LCD12864、Nokia5110等帽哑,由于LCD1602谜酒、LCD12864占用的IO口較多,并且LCD1602顯示字符較少妻枕,而Nokia5110占用的IO口只有4個(gè)僻族,同時(shí)能夠顯示足夠多的字符粘驰,所以選擇Nokia5110作為樹莓派信息顯示的顯示屏。
二述么、Nokia5110顯示屏介紹
Nokia5110顯示屏有8個(gè)引腳蝌数,引腳介紹如下:
RST:外部復(fù)位引腳
CE:顯示屏使能引腳
DC:數(shù)據(jù)/命令引腳
Din:串行數(shù)據(jù)輸入端
CLK:串行時(shí)鐘輸入端
Vcc:電源引腳
BL: 亮度調(diào)節(jié)
Gnd:地
三、Nokia5110與樹莓派連接方式
Nokia5110顯示屏與樹莓派連接度秘,以下gpio編號(hào)使用wiringPi編號(hào)顶伞。
RST、——21
CE——22
DC——23
Din——24
CLK——25
Vcc——28
BL——29
Gnd——0V
四敷钾、Nokia顯示程序
登陸樹莓派枝哄,點(diǎn)此下載nokia5110顯示程序:nokia510,然后解壓文件,進(jìn)入cpu_show目錄阻荒。
tar -xvf cpu_show.tarcd cpu_show/
我們看到有三個(gè)文件:PCD8544.c PCD8544.h pcd8544_rpi.c
其中PCD8544.c為Nokia5110顯示屏的驅(qū)動(dòng)文件挠锥,PCD8544.h為驅(qū)動(dòng)文件的頭文件,我們主要看下顯示程序pcd8544_rpi.c侨赡,主要程序和注釋如下蓖租。
/*
=================================================================================
Name : pcd8544_rpi.c
Version : 0.1
Copyright (C) 2012 by Andre Wussow, 2012, desk@binerry.de
Description :
A simple PCD8544 LCD (Nokia3310/5110) for Raspberry Pi for displaying some system informations.
Makes use of WiringPI-library of Gordon Henderson (https://projects.drogon.net/raspberry-pi/wiringpi/)
*/
#include
#include
#include
#include
#include
#include
#include <sys/sysinfo.h>
#include "PCD8544.h"
//devin modify
#include <sys/types.h>
#include <sys/stat.h>
#include
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <net/if.h>
#define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp"
#define MAX_SIZE 32
#define NETWORK_FILE "/etc/network/interfaces"
// 引腳連接
int _din = 24;
int _sclk = 25;
int _dc = 23;
int _rst = 21;
int _cs = 22;
int _vcc = 28;
int _bl = 29;
// 對(duì)比度調(diào)節(jié),根據(jù)屏幕亮度選擇
//may be need modify to fit your screen! normal: 30- 90 ,default is:45 !!!maybe modify this value!
int contrast = 30;
time_t timep;
struct tm *p;
char *wday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
char get_temp(void);
char* getip(char* ip_buf);
char* get_temp2(void);
int min,hour,sec,mday;
char week;
struct tm *localtime(const time_t *timep);
int main(void)
{
// 打印程序運(yùn)行信息
printf("Raspberry Pi Nokia5110 sysinfo display\n");
printf("========================================\n");
// 檢查wiringPi是否啟動(dòng)
if (wiringPiSetup() == -1)
{
printf("wiringPi-Error\n");
exit(1);
}
// 初始化Nokia并且清楚顯示
LCDInit(_sclk, _din, _dc, _cs, _rst, _vcc, _bl, contrast);
LCDclear();
// 顯示樹莓派Logo
LCDshowLogo();
delay(2000);
for (;;)
{
// 清楚屏幕顯示
LCDclear();
//獲得當(dāng)前時(shí)間
char timeInfo[16];
time(&timep);
p=localtime(&timep);
mday=p->tm_mday;
min=p->tm_min;
week=p->tm_wday;
hour=p->tm_hour;
sec=p->tm_sec;
sprintf(timeInfo, "%d %d:%d:%d",mday,hour,min,sec);
// 獲得 system usage / info
struct sysinfo sys_info;
if(sysinfo(&sys_info) != 0)
{
printf("sysinfo-Error\n");
}
// 啟動(dòng)時(shí)間
char uptimeInfo[15];
unsigned long uptime = sys_info.uptime / 60;
sprintf(uptimeInfo, "Up %ld min", uptime);
// CPU占用
char cpuInfo[10];
unsigned long avgCpuLoad = sys_info.loads[0] / 1000;
sprintf(cpuInfo, "CPU %ld%%\r", avgCpuLoad);
// 內(nèi)存使用量及占用
char ramInfo[10];
unsigned long totalRam = sys_info.totalram / 1024 / 1024;
unsigned long freeRam = sys_info.freeram /1024 /1024;
unsigned long usedRam = totalRam - freeRam;
unsigned long ram_load = (usedRam * 100) / totalRam;
sprintf(ramInfo, "RAM %.3dM %.2d", usedRam,ram_load);
// 樹莓派溫度
char tempInfo[10];
sprintf(tempInfo, "TEM %.2dC %s", get_temp(),wday[week]);
//IP 信息
char ipInfo[16];
getip(ipInfo);
//開始顯示
LCDdrawstring(0, 0, uptimeInfo);
LCDdrawstring(0, 8, cpuInfo);
LCDdrawstring(0, 16, ramInfo);
LCDdrawstring(0, 24, tempInfo);
LCDdrawstring(0, 32, timeInfo);
LCDdrawstring(0, 40, ipInfo);
LCDdisplay();
delay(1000);
}
return 0;
}
//decin modify
char get_temp(void)
{
int fd;
double temp = 0;
char buf[MAX_SIZE];
// 打開/sys/class/thermal/thermal_zone0/temp
fd = open(TEMP_PATH, O_RDONLY);
if (fd < 0) {
fprintf(stderr, "failed to open thermal_zone0/temp\n");
// 關(guān)閉文件
close(fd);
return -1;
}
// 讀取內(nèi)容
if (read(fd, buf, MAX_SIZE) < 0) {
fprintf(stderr, "failed to read temp\n");
// 關(guān)閉文件
close(fd);
return -1;
}
// 轉(zhuǎn)換為浮點(diǎn)數(shù)打印
temp = atoi(buf) / 1000.0;
// 關(guān)閉文件
close(fd);
return temp;
}
// 獲取eth0端口的IP地址羊壹,可根據(jù)需要設(shè)置為WAN0
char* getip(char* ip_buf)
{
struct ifreq temp;
struct sockaddr_in *myaddr;
int fd = 0;
int ret = -1;
strcpy(temp.ifr_name, "eth0");
if((fd=socket(AF_INET, SOCK_STREAM, 0))<0)
{
return NULL;
}
ret = ioctl(fd, SIOCGIFADDR, &temp);
close(fd);
if(ret < 0) return NULL; myaddr = (struct sockaddr_in *)&(temp.ifr_addr); strcpy(ip_buf, inet_ntoa(myaddr->sin_addr));
//printf("IP: %s", ip_buf);
return ip_buf;
}
五蓖宦、編譯運(yùn)行
接下來需要編譯顯示程序,在cpu_show目錄下編譯生成cpushow。
- cc -o cpushow pcd8544_rpi.c PCD8544.c -L/usr/local/lib -lwiringPi
編譯完成后油猫,會(huì)在當(dāng)前目錄下生成可執(zhí)行文件 cpushow 稠茂,然后將nokia5110顯示屏按照第三部分的介紹連接,連接完成后執(zhí)行這個(gè)文件情妖。
- sudo ./cpushow
可以看到nokia5110顯示屏上首先顯示一個(gè)樹莓派的logo睬关,然后顯示樹莓派的啟動(dòng)時(shí)間、CPU占用毡证、已經(jīng)使用的內(nèi)存量畜侦、內(nèi)存占用百分比锚烦、當(dāng)前的時(shí)間、IP地址等信息筛婉。如下圖所示减俏。