树莓派oled IP显示

科技 科技 1438 人阅读 | 0 人回复

<
1 完成结果

145058wsil5eer5jerollx.jpg

2 阐明

成绩: 正在嵌进式开拓中,常常碰到一些成绩,好比支到一块开拓板,出有屏幕,出有串心,需求调试,只能利用网心毗连。
但是假设公式内乱网没有是您办理,没法设置牢固IP,那末怎样弄?我开拓板IP皆没有明白怎样毗连调试大要写代码?
为了解决那个成绩,那即是我此次创做的目的!
看了网上许多办法,此中有的利用扬声器开机播报IP,的确也是能够,不外我终极挑选的仍是利用OLED屏幕表示IP,此中借能够表示cpu温度、MAC地点、工夫等其他疑息。
那里我是用的开拓情况是用qt开拓(固然那个项目出有ui界里),iic驱动利用树莓派的wiringpi IO驱动库。
oled屏幕淘宝购的,8元包邮!!!(图片无卖家书息)
145059g7n114wz6eook7do.jpg

3 设想思绪

硬件团体包含三个部门,一个是oled的表示驱动,一个是树莓派需求表示的疑息获得,最初便是硬件开机运转的设置。
团体思绪便是,利用一个按时器,1s 驱动一次,每次表示皆需求改革工夫,每30s改革一次cpu温度、IP地点、MAC地点疑息。
我是用的oled表示屏是12832,即128 * 32个像素面,表示字符用的8*8巨细的,以是能表示4止疑息,最少表示16个字符,以是mac地点会将中心的“:”标记来失落表示。
表示的疑息排布:
止号表示内乱容改革隔绝距离第一止体系工夫1s第两止cpu温度30s第三止IP地点30s第四止MAC地点(eth0)30s4 硬件毗连

尽情绘的,画造比较简朴,树莓派的3、5引足为IIC_1的SDA(数据)战SCL(时钟)足,我们利用的wiringpi库也是利用的那个IIC中设,以是我们的iic屏幕也是挂正在那上里。
145059ibrdyidxnqu3d5yl.jpg

5 代码设想

5.1 疑息获得

(1)工夫获得
获得工夫是最简朴的,利用QTime大要QDateTime类便可获得,代码以下:
  1. #include <QTime>
  2. QString timeStr = QTime::currentTime().toString("    hh:mm:ss    ");
复造代码
上里代码为何只利用QTime获得工夫,由于屏幕宽度有线,没法表示日期+工夫,以是把日期来失落了。
“hh:mm:ss” 为表示 “ 时:分:秒 ”
假设需求表示日期,则利用QDateTime类,代码以下:
  1. #include <QDateTime>
  2.      QString timeStr = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
复造代码
(2)cpu温度获得
  1. #include <QFile>
  2. #define TEMP_PATH "/sys/class/thermal/thermal_zone0/temp"
  3. QString OledIP::getCpuTemp()
  4. {
  5.     char buf[20];
  6.     QFile tempFile(TEMP_PATH);
  7.     if(tempFile.open(QFile::ReadOnly))
  8.     {
  9.         tempFile.read(buf,20);
  10.         float temp = atoi(buf) / 1000.0;
  11.         return QString::number(temp);
  12.     }
  13.     return "";
  14. }
复造代码
(3)IP地点获得
  1. QString OledIP::getLocalIp()
  2. {
  3.     QString myIp;
  4.     QList<QHostAddress> ipList = QNetworkInterface::allAddresses();
  5.     for (int i = 0; i < ipList.size(); ++i)         // 获得第一个本主机的IPv4地点
  6.     {
  7.            if (ipList.at(i) != QHostAddress::LocalHost && ipList.at(i).toIPv4Address())
  8.            {
  9.                myIp= ipList.at(i).toString();
  10.                break;
  11.            }
  12.      }
  13.      if (myIp.isEmpty())         // 假如出有找到,则利用当地IP
  14.         myIp= QHostAddress(QHostAddress::LocalHost).toString();
  15.      return myIp;
  16. }
