树莓派开发笔记05-树莓派的IIC控制(点亮0.96OLED)

github主页:https://github.com/snqx-lqh
gitee主页:https://gitee.com/snqx-lqh
本项目github地址:https://github.com/snqx-lqh/RaspberryPiLearningNotes
本项目gitee地址:https://gitee.com/snqx-lqh/RaspberryPiLearningNotes
欢迎交流

实验说明

我们这里会使用IIC去驱动一个0.96的OLED,首先需要打开IIC

sudo raspi-config
Interfacing Options------>I2C------>Yes------->OK------->finsh

然后将屏幕接到树莓派上,接SDA.1和SCL.1的脚

在这里插入图片描述

然后使用以下指令查看

sudo i2cdetect -y -a 1

如果出现以下

在这里插入图片描述

就算成功了。

代码编写

wiringPi

主要说一下怎么初始化和发送数据,具体的实现,参考github的开源链接。

1、函数设置要控制的节点对象,将返回设备节点。

int wiringPiI2CSetup (int devId) ;

2、读取设备节点值

int wiringPiI2CRead (int fd) ;

3、给设备节点值写值

int wiringPiI2CWrite (int fd, int data) ;

4、给设备节点的某一个寄存器写值

//写1个字节
int wiringPiI2CWriteReg8 (int fd, int reg, int data) ;
//写2个字节
int wiringPiI2CWriteReg16 (int fd, int reg, int data) ;

5、读取设备节点某一个寄存器的值

//读取一个字节数据
int wiringPiI2CReadReg8 (int fd, int reg) ;
//读取两个字节数据
int wiringPiI2CReadReg16 (int fd, int reg) ;

下面是一个初始化IIC的代码,然后使用的OLED.c就是中景元开源的代码,将IIC部分做了修改。

这是main.c的代码

#include <wiringPi.h>
#include <stdio.h>
#include <wiringPiI2C.h>
#include "oled.h"

int fd;

void oled_write_one_byte(uint8_t dat,uint8_t mode)
{
    wiringPiI2CWriteReg8(fd,mode,dat);
}

int main(void)
{ 
    if(wiringPiSetup() < 0) //当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。
        return 1;
    fd = wiringPiI2CSetup (SlaveAddress);
    if(fd < 0)
    {
        printf("IIC初始化失败\r\n");
        return fd;
    }

    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0,0,(char*)"HELLO2",16,1);
    OLED_Refresh();//更新显示
 
    return 0;
}

这是oled.c主要修改的部分

extern void oled_write_one_byte(uint8_t dat,uint8_t mode);

void OLED_WR_Byte(uint8_t dat,uint8_t mode)
{
    oled_write_one_byte(dat,mode);
}

然后编译这段代码

cc -Wall -o main main.c oled.c -lwiringPi

-Wall 表示编译时显示所有警告,-lwiringPi 表示编译时动态加载 wiringPi 库

编译完成后调用生成的main文件

sudo ./main

想要停止这个程序,Ctrl+c即可。

bcm2835

主要说一下怎么初始化和发送数据,具体的实现,参考开源链接。

1、开始I2C操作

int bcm2835_i2c_begin(void);

2、设置IIC从机地址

void bcm2835_i2c_setSlaveAddress(uint8_t addr);

3、设置工作频率

void bcm2835_i2c_set_baudrate(uint32_t baudrate);

4、给设备节点写值,要写寄存器的话,就把第一个数设置成为寄存器,后面的数就是要发的数

uint8_t bcm2835_i2c_write(const char * buf, uint32_t len);

5、从设备节点读值

uint8_t bcm2835_i2c_read(char* buf, uint32_t len);

5、结束I2C操作

void bcm2835_i2c_end(void);

注意,下面是一个实际例子,oled部分的处理和wiringPi一样这里就不写了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <bcm2835.h>
#include "oled.h"

#define I2C_ADDR_OLED 0x3C
 
void oled_write_one_byte(uint8_t dat,uint8_t mode)
{
    char WriteBuf[2] = {mode,dat};
    bcm2835_i2c_write(WriteBuf,2);
}

int main(int argc, char **argv)
{
	if (!bcm2835_init())  
		return 1;  
 
    bcm2835_i2c_begin();
    bcm2835_i2c_setSlaveAddress(I2C_ADDR_OLED);
    bcm2835_i2c_set_baudrate(100000); /* 100 KHz */

    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0,0,(char*)"HELLO3",16,1);
    OLED_Refresh();//更新显示
 
    bcm2835_i2c_end();   
    bcm2835_close();
 
    return 0;
}

然后编译这段代码

gcc -Wall main.c oled.c -o main -lbcm2835

-Wall 表示编译时显示所有警告,-lbcm2835 表示编译时动态加载bcm2835 库

编译完成后调用生成的main文件

sudo ./main

想要停止这个程序,Ctrl+c即可。

RPi.GPIO

python控制iic的话,是有专门的别人写好的库。有两个库可以选择luma和Adafruit,但是我们下面的使用只使用luma。

pip install luma.oled

我们使用python安装的时候,应该会报错error: externally-managed-environment,网上有几种方法解决,可以参考这篇博文,我使用的是他说的创建venv的方式。

python -m venv ~/myenv        #创建虚拟环境,myenv就是环境名
source ~/myenv/bin/activate   #使能我们创建的虚拟环境
pip install luma.oled         #再次Pip安装

其他env操作

deactivate #退出环境

直接给代码了

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
from time import sleep
"""
OLED luma 驱动库测试程序
功能:显示 hello world 和矩形外框持续10秒
"""
__version__ = 1.0
# 初始化端口
serial = i2c(port=1, address=0x3C)
# 初始化设备,这里改ssd1306, ssd1325, ssd1331, sh1106
device = ssd1306(serial)
print("当前版本:", __version__)
# 调用显示函数
with canvas(device) as draw:
    draw.rectangle(device.bounding_box, outline="white", fill="black")
    draw.text((30, 20), "Hello World", fill="white")
# 延时显示10s
sleep(10)

更多资料可查看https://github.com/rm-hull/luma.examples

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少年、潜行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值