距离上次更新本文已经过去了 730 天,文章部分内容可能已经过时,请注意甄别

前言

今天折腾 vim 编辑器折腾了老久,我只是想实现在 vim 编辑器中可以复制代码到 windows 电脑下,方便我写博客,但是咋弄都搞不定,放弃了,还是用树莓派的系统来复制吧

关注本专栏,和我一起学习树莓派开发板 30 + 经典实验

C 语言代码,0 基础剖析!


1. 实验器材

  • 树莓派开发板
  • 40p 软排线 + T 型转接板 + 面包板
  • 振动传感器模块
  • 双色 LED 模块
  • 跳线一堆

IMG_20220413_190021

上:双色 LED 模块;下:震动传感器模块

振动传感器模块和倾斜传感器模块很像,都是通过物理结构来判断当前的状态。而且它也有 PWR-LEDDO-LED 两个指示灯


2. 实验原理

振动开关传感器用的是常闭型振动传感器,可用于跟踪振动触发作用,如防盗报警,地震报警和智能小车。与常开型振动传感器相比,常闭型振动传感器触发时间长,可以用于驱动继电器模块


该模块采用常开高灵敏度震动开关。开关在静止時为开路 OFF 状态,当受到外力碰触而达到相应震动力时,或移动速度达到适当离 (偏) 心力时,导电接脚会产生瞬间导通呈瞬间 ON 状态;当外力消失時,开关恢复为开路 OFF 状态。可用于各种震动触发作用,报盗报警,智能小车,电子积木等。传感器特设 M3 固定安装孔,调节方向与固定方便易用,使用宽电压 LM393 比较器,信号干净,波形好,驱动能力强,超过 15mA,配可调精密电位器调节灵敏度。
在此实验中,将双色 LED 模块连接到 Raspberry Pi 作为指示作用。敲击或敲击振动传感器时,它将打开双色 LED 将闪烁红色。再次点击它,LED 将变为绿色 - 每次敲击或敲击两种颜色之间交替闪烁。

2.1 电路图

8.振动开关传感器实验原理图

2.2 接线图

树莓派 T 型转接板振动开关
GPIO 0GPIO 17Do
5V5VVCC
GNDGNDGND
树莓派 T 型转接板双色 LED
GPIO 1GPIO 18R (中间)
GNDGNDGND(-)
GPIO 2GPIO 27G(S)

因为接口和倾斜开关一模一样,所以接线方式也是一样的

08_Vibration Switch_bb

实物接线图这里就不放了,和倾斜开关不同的是,振动开关在接上后,两个指示灯都会亮起,振动该传感器,DO-LED 会闪动

image-20220413192023148


3. 代码示例

老样子,给出 C 语言的代码示例

这里的 wiringPi 库函数在上两次的实验中都有使用过,详情请查看实验 6 里的解释

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <wiringPi.h>
#include <stdio.h>

#define makerobo_VibratePin 0 // 震动传感器
#define makerobo_Rpin 1 // 红色LED PIN
#define makerobo_Gpin 2 // 绿色LED PIN

int clb_tmp = 0;//全局变量用于比较
//双色LED控制函数
void double_colorLED(int color)
{
pinMode(makerobo_Rpin, OUTPUT); //设置为输出模式
pinMode(makerobo_Gpin, OUTPUT); //设置为输出模式

if (0 == color) //点亮红色LED灯
{
digitalWrite(makerobo_Rpin, HIGH);
digitalWrite(makerobo_Gpin, LOW);
}
else if (1 == color) //点亮绿色LED灯
{
digitalWrite(makerobo_Rpin, LOW);
digitalWrite(makerobo_Gpin, HIGH);
}
else
printf("Makerobo Double color LED Error\n"); // 双色LED错误
}

// 打印信息,打印出振动传感器的状态
void makerobo_Print(int x)
{
if (x != clb_tmp)
{
if (x == 0)
printf("...Makerobo ON\n");
if (x == 1)
printf("Makerobo OFF..\n");

clb_tmp = x;//复位x
}
}

int main()
{
int clb_status = 0; //状态值
int clb_tmp = 0; //比较值
int clb_value = 1; //当前值

//wiringPi初始化连接失败时,将消息打印到屏幕
if(wiringPiSetup() == -1){
printf("setup wiringPi failed !");
return 1;
}

//振动传感器Pin设置为输入模式
pinMode(makerobo_VibratePin, INPUT);

while(1){
clb_value = digitalRead(makerobo_VibratePin); //获取振动传感的值
if (clb_tmp != clb_value)
{ //振动传感器的输出值发生改变
clb_status ++; //振动传感器状态加1
if (clb_status > 1)
{
clb_status = 0; //状态发生改变判断,如果变成2了复位成0
}
double_colorLED(clb_status); //控制双色LED模块
makerobo_Print(clb_status); //打印出状态
delay(1000); //延时1s
}
}
return 0;
}

3.1 代码思路讲解

clb_value 接收振动传感器的返回值,每次振动,返回值都会改变

  • value 初始值为 1,振动时,接收了返回值为 0,和 tmp 不同,所以 status++,双色 LED 的颜色改变
  • 如果没有检测到振动,返回值为 1,和 tmp 相同,status 不改变,双色 LED 的颜色不变

参数 clb_tmp 问题

void makerobo_Print(int x) 函数中调用的其实是全局变量下的 clb_tmp

而 main 函数中调用的是 int clb_tmp = 0;//比较值这个单独定义的局部变量,和全局中的 tmp 没有关系,所以 makerobo_Print 函数中对 clb_tmp 函数的操作不影响 main 中和状态码的比较

为了不搞混全局变量和局部变量,建议将 main 函数中的 tmp 更名为 clb_tmp1

image-20220413194830824

3.2linux 运行代码

plaintext
1
gcc -Wall 08vibrationswitch.c -o TEST -lwiringPi

GIF

每次晃动传感器,双色 LED 就会变色,屏幕上打印出 on 和 off(每晃动一次,打印一次)

CTRL+C 终止程序运行

Screenshot_2022_0413_193113

和倾斜开关的实时改变不同,振动开关的改变不是实时的,而是需要新的振动来触发它(类似一个按钮)

假设我们要用它来做一个报警装置,假设在某一段时间内检测到振动状态多次改变,就可以发出信号报警,代表你的门(或者某个东西)被移动了


结语

这次实验的代码比上一次的倾斜开关相比,更复杂了一些。希望我的讲解对你有帮助!

感谢你看到最后!如果对你有帮助,还请点个👍,万分感谢!

image-20220413195026194