复造代码
pstrong(4)MAC地点获得/strong/p
  1. QString OledIP::getMAC(Qstring card = "eth0")
  2. {
  3.     QString myMAC;
  4.     auto interfaces = QNetworkInterface::allInterfaces();
  5.     for (int i = 0; i < interfaces.size(); i++)
  6.     {
  7.         if(interfaces.at(i).name().contains(card))
  8.             if (interfaces.at(i).isValid())
  9.             {
  10.                 myMAC= interfaces.at(i).hardwareAddress().replace(":","");
  11.                 break;
  12.             }
  13.     }
  14.     return myMAC;
  15. }
复造代码
p输进参数为网卡名字,不同的网卡存正在不同的MAC地点,该参数普通传进 “eth0”。/p h3a id="52_12832_107"/a5.2 驱动12832屏幕/h3 pstrong(1)写进命令战数据/strong/p
  1. void oled12832::writeCmd(int fd,unsigned char I2C_Command)//写号令
  2. {
  3.     wiringPiI2CWriteReg8(fd,0x00, I2C_Command);
  4. }
  5. void oled12832::writeData(int fd,unsigned char I2C_Data)//写数据
  6. {
  7.     wiringPiI2CWriteReg8(fd,0x40, I2C_Data);
  8. }
复造代码
pstrong(2)初初化存放器/strong/p
  1. void oled12832::regInit(int fd)
  2. {
  3.     writeCmd(fd,0xAE); //display off
  4.     writeCmd(fd, 0x20);        //Set Memory Addressing Mode
  5.     writeCmd(fd, 0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
  6.     writeCmd(fd, 0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
  7.     writeCmd(fd, 0xc8);        //Set COM Output Scan Direction
  8.     writeCmd(fd, 0x00); //---set low column address
  9.     writeCmd(fd, 0x10); //---set high column address
  10.     writeCmd(fd, 0x40); //--set start line address
  11.     writeCmd(fd, 0x81); //--set contrast control register
  12.     writeCmd(fd, 0xff); //明度调理 0x00~0xff
  13.     writeCmd(fd, 0xa1); //--set segment re-map 0 to 127
  14.     writeCmd(fd, 0xa6); //--set normal display
  15.     writeCmd(fd, 0xa8); //--set multiplex ratio(1 to 64)
  16.     writeCmd(fd, 0x3F); //
  17.     writeCmd(fd, 0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
  18.     writeCmd(fd, 0xd3); //-set display offset
  19.     writeCmd(fd, 0x00); //-not offset
  20.     writeCmd(fd, 0xd5); //--set display clock divide ratio/oscillator frequency
  21.     writeCmd(fd, 0xf0); //--set divide ratio
  22.     writeCmd(fd, 0xd9); //--set pre-charge period
  23.     writeCmd(fd, 0x22); //
  24.     writeCmd(fd, 0xda); //--set com pins hardware configuration
  25.     writeCmd(fd, 0x12);
  26.     writeCmd(fd, 0xdb); //--set vcomh
  27.     writeCmd(fd, 0x20); //0x20,0.77xVcc
  28.     writeCmd(fd, 0x8d); //--set DC-DC enable
  29.     writeCmd(fd, 0x14); //
  30.     writeCmd(fd, 0xaf); //--turn on oled panel
  31. }
复造代码
pstrong(3)设置写进地位/strong/p
  1. void oled12832::oledSetPos(int fd,unsigned char x, unsigned char y) //设置肇端面坐标
  2. {
  3.     writeCmd(fd, 0xb0 + x);
  4.     writeCmd(fd,((y & 0x0f) | 0x00));//LOW
  5.     writeCmd(fd,(((y & 0xf0) >> 4) | 0x10));//HIGHT
  6. }
复造代码
(4) 屏幕加添战浑空
[code]void oled12832::oledFill(unsigned char data)//齐屏加添{    for (unsigned char i = 0; i <span class="token operator">
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则