树莓派+PCF8591--02--模拟输入

树莓派没有AD芯片

正好学习AD&DA芯片 和 I2C

硬件

51开发板端

树莓派+PCF8591--02--模拟输入_第1张图片
J31与J32用于切换AD输入端口,不用电位计。直接将AD0接到光线传感器上。

(这个开发板模块的意思就是可以用电位器的模拟量,也可以接其他东西。)
树莓派+PCF8591--02--模拟输入_第2张图片
J33是DA输入模拟LED等选择开关,用跳帽跳上之后LED起作用。
(意思就是模拟输出控制灯的亮度)
树莓派+PCF8591--02--模拟输入_第3张图片

I2C接口

SCL------时钟
SDA-----数据

树莓派端

wiringPi上的I2C-pcf8591说明
寥寥几句,字字如金。

先在开起I2C

	sudo raspi-config
	-->  5 Interfacing Options
	--> p5 I2C
	--> yes
	-->reboot
	

能看出有两个I2C接口
树莓派+PCF8591--02--模拟输入_第4张图片

安装I2C工具

pi@raspberrypi:~ $  sudo apt-get install i2c-tools
pi@raspberrypi:~ $  ls /dev/*i2c*
	/dev/i2c-1		
pi@raspberrypi:~ $ i2cdetect -y 1
  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --     

杜邦线连接后

pi@raspberrypi:~ $ i2cdetect -y 1
  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --     

48是pcf8591的。57可能是板子上连的eeprom

以下是qtcreator源码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 
#include 

//宏定义一些必须的
#define Address 0x48    //i2cdetect -y 1中找到的
#define BASE 64         //pcf8591的配置
#define A0 BASE+0       
#define A1 BASE+1
#define A2 BASE+2
#define A3 BASE+3

namespace Ui {
class MainWindow;
}

long map(long value, long fromStart, long fromEnd, long toStart, long toEnd);

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void timerEvent(QTimerEvent *event);    //定义了一个定时器
private:

    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    wiringPiSetup();
    pcf8591Setup(BASE,Address);

    startTimer(100);    //定时100毫秒。



}

MainWindow::~MainWindow()
{
    delete ui;
}


/*使用qt的定时器*/
void MainWindow::timerEvent(QTimerEvent *event)
{
    ui->progressBar->setValue(map(analogRead(A0),0,255,0,100));
}


/*这个是模仿arduino的map函数*/
long map(long value, long fromStart, long fromEnd, long toStart, long toEnd)
{
    return ((value-fromStart)*(toEnd-toStart)/(fromEnd-fromStart)+toStart);
}

ui上只放一个Progress Bar

致谢:

https://blog.csdn.net/wwb74110/article/details/67119781
https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial#i2c-on-pi
http://www.mamicode.com/info-detail-1791255.html
https://book.2cto.com/201311/36122.html
https://blog.csdn.net/xukai871105/article/details/18033945

你可能感兴趣的:(树莓派)