锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【树莓派C语言开发】实验08:振动开关模块

时间:2022-09-14 08:00:00 1型振动速度传感器0050振动传感器5v振动传感器原理振动传感器输出44200205010振动传感器4200250108振动传感器

文章目录

  • 前言
  • 1.实验器材
  • 2.实验原理
    • 2.1电路图
    • 2.2接线图
  • 3.代码示例
    • 3.解释代码思路
      • 参数`clb_tmp`问题
    • 3.2linux运行代码
  • 结语

前言

今天折腾vim编辑折腾了很久,我只想实现vim代码可以在编辑器中复制到windows在电脑下,我写博客很方便,但我做不到。放弃,用树莓派系统复制。

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

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

  • 还在等什么?心不如行动!点我注意

  • 本专栏代码仓库:Raspberry-practice


1.实验器材

IMG_20220413_190021

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

振动传感器模块与倾斜传感器模块非常相似,通过物理结构判断当前状态。PWR-LEDDO-LED两个指示灯


2.实验原理

振动开关传感器常闭振动传感器,可用于跟踪防盗报警、地震报警、智能于跟踪振动触发。常开型与振动传感器相比,常闭式振动传感器触发时间长,可用于驱动继电器模块


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

2.1电路图

2.2接线图

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

因为接口和倾斜开关完全一样,接线方式也一样

这里不放实物接线图,不同于倾斜开关,振动开关连接后,两个指示灯都会亮起,振动传感器,DO-LED会闪动


3.代码示例

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

这里的wiringPi库函数已用于最后两次实验。详情请查看实验6中的解释

#include  #include   #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

3.2linux运行代码

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

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

CTRL+C终止程序运行

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

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


结语

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

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章