2024年最新【树莓派C语言开发】实验08:振动开关模块_c语言扫面震动开关(2),2024年最新10天拿到字节跳动C C++岗位offer

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

| GPIO 1 | GPIO 18 | R(中间) |
| GND | GND | GND(-) |
| GPIO 2 | GPIO 27 | G(S) |

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

08_Vibration Switch_bb

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

image-20220413192023148


3.代码示例

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

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

#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运行代码

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

GIF

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

CTRL+C终止程序运行

Screenshot_2022_0413_193113

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

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


结语

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

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

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值