README_zh.md
1# 小凌派-RK2206开发板OpenHarmonyOS开发-智慧井盖
2
3## 实验内容
4
5本例程演示如何在小凌派-RK2206开发板上实现智慧井盖应用案例。
6
7
8
9## 硬件资源
10
11硬件资源图如下所示:
12
13
14EEPROM 24C02的设备地址为:0x1010001* ;
15六轴传感器 MPU6050 的设备地址为:0x1101000*
16
17## 硬件接口说明
18
19引脚名称开发者可在硬件资源图中查看,也可在智慧井盖模块背面查看。
20
21| 引脚名称 | 功能描述 |
22| :--- | :------- |
23| MPU6050_INT | MPU6050中断输出 |
24| Normal_CTR | LED控制线,低电平有效 |
25| Tilt_Warning_CTR | LED控制线,低电平有效 |
26| I2C_SCL |I2C时钟信号线 |
27| I2C-SDA | I2C数据信号线 |
28| GND | 电源地引脚 |
29| 3V3 |3.3V电源输入引脚 |
30| GND | 电源地引脚 |
31
32## 硬件设计
33
34硬件电路如下图所示:
35
36
37模块整体硬件电路如上图所示,电路中包含了E53接口连接器,EEPROM存储器、MPU6050传感器,LED指示灯电路,其中EEPROM存储器、MPU6050传感器为数字接口芯片,直接使用I2C总线控制,电路简单,本文不再过多说明。
38
39### 硬件连接
40
41小凌派开发板与模块均带有防呆设计,故很容易区分安装方向,直接将模块插入到开发板的E53母座接口上即可,安装图如下所示:
42
43
44## 程序设计
45
46### API分析
47
48MPU6050寄存器手册
49/vendor/lockzhiner/lingpi/docs/datasheet/sensor/MPU-6000 and MPU-6050 Register Map and Descriptions.pdf
50
51**头文件:**
52
53/vendor/lockzhiner/lingpi/samples/e53_smart_city/include/e53_smart_city.h
54
55#### e53_sc_init()
56
57```c
58void e53_sc_init();
59```
60
61**描述:**
62
63E53智慧井盖模块初始化,包括初始化I2C0、LED1灯GPIO、LED2灯GPIO;初始化MPU6050传感器。
64
65**参数:**
66
67无
68
69**返回值:**
70
71无
72
73#### mpu6050_write_reg()
74
75```c
76void mpu6050_write_reg(uint8_t reg, uint8_t data);
77```
78
79**描述:**
80
81E53智慧井盖模块MPU6050传感器写寄存器。
82
83**参数:**
84
85|名字|描述|
86|:--|:------|
87| reg | 寄存器 |
88| data | 写入的寄存器值 |
89
90**返回值:**
91
92无
93
94#### mpu6050_read_data()
95
96```c
97void mpu6050_read_data(uint8_t reg, unsigned char *buf, uint8_t length);
98```
99
100**描述:**
101
102E53智慧井盖模块MPU6050传感器读寄存器。
103
104**参数:**
105
106|名字|描述|
107|:--|:------|
108| reg | 寄存器 |
109| buf | 读寄存器缓冲区指针 |
110| length | 读寄存器长度 |
111
112**返回值:**
113
114无
115
116#### MPU6050_Read_Buffer()
117
118```c
119uint8_t MPU6050_Read_Buffer(uint8_t reg, uint8_t *p_buffer, uint16_t length);
120```
121
122**描述:**
123
124E53智慧井盖模块读取多个MPU6050寄存器值。
125
126**参数:**
127
128|名字|描述|
129|:--|:------|
130| reg | 寄存器 |
131| p_buffer | 读缓冲区指针 |
132| length | 读取寄存器长度 |
133
134**返回值:**
135
136|返回值|描述|
137|:--|:------|
138| 0 | 成功 |
139| 非0值 | 失败,返回错误值 |
140
141#### mpu6050_read_acc()
142
143```c
144void mpu6050_read_acc(short *acc_data);
145```
146
147**描述:**
148
149E53智慧井盖模块读取MPU6050的角速度数据。
150
151MPU6050_ACC_OUT角速度数据寄存器,只读,包括X轴、Y轴和Z轴。
152
153
154
155**参数:**
156
157|名字|描述|
158|:--|:------|
159| acc_data | 读取的角速度数据指针,包括X轴、Y轴、Z轴数据 |
160
161**返回值:**
162
163无
164
165#### mpu6050_read_id()
166
167```c
168uint8_t mpu6050_read_id();
169```
170
171**描述:**
172
173E53智慧井盖模块读取MPU6050的ID,读取值为0x68返回成功;否则,返回失败。
174
175MPU6050_RA_WHO_AM_I寄存器,只读,默认值0x68。
176
177
178
179**参数:**
180
181无
182
183**返回值:**
184
185|返回值|描述|
186|:--|:------|
187| 0 | 失败 |
188| 1 | 成功 |
189
190#### mpu6050_init()
191
192```c
193void mpu6050_init();
194```
195
196**描述:**
197
198E53智慧井盖模块初始化MPU6050传感器。
199
200MPU6050_RA_PWR_MGMT_1电源管理寄存器,DEVICE_RESET复位唤醒传感器。
201
202
203
204MPU6050_RA_INT_ENABLE中断使能寄存器,中断控制。
205
206
207
208MPU6050_RA_USER_CTRL用户控制寄存器,关闭I2C主模式。
209
210
211
212MPU6050_RA_FIFO_EN FIFO使能寄存器,关闭FIFO。
213
214
215
216MPU6050_RA_INT_PIN_CFG INT管脚/旁路控制寄存器。
217
218
219
220MPU6050_RA_CONFIG配置寄存器,配置为外部引脚采样,DLPF数字低通滤波器。
221
222
223
224MPU6050_RA_ACCEL_CONFIG加速配置寄存器,配置加速度传感器量程和高通滤波器。
225
226
227
228**参数:**
229
230无
231
232**返回值:**
233
234无
235
236#### e53_sc_read_data()
237
238```c
239void e53_sc_read_data(e53_sc_data_t *p_data);
240```
241
242**描述:**
243
244E53智慧井盖模块读取传感器数据。
245
246**参数:**
247
248|名字|描述|
249|:--|:------|
250| data | 读取的传感器数据指针,包括X轴、Y轴、Z轴数据 |
251
252**返回值:**
253
254无
255
256#### led_d1_set()
257
258```c
259void led_d1_set(SWITCH_STATUS_ENUM status);
260```
261
262**描述:**
263
264E53智慧井盖模块控制LED1告警状态灯开关。
265
266**参数:**
267
268|名字|描述|
269|:--|:------|
270| status | LED灯状态,ON:开;OFF:关 |
271
272**返回值:**
273
274无
275
276#### led_d2_set()
277
278```c
279void led_d2_set(SWITCH_STATUS_ENUM status);
280```
281
282**描述:**
283
284E53智慧井盖模块控制LED2正常状态灯开关。
285
286**参数:**
287
288|名字|描述|
289|:--|:------|
290| status | LED灯状态,ON:开;OFF:关 |
291
292**返回值:**
293
294无
295
296### 主要代码分析
297
298在e53_sc_thread函数中,每2s读取一次传感器数据并打印X轴、Y轴和Z轴数据。首次读取传感器数据时,保存X轴、Y轴和Z轴数据,用于与之后的传感器数据进行对比。当X轴、Y轴和Z轴与第一次读取保存的X轴、Y轴和Z轴数据差值大于100时,认为井盖倾斜,点亮LED2告警状态灯,关闭LED1正常状态灯;否则认为井盖没有倾斜,关闭LED2告警状态灯,打开LED1正常状态灯。
299
300```c
301void e53_sc_thread()
302{
303 e53_sc_data_t data;
304 int x = 0, y = 0, z = 0;
305
306 e53_sc_init();
307 led_d1_set(OFF);
308 led_d2_set(OFF);
309
310 while (1)
311 {
312 e53_sc_read_data(&data);
313 printf("x is %d\n", (int)data.accel[0]);
314 printf("y is %d\n", (int)data.accel[1]);
315 printf("z is %d\n", (int)data.accel[2]);
316 printf("init x:%d y:%d z:%d\n", x, y, z);
317
318 if (x == 0 && y == 0 && z == 0)
319 {
320 x = (int)data.accel[0];
321 y = (int)data.accel[1];
322 z = (int)data.accel[2];
323 }
324 else
325 {
326 if ((x + DELTA) < data.accel[0] || (x - DELTA) > data.accel[0] ||
327 (y + DELTA) < data.accel[1] || (y - DELTA) > data.accel[1] ||
328 (z + DELTA) < data.accel[2] || (z - DELTA) > data.accel[2])
329 {
330 /*倾斜告警*/
331 led_d1_set(OFF);
332 led_d2_set(ON);
333 data.tilt_status = 1;
334 printf("tilt warning \nLED1 OFF LED2 On\n");
335 }
336 else
337 {
338 led_d1_set(ON);
339 led_d2_set(OFF);
340 data.tilt_status = 0;
341 printf("normal \nLED1 ON LED2 OFF\n");
342 }
343 }
344 LOS_Msleep(2000);
345 }
346}
347```
348
349## 编译调试
350
351### 修改 BUILD.gn 文件
352
353修改 `vendor/lockzhiner/lingpi/sample` 路径下 BUILD.gn 文件,指定 `c2_e53_smart_city` 参与编译。
354
355```r
356"c2_e53_smart_city",
357```
358
359
360### 运行结果
361
362例程代码编译烧写到开发板后,按下开发板的RESET按键,通过串口软件查看日志,串口会打印X、Y、Z轴加速度信息、倾斜告警状态和指示灯状态;倾斜智慧井盖模块开发板,智慧井盖模块上的倾斜状态灯LED2会被点亮。
363
364```r
365x is 149
366y is 21
367z is 1822
368init x:144 y:24 z:1819
369normal
370LED1 ON LED2 OFF
371
372x is 154
373y is 749
374z is 1684
375init x:144 y:24 z:1819
376tilt warning
377LED1 OFF LED2 On
378```
379
380