樹莓派 之 使用Nokia5110顯示屏顯示系統(tǒng)信息


摘抄如下:

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地址等信息筛婉。如下圖所示减俏。

rutu.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巩检,一起剝皮案震驚了整個(gè)濱河市姓赤,隨后出現(xiàn)的幾起案子侄柔,更是在濱河造成了極大的恐慌,老刑警劉巖居扒,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挑秉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡苔货,警方通過查閱死者的電腦和手機(jī)犀概,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夜惭,“玉大人姻灶,你說我怎么就攤上這事≌┘耄” “怎么了产喉?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)敢会。 經(jīng)常有香客問我曾沈,道長(zhǎng),這世上最難降的妖魔是什么鸥昏? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任塞俱,我火速辦了婚禮,結(jié)果婚禮上吏垮,老公的妹妹穿的比我還像新娘障涯。我一直安慰自己,他們只是感情好膳汪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布唯蝶。 她就那樣靜靜地躺著,像睡著了一般遗嗽。 火紅的嫁衣襯著肌膚如雪粘我。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天痹换,我揣著相機(jī)與錄音征字,去河邊找鬼。 笑死晴音,一個(gè)胖子當(dāng)著我的面吹牛柔纵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锤躁,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼搁料,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了系羞?” 一聲冷哼從身側(cè)響起郭计,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椒振,沒想到半個(gè)月后昭伸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澎迎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年庐杨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了选调。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灵份,死狀恐怖仁堪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情填渠,我是刑警寧澤弦聂,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站氛什,受9級(jí)特大地震影響莺葫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枪眉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一捺檬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瑰谜,春花似錦欺冀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渤早,卻和暖如春职车,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹊杖。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工悴灵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骂蓖。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓积瞒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親登下。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茫孔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容