SPI应用 用SPI总线读取气压传感器SCP1000的数据
Using SPI to read a Barometric Pressure Sensor
This example shows how to use the SPI (Serial Peripheral Interface) Communications Library to read data from a SCP1000 Barometric Pressure sensor. Please click here for more information on SPI.
Hardware Required 硬件准备
Arduino or Genuino board
SCP1000 Pressure Sensor Breakout Board
hook-up wires
Circuit 电路图

image developed using Fritzing. For more circuit examples, see the Fritzing project page
Schematic 原理图

The SCP1000 barometric pressure sensor can read both air presure and temperature and report them via the SPI connection. For details of the control registers, see the SCP1000 data sheet.
SCP1000传感器可测量气压和温度,并通过SPI总线与控制器连接
Code 程序代码
The code below starts out by setting the SCP1000's configuration registers in the setup(). In the main loop, it sets the sensor to read in high resolution mode, meaning that it will return a 19-bit value, for the pressure reading, and 16 bits for the temperature. The actual reading in degrees Celsius is the 16-bit result divided by 20.
使用时首先用setup()对SCP1000的配置寄存器进行设置。测量结果包含19位的气压值,16位的温度值。摄氏度等于16位数据除以20。
Then it reads the temperature's two bytes. Once it's got the temperature, it reads the pressure in two parts. First it reads the highest three bits, then the lower 16 bits. It combines these two into one single long integer by bit shifting the high bits then using a bitwise OR to combine them with the lower 16 bits. The actual pressure in Pascal is the 19-bit result divide by 4.
读取压力值时,先读高3位,再读低16位,然后通过移位组成19位的整数。帕斯卡数等于19位数据除以4。
1 /*
2 SCP1000 Barometric Pressure Sensor Display
3
4 Shows the output of a Barometric Pressure Sensor on a
5 Uses the SPI library. For details on the sensor, see:
6 http://www.sparkfun.com/commerce/product_info.php?products_id=8161
7 http://www.vti.fi/en/support/obsolete_products/pressure_sensors/
8
9 This sketch adapted from Nathan Seidle's SCP1000 example for PIC:
10 http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip
11
12 Circuit: SCP1000与控制板的接线
13 SCP1000 sensor attached to pins 6, 7, 10 - 13:
14 DRDY: pin 6 dataReadyPin
15 CSB: pin 7 chipSelectPin
16 MOSI: pin 11
17 MISO: pin 12
18 SCK: pin 13
19
20 created 31 July 2010
21 modified 14 August 2010
22 by Tom Igoe
23 */
24 // the sensor communicates using SPI, so include the library:
25 #include <SPI.h>
26
27 //Sensor's memory register addresses:
28
29 const int PRESSURE = 0x1F; //3 most significant bits of pressure
30 const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure
31 const int TEMPERATURE = 0x21; //16 bit temperature reading
32 const byte READ = 0b11111100; // SCP1000's read command SCP1000的读指令
33 const byte WRITE = 0b00000010; // SCP1000's write command SCP1000的写指令
34
35 // pins used for the connection with the sensor
36 // the other you need are controlled by the SPI library):
37 const int dataReadyPin = 6;
38 const int chipSelectPin = 7;
39 void setup()
40
41 {
42 Serial.begin(9600);
43 // start the SPI library:
44 SPI.begin();
45
46 // initalize the data ready and chip select pins:
47 pinMode(dataReadyPin, INPUT); //数据准备信号来自传感器
48 pinMode(chipSelectPin, OUTPUT); //芯片选择信号来自控制器
49
50 //Configure SCP1000 for low noise configuration:
51 writeRegister(0x02, 0x2D);
52 writeRegister(0x01, 0x03);
53 writeRegister(0x03, 0x02);
54 // give the sensor time to set up:
55 delay(100);
56 }
57
58
59 void loop()
60
61 {
62 //Select High Resolution Mode
63 writeRegister(0x03, 0x0A);
64
65 // don't do anything until the data ready pin is high:
66 if (digitalRead(dataReadyPin) == HIGH)
67
68 {
69 //Read the temperature data
70 int tempData = readRegister(0x21, 2); //2个字节
71 // convert the temperature to celsius and display it:
72 float realTemp = (float)tempData / 20.0; //转换为摄氏温度
73 Serial.print("Temp[C]=");
74 Serial.print(realTemp);
75
76
77 //Read the pressure data highest 3 bits:
78 byte pressure_data_high = readRegister(0x1F, 1);
79 pressure_data_high &= 0b00000111; //you only needs bits 2 to 0
80
81 //Read the pressure data lower 16 bits:
82 unsigned int pressure_data_low = readRegister(0x20, 2);
83 //combine the two parts into one 19-bit number: 并转换为帕斯卡
84 long pressure = ((pressure_data_high << 16) | pressure_data_low) / 4;
85 // display the temperature:
86 Serial.println("\tPressure [Pa]=" + String(pressure));
87 }
88 }
89
90 //Read from or write to register from the SCP1000:
91 unsigned int readRegister(byte thisRegister, int bytesToRead) //读SCP1000的寄存器
92
93 {
94 byte inByte = 0; // incoming byte from the SPI
95 unsigned int result = 0; // result to return
96 Serial.print(thisRegister, BIN);
97 Serial.print("\t");
98 // SCP1000 expects the register name in the upper 6 bits
99 // of the byte. So shift the bits left by two bits:
100 thisRegister = thisRegister << 2;
101 // now combine the address and the command into one byte
102 byte dataToSend = thisRegister & READ; // READ是读指令0b11111100
103 Serial.println(thisRegister, BIN);
104 // take the chip select low to select the device:
105 digitalWrite(chipSelectPin, LOW);
106 // send the device the register you want to read:
107 SPI.transfer(dataToSend); //传送寄存器地址
108 // send a value of 0 to read the first byte returned:
109 result = SPI.transfer(0x00); //传送0x00以得到第1个字节的数据
110 // decrement the number of bytes left to read:
111 bytesToRead--;
112 // if you still have another byte to read:
113 if (bytesToRead > 0)
114
115 {
116 // shift the first byte left, then get the second byte:
117 result = result << 8;
118 inByte = SPI.transfer(0x00);
119 // combine the byte you just got with the previous one:
120 result = result | inByte;
121 // decrement the number of bytes left to read:
122 bytesToRead--;
123 }
124 // take the chip select high to de-select:
125 digitalWrite(chipSelectPin, HIGH);
126 // return the result:
127 return (result);
128 }
129
130 //Sends a write command to SCP1000
131 void writeRegister(byte thisRegister, byte thisValue) //写SCP1000的寄存器
132
133 {
134 // SCP1000 expects the register address in the upper 6 bits
135 // of the byte. So shift the bits left by two bits:
136 thisRegister = thisRegister << 2;
137 // now combine the register address and the command into one byte:
138 byte dataToSend = thisRegister | WRITE; // WRITE是写指令0b00000010
139 // take the chip select low to select the device:
140 digitalWrite(chipSelectPin, LOW);
141 SPI.transfer(dataToSend); //Send register location
142 SPI.transfer(thisValue); //Send value to record into register
143 // take the chip select high to de-select:
144 digitalWrite(chipSelectPin, HIGH);
145 }
146
147
SPI应用 用SPI总线读取气压传感器SCP1000的数据的更多相关文章
- 【转载】IIC SPI UART串行总线
一.SPISPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,在很多器件中被广泛应用. 接口SPI接口经常被称为4线串行 ...
- SPI通信协议(SPI总线)学习
1.什么是SPI? SPI是串行外设接口(Serial Peripheral Interface)的缩写.是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线. ...
- Linux驱动 - SPI驱动 之三 SPI控制器驱动
通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动.通用接口层和控制器驱动三大部分.其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:1. ...
- Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI
SPI 全称为 Service Provider Interface,是一种服务发现机制.当程序运行调用接口时,会根据配置文件或默认规则信息加载对应的实现类.所以在程序中并没有直接指定使用接口的哪个实 ...
- Java SPI 与 Dubbo SPI
SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制.本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时,动 ...
- 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- Java spi 和Spring spi
service provider framework是一个系统, 实现了SPI, 在系统里多个服务提供者模块可以提供一个服务的实现, 系统让客户端可以使用这些实现, 从而实现解耦. 一个service ...
- SPI应用 用SPI控制一个数字电位器
Controlling a Digital Potentiometer Using SPI In this tutorial you will learn how to control the AD5 ...
- 联盛德 HLK-W806 (四): 软件SPI和硬件SPI驱动ST7735液晶LCD
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
随机推荐
- 利用Python爬虫刷新某网站访问量
前言:前一段时间看到有博友写了爬虫去刷新博客访问量一篇文章,当时还觉得蛮有意思的,就保存了一下,但是当我昨天准备复现的时候居然发现文章404了.所以本篇文章仅供学习交流,严禁用于商业用途 很多人学习p ...
- 在vue项目中使用scss
1.首先安装依赖 npm install node-sass sass-loader --save-dev 2.找到build中webpack.base.conf.js,在rules中添加scss规则 ...
- LuaBridge相关
http://www.cppblog.com/sunicdavy/archive/2013/12/07/204648.html https://segmentfault.com/a/119000000 ...
- Python pymsql模块
pymsql pymysql这款第三方库可以帮助我们利用python语言与mysql进行链接 基本使用 首先要下载pymysql pip install pymsql 以下是pymysql的基本使用 ...
- Pandas | Dataframe的merge操作,像数据库一样尽情join
今天是pandas数据处理第8篇文章,我们一起来聊聊dataframe的合并. 常见的数据合并操作主要有两种,第一种是我们新生成了新的特征,想要把它和旧的特征合并在一起.第二种是我们新获取了一份数据集 ...
- webpack 多页面构建
目标: 基于webpack支持react多页面构建(不用gulp,gulp-webpack 构建速度太慢[3]), generator-react-webpack 对单页面支持很好,但对多页面,需要改 ...
- css动画 loading
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CSS中的包含块
1.初始包含块,浏览器viewport大小 2.非根元素,position:relative/static,包含块为最近的块级框,表格单元或行内祖先框的内容区 3.非根元素,position:abso ...
- vue3.0 加载json的“另类”方法(非ajax)
问题 加载json一定要用ajax的方式吗? 最近学习vue3.0,在实现一个功能的时候发现一个问题-- 写代码的时候,需要的json太长.太多,和代码放在一起太混乱.看代码总有翻来翻去,又没有&qu ...
- 剑指 Offer 43. 1~n整数中1出现的次数
题目描述 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次. 示例 1: 输入:n = 12 ...