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


摘抄如下:

Nokia5110顯示屏價(jià)格低廉,僅需要¥11就可以買到,比LCD1602和LCD12864更加便宜,最重要的是Nokia5110可以顯示更多的字符。本文在樹莓派上使用Nokia5110顯示屏來(lái)顯示樹莓派的啟動(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)程登錄來(lái)管理樹莓派,那么就沒有必要來(lái)使用顯示器。在SSH遠(yuǎn)程登錄時(shí),如果樹莓派使用的動(dòng)態(tài)ip地址,那么每次登錄都需要去路由器上查看樹莓派的ip地址,非常的不方便,在前面的文章中,我們可以聽到樹莓派的ip地址,教程在這兒: 。如果我們希望通過更加直觀的方式來(lái)查看樹莓派的ip地址,那么我們可以為樹莓派添加一個(gè)顯示屏,來(lái)顯示當(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)行

接下來(lái)需要編譯顯示程序,在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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容