• 树莓派中QT实现I2C


    树莓派中QT实现I2C

    在QT中实现 I2C 使用的驱动为 wiringPi

    库的引入

    LIBS += -lwiringPi
    LIBS +=  -lwiringPiDev
    

    代码实现

    widget.h

    记得引入"wiringPiI2C.h"等

    此处,我使用的是读取传感器adxl345加速度计

    #include <QWidget>
    #include <QtSerialPort/QSerialPort>
    #include <QtSerialPort/QSerialPortInfo>
    #include "wiringPiI2C.h"
    #include "wiringPi.h"
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::Widget *ui;
        void adxl345_write(int fd);
        int fd;
    };
    

    widget.cpp

    首先应该使用在命令行中 i2cdetect -y 1 来获取i2c 设备在channel 1 的地址,比如

    ​ 0 1 2 3 4 5 6 7 8 9 a b c d e f

    00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- 53 -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

    此处我得到的设备地址为0x53 (命令行中展示的结果为十六进制)

    随后

    fd = wiringPiI2CSetup(0x53); //初始化设备

    wiringPiI2CWriteReg8(fd,0x31,0x0b); // 向设备发数据

    wiringPiI2CReadReg8(fd,0x32); // 接收设备数据

    代码如下:

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        wiringPiSetup();
        fd = wiringPiI2CSetup(0x53);
        adxl345_init(fd);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void  Widget::adxl345_write(int fd){
        wiringPiI2CWriteReg8(fd,0x31,0x0b);
        wiringPiI2CWriteReg8(fd,0x2d,0x08);
        wiringPiI2CWriteReg8(fd,0x1e,0x00);
        wiringPiI2CWriteReg8(fd,0x1f,0x00);
        wiringPiI2CWriteReg8(fd,0x20,0x00);
        wiringPiI2CWriteReg8(fd,0x21,0x00);
        wiringPiI2CWriteReg8(fd,0x22,0x00);
        wiringPiI2CWriteReg8(fd,0x23,0x00);
        wiringPiI2CWriteReg8(fd,0x24,0x01);
        wiringPiI2CWriteReg8(fd,0x25,0x0f);
        wiringPiI2CWriteReg8(fd,0x26,0x2b);
        wiringPiI2CWriteReg8(fd,0x27,0x00);
        wiringPiI2CWriteReg8(fd,0x28,0x09);
        wiringPiI2CWriteReg8(fd,0x29,0xff);
        wiringPiI2CWriteReg8(fd,0x2a,0x80);
        wiringPiI2CWriteReg8(fd,0x2c,0x0a);
        wiringPiI2CWriteReg8(fd,0x2f,0x00);
        wiringPiI2CWriteReg8(fd,0x38,0x9f);
    }
    
    
    
    void Widget::on_pushButton_clicked(){
        char x0,y0,z0,x1,y1,z1;
        x0 = 0xff - wiringPiI2CReadReg8(fd,0x32);
        x1 = 0xff - wiringPiI2CReadReg8(fd,0x33);
        y0 = 0xff - wiringPiI2CReadReg8(fd,0x34);
        y1 = 0xff - wiringPiI2CReadReg8(fd,0x35);
        z0 = 0xff - wiringPiI2CReadReg8(fd,0x36);
        z1 = 0xff - wiringPiI2CReadReg8(fd,0x37);
    
        int x = (int)(x1 << 8) + (int)x0;
        int y = (int)(y1 << 8) + (int)y0;
        int z = (int)(z1 << 8) + (int)z0;
    
        if(x>65535/2){
            x = x - 65535;
        }
    
        if(y > 62235/2){
            y = y - 65535;
        }
    
        if(z > 65535/2){
            z = z - 65535;
        }
    
        qDebug() << x;
        qDebug() << y;
        qDebug() << z;
    
    }
    

    这样,我们就读取出了传感器adxl345加速度计的数据

  • 相关阅读:
    基本数据类型转换
    java8新增的日期时间包
    算法之冒泡排序
    基本数据类型
    spring入门
    JiuDuOj——1020
    JiuDuOj——1051
    2015.11.26——Accelerated C++
    POJ2681——求字符串长度
    POJ1017——装箱问题
  • 原文地址:https://www.cnblogs.com/wangha/p/10656860.html
Copyright © 2020-2023  润新知