既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
查询接口
打开终端命令,输入gpio readall,回车,在返回的IO表中可以看见有SDA1、SCL1;SDA0,SCL0两组I2C接口,我们使用SCL1与SDA1这一组进行。
硬件连接
接线方式如下:
| 树莓派 | OLED |
|---|---|
| 5V | VCC |
| GND | GND |
| 3脚(SDA1) | SDA |
| 5脚(SCL1) | SCL |
配置树莓派I2C接口
有界面的或者不习惯命令行的建议直接跳过下面这节,参照有界面的进行。
无界面或者想用命令行的
使用putty或者Xshell登录树莓派,在终端命令输入sudo raspi-config,回车
进入如下界面。
用键盘上下选择3.Interface Option,回车,利用键盘上下选择I5 I2C 回车;
继续回车;
再继续回车;
利用鼠标右键选择finish,回车,返回命令窗口;
输入sudo reboot,重启树莓派。
有界面
打开Raspberry Pi Configuration
按下图打开I2C.
然后选择注销;Reboot等待重启。
wiringPiI2c库
库简介
跟之前使用IO的输入输出一样,也需要安装对应的库才能实现功能。有关wiringPiI2c库的函数与STM32 I2C的常用函数对比如下:
| wiringPiI2c | STM32 |
|---|---|
| wiringPiI2CSetup (const int devId) ; | 外设nit(void);初始化外设 |
| wiringPiI2CReadReg8 (int fd, int reg) | iic_read_byte(void);读取一个字节的数据 |
| wiringPiI2CWriteReg8 (int fd, int reg, int data) | iic_send_byte(u8 data)//放送一个字节的数据 |
有关此库的详细描述参考此链接。
可以发现wiringPiI2CSetup (const int devId)中有一个参数,结合上面的踢球类比和I2C的理论知识,我们知道这个参数就是从机的地址,在树莓派中可以通过i2detect命令查询到外设的地址,要使用该命令还需要先安装i2c-tool。
安装i2c-tool
打开终端命令输入:sudo apt-get install i2c-tools 回车,等待重新返回命令行即可。(需要保证自己的树莓派有网)
查询I2C外设的地址
在命令行输入: sudo i2cdetect -l 回车,出现如下显示,说明使用的是I2C1接口。
然后输入: sudo i2cdetect -y 1,回车,会出现下面的显示,这里的3C就是OLED的地址(此时树莓派I2C不挂接其他的器件),一般的0.96寸OLED屏幕的地址都是0x30。
编程实现效果
通过上面的对比,我们知道整个I2C的函数只是被替换成了树莓派的函数接口,我们将平时使用的I2C屏幕驱动程序中的对应函数替换即可实现效果了,具体的替换过程可以参考此文。
打开Geany,输入以下代码(取模部分代码太长了,需要的去笔者资源下载0积分或者点赞收藏私信博主获取。)
// An highlighted block
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<assert.h>
#include<termios.h>
#include<string.h>
#include<sys/time.h>
#include<time.h>
#include<sys/types.h>
#include<errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <wiringPiI2C.h>
#include <unistd.h>
typedef unsigned char uint8_t;
typedef uint8_t u8;
#define OLED\_CMD 0x00
#define OLED\_DAT 0x01
int fd;
unsigned char yi[16]={"Angle of beam:"};
unsigned char er[16]={"ming"};
unsigned char san[16]={"Distance:"};
unsigned char si[16]={"okok"};
const unsigned char zi[];
const unsigned char picture1[];
const unsigned char picture2[];
const unsigned char picture3[];
const unsigned char picture4[];
const unsigned char picture5[];
const unsigned char picture6[];
const unsigned char picture7[];
//画点函数
void OLED\_SetPos(unsigned char x, unsigned char y)
{
WriteCmd(0xb0+y);
WriteCmd(((x&0xf0)>>4)|0x10);
WriteCmd((x&0x0f)|0x01);
}
//BMP位图显示
void OLED\_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
{
unsigned int j=0;
unsigned char x,y;
if(y%8==0)
y = 0;
else
y += 1;
for(y=y0;y<y1;y++)
{
OLED\_SetPos(x0,y);
for(x=x0;x<x1;x++)
{
wiringPiI2CWriteReg8(fd,0x40,BMP[j++]);
}
}
}
void init(void)//OLED初始化
{
wiringPiSetup();
fd=wiringPiI2CSetup(0x3c);//i2c?
wiringPiI2CWriteReg8(fd,0x00,0xa1);//t?í??90xa0
wiringPiI2CWriteReg8(fd,0x00,0xc8);//L?úí??90xc0
wiringPiI2CWriteReg8(fd,0x00,0x8d);//A?5w?
wiringPiI2CWriteReg8(fd,0x00,0x14);
wiringPiI2CWriteReg8(fd,0x00,0xa6);//óí?>:90xa7
wiringPiI2CWriteReg8(fd,0x00,0xaf);// >:
}
void qingping(void)//清屏
{
char zt1,zt2;
for(zt1=0;zt1<8;zt1++)
{
wiringPiI2CWriteReg8(fd,0x00,0xb0+zt1);
for(zt2=0;zt2<128;zt2++) wiringPiI2CWriteReg8(fd,0x40,0x00);
}
}
void ascii(float Angle,float distance)//字符显示函数
{
sprintf(er,"%f",Angle); // float 0 char
sprintf(si,"%f",distance); // double 0 char
int zt;
char zt3,zt4;
for(zt3=0;zt3<4;zt3++)
{
wiringPiI2CWriteReg8(fd,0x00,0xb0+(zt3\*2));
for(zt4=0;zt4<16;zt4++)
{
for(zt=0;zt<8;zt++)
{
if(zt3==0) wiringPiI2CWriteReg8(fd,0x40,zi[yi[zt4]\*16+zt]);
else if(zt3==1) wiringPiI2CWriteReg8(fd,0x40,zi[er[zt4]\*16+zt]);
else if(zt3==2) wiringPiI2CWriteReg8(fd,0x40,zi[san[zt4]\*16+zt]);
else if(zt3==3) wiringPiI2CWriteReg8(fd,0x40,zi[si[zt4]\*16+zt]);
}
}
wiringPiI2CWriteReg8(fd,0x00,0xb0+(zt3\*2)+1);
for(zt4=0;zt4<16;zt4++)
{
for(zt=0;zt<8;zt++)
{
if(zt3==0) wiringPiI2CWriteReg8(fd,0x40,zi[yi[zt4]\*16+zt+8]);
else if(zt3==1) wiringPiI2CWriteReg8(fd,0x40,zi[er[zt4]\*16+zt+8]);
else if(zt3==2) wiringPiI2CWriteReg8(fd,0x40,zi[san[zt4]\*16+zt+8]);
else if(zt3==3) wiringPiI2CWriteReg8(fd,0x40,zi[si[zt4]\*16+zt+8]);
}
}
}
}
int main()
{
float Angle = 2.98754546;
float distance = 5.754644545;
init();
delay(10);
qingping();//清屏
delay(10);
ascii(Angle,distance);//字符显示
delay(10);
while(1)
{
//qingping();
OLED\_DrawBMP(0,0,128,8,(unsigned char \*)picture1);
delay(1);
OLED\_DrawBMP(0,0,128,8,(unsigned char \*)picture2);
delay(1);
OLED\_DrawBMP(0,0,128,8,(unsigned char \*)picture3);
delay(1);
OLED\_DrawBMP(0,0,128,8,(unsigned char \*)picture4);
delay(1);
OLED\_DrawBMP(0,0,128,8,(unsigned char \*)picture5);
delay(1);
OLED\_DrawBMP(0,0,128,8,(unsigned char \*)picture6);
delay(1);
OLED\_DrawBMP(0,0,128,8,(unsigned char \*)picture7);
delay(1);
}
}


**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**