用户名 立即注册 找回密码

微雪课堂

搜索
微雪课堂 Arduino 查看内容

Arduino系列教程十一:I2C

2016-4-27 19:36| 发布者: MyMX1213| 查看: 31263| 评论: 1|原作者: MyMX1213

摘要: 本章介绍arduino通过I2C控制温度传感器LM75

前面几章我们介绍了如何操作ArduinoIO端口。这一章我们讲解一下ArduinoI2C接口编程。本章以Accessory Shiled扩展板中LM75温度传感器为例。在这里我不打算详细介绍LM75芯片,详细信息请查看LM75数据手册。本章示例程序只是简单读取LM75的寄存器并转换为当前温度显示。

前面几章的程序都是写在一个后缀为.ino的工程文件中,而实际应用中这是不可能的,我们的程序通过采用模块化的结构,一个工程包含很多源文件和头文件。例如本章的工程会包含LM75的驱动程序LM75.hLM75.c;主程序中会调用驱动程序函数读取LM75当前温度。而Arduino IDE创建和编辑文件和文件都非常不方便。通常Arduino编程会使用Source Insight软件编辑源代码。从网上下载并安装Source Insigh。界面如图:

示例程序:LM75.h

01#ifndef LM75_h
02 
03#define LM75_h
04 
05  
06 
07#define LM75_ADDRESS 0x48
08 
09  
10 
11#define LM75_TEMP_REGISTER 0
12 
13#define LM75_CONF_REGISTER 1
14 
15#define LM75_THYST_REGISTER 2
16 
17#define LM75_TOS_REGISTER 3
18 
19  
20 
21class LM75 {
22 
23  public:
24 
25    LM75 (unsigned char addr);
26 
27    float temp ();
28 
29  private:
30 
31unsigned char address;
32 
33};
34 
35  
36 
37#endif

 

示例程序:LM75.c

01#include "Arduino.h"
02 
03#include <wire.h>
04 
05#include "LM75.h"
06 
07  
08 
09LM75::LM75 (unsigned char addr){
10 
11  address = addr;
12 
13}
14 
15  
16 
17float LM75::temp () {
18 
19  word regdata;
20 
21  Wire.beginTransmission(address);
22 
23  Wire.write(LM75_TEMP_REGISTER);
24 
25  Wire.endTransmission();
26 
27   
28 
29  Wire.requestFrom(address, 2);
30 
31  regdata = (Wire.read() << 8) | Wire.read();
32 
33  return ((float)(regdata >> 5)) * 0.125;
34 
35}</wire.h>


 

示例程序:LM75.ino

01#include <wire.h>
02 
03#include <lm75.h>
04 
05  
06 
07LM75 sensor(LM75_ADDRESS);
08 
09void setup (void){
10 
11  Serial.begin(9600);
12 
13  Wire.begin();
14 
15}
16 
17  
18 
19void loop() {
20 
21  Serial.print("Current temp: ");
22 
23  Serial.print(sensor.temp());
24 
25  Serial.println(" C");
26 
27  delay(1000);
28 
29}</lm75.h></wire.h>


 

程序分析:

LM75.h

头文件中先define宏定义LM75I2C地址和寄存器地址。然后定义类class LM75,类是C++等面向对象语言的概念。LM75类中包含公有成员和私有成员。public表示公有成员,变量和函数可以被外部访问,例如temp函数在主程序中调用。private表示私有成员,只能被内部访问,例如address是内部变量不能被外部使用,只能是LM75类内部的函数能够使用。

LM75.c

驱动源文件中包含Arduino头文件Arduino.hI2C库的头文件Wire.h。驱动源文件中包含两个函数LM75::LM75 (unsigned char addr)float LM75::temp ();注意第一个函数是没有返回类型的,而且函数名和类名一样。这是类的初始化函数,当类被实例化的时候会调用此函数。如主程序中LM75 sensor(LM75_ADDRESS);实例一个LM75的类为sensor,此时就会调用LM75::LM75 (unsigned char addr)函数。函数前面有LM75::表示这个函数属于LM75类的函数。

Wire.beginTransmission(address);

这个函数表示启动I2C传输,address为要传输的I2C设备地址。

Wire.write(LM75_TEMP_REGISTER);

传输寄存器地址到LM75

Wire.endTransmission();

结束I2C传输,发送结束信号,释放I2C总线。

Wire.requestFrom(address, 2);

请求结束两个字节数据

Wire.read()

I2C接收数据函数

LM75.ino

工程主文件中,包含LM75驱动头文件LM75.hI2C库的头文件Wire.h。程序开始实例一个LM75类名为sensor,此致会调用LM75初始化函数LM75::LM75 (unsigned char addr)。将LM75私有变化address初始化。Setup()函数中调用Serial.begin(9600)初始化串口,波特率为9600,调用Wire.begin()初始化I2C

sensor.temp()

这个是指实例LM75sensor调用类LM75temp函数读取当前温度。

 

把附加中的文件放在arduino目录的librarys文件中,重启Arduino IDE。选择File->Examples->LM75->LM75打开工程,编译并上传,打开串口监视器。等待一会儿就是每隔一点显示当前温度值。

 


429

顶一下

刚表态过的朋友 (429 人)

相关阅读

发表评论

最新评论

引用 游客 2018-3-8 14:48
通过添加标签是可以编辑头文件和源文件的

查看全部评论(1)

Arduino

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2025-4-18 23:13 , Processed in 0.019755 second(s), 21 queries .

返回顶部