文章目录
前言1.实验器材2.实验原理2.1电路图2.2接线图 3.代码示例3.1代码思路讲解参数`clb_tmp`问题 3.2linux运行代码 结语前言
今天折腾vim编辑器折腾了老久,我只是想实现在vim编辑器中可以复制代码到windows电脑下,方便我写博客,但是咋弄都搞不定,放弃了,还是用树莓派的系统来复制吧
关注本专栏,和我一起学习树莓派开发板30+经典实验!
C语言代码,0基础剖析!
还等什么😍心动不如行动!👉点我关注
本专栏代码仓库📝:Raspberry-practice
1.实验器材
树莓派开发板40p软排线+T型转接板+面包板振动传感器模块双色LED模块跳线一堆上:双色LED模块;下:震动传感器模块
振动传感器模块和倾斜传感器模块很像,都是通过物理结构来判断当前的状态。而且它也有PWR-LED
和DO-LED
两个指示灯
2.实验原理
振动开关传感器用的是常闭型振动传感器,可用于跟踪振动触发作用,如防盗报警,地震报警和智能小车。与常开型振动传感器相比,常闭型振动传感器触发时间长,可以用于驱动继电器模块
该模块采用常开高灵敏度震动开关。开关在静止時为开路OFF状态,当受到外力碰触而达到相应震动力时,或移动速度达到适当离(偏)心力时,导电接脚会产生瞬间导通呈瞬间ON状态;当外力消失時,开关恢复为开路OFF状态。可用于各种震动触发作用,报盗报警,智能小车,电子积木等。传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA,配可调精密电位器调节灵敏度。
在此实验中,将双色LED模块连接到Raspberry Pi作为指示作用。敲击或敲击振动传感器时,它将打开双色LED将闪烁红色。再次点击它,LED将变为绿色-每次敲击或敲击两种颜色之间交替闪烁。
2.1电路图
2.2接线图
因为接口和倾斜开关一模一样,所以接线方式也是一样的
实物接线图这里就不放了,和倾斜开关不同的是,振动开关在接上后,两个指示灯都会亮起,振动该传感器,DO-LED
会闪动
3.代码示例
老样子,给出C语言的代码示例
这里的wiringPi库函数在上两次的实验中都有使用过,详情请查看实验6里的解释
#include <wiringPi.h>#include <stdio.h>#define makerobo_VibratePin0 // 震动传感器#define makerobo_Rpin1 // 红色LED PIN #define makerobo_Gpin2 // 绿色LED PINint 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);}elseprintf("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 ++; //振动传感器状态加1if (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
3.2linux运行代码
gcc -Wall 08vibrationswitch.c -o TEST -lwiringPi
每次晃动传感器,双色LED就会变色,屏幕上打印出on和off(每晃动一次,打印一次)
按CTRL+C
终止程序运行
和倾斜开关的实时改变不同,振动开关的改变不是实时的,而是需要新的振动来触发它(类似一个按钮)
假设我们要用它来做一个报警装置,假设在某一段时间内检测到振动状态多次改变,就可以发出信号报警,代表你的门(或者某个东西)被移动了
结语
这次实验的代码比上一次的倾斜开关相比,更复杂了一些。希望我的讲解对你有帮助!
感谢你看到最后!如果对你有帮助,还请点个👍,万分感谢!