资讯详情

【树莓派C语言开发】实验10:干簧管传感器

文章目录

  • 前言
  • 1.实验器材
  • 2.实验原理
    • 2.1电路图
    • 2.2接线图
  • 3.代码示例
    • 3.1编译代码
      • 3.1.1 GCC中-Wall指令的作用
    • 3.2实验效果
  • 结语

前言

好像没什么好说的。直接开始今天的实验。

关注这个专栏,和我一起学习树莓派开发板

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

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

1.实验器材

IMG_20220418_110145

上:干簧管传感器;下:双色LED


2.实验原理

干簧管传感器也感器传感器。常用程控交换机、复印机、洗衣机 冰箱、相机、消毒柜、门磁、窗磁、电磁继电器、电子衡器、液位计、煤气表、水 表等产品得到了很好的应用。

:干簧管传感器的效果与霍尔元件非常相似,但后者体积较小

有笔记本电脑,检测笔记本屏幕的开关,实现

image-20220418130818115

干簧管是简称是一种无源电子开关元件,具有结构简单、体积小、控制方便等优点。

image-20220418130903139

它的外壳通常是一根密封的玻璃管,里面装有两个铁弹性弹性弹性弹性弹性板和一种叫做金属的惰性气体。通常,玻璃管中的两个弹性片是分开的。

  • 当磁性物质靠近玻璃管时,在磁场磁线的作用下,管道中的两个簧片被磁化并相互吸引和接触,簧片被吸收并连接连接到结点的电路。
  • 外磁力消失后,两个簧片由于本身的弹性而分开,线路也就断开了。
  • 因此,干簧管作为一种由磁场信号控制的线路开关设备,可作为计数、限位等场景的传感器(主要用于安全系统中的门磁、窗磁),也广泛应用于各种通信设备中。
  • 在实际应用中,这两块金属片的连接通常由磁铁控制,因此也称为磁控管

2.1电路图

电路图中Reed Switch(干簧管)部分实际上是原理部分提到的密封玻璃管,里面有两块铁

  • 当干簧管部分接触到磁性物体时,两个铁片吸附在一起,电路连接,DO管脚输出低电平。同时,电路连接,D2 LED点亮
  • 磁性物体未检测到,两个铁片断开,电路断开,DO管脚直连VCC,输出高电平

10干簧管传感器实验原理图

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)

10_Reed switch_bb

IMG_20220418_124548

接线完成后,PWM-LED指示灯常亮

IMG_20220418_124732

当干簧管检测到磁性物体时,即使没有打开控制程序,DO-LED指示灯也会亮起

image-20220418130243795

3.代码示例

以前控制双色LED我们使用相同的代码。pinMode将干簧管传感器设置为输入模式LED管脚设置为输出模式

  • digitalRead检测到0(低电平)时,双色LED设置为红色
  • digitalRead检测到1(高电平)时,双色LED设置成绿色
///干簧管控制双色LED实验#include  <wiringPi.h>#include <stdio.h>#define makerobo_ReedPin 0 //干簧管传感器管脚定义#define makerobo_Rpin 1 //红色LED模块管脚定义#define makerobo_Gpin 2 //绿色LED模块管脚定义// 双色LED控制函数void double_colorLED(char* color){
     	pinMode(makerobo_Rpin, OUTPUT); //红色LED管脚设置为输出模式	pinMode(makerobo_Gpin, OUTPUT); //绿色LED管脚设置为输出模式	if (color == "makeroboRED")       //点亮红色LED灯	{
     		digitalWrite(makerobo_Rpin, HIGH);		digitalWrite(makerobo_Gpin, LOW);	}	else if (color == "makeroboGREEN") //点亮绿色LED灯	{
     		digitalWrite(makerobo_Rpin, LOW);		digitalWrite(makerobo_Gpin, HIGH);	}	else		printf("Double color LED Error");}int main(){
     	//初始化连接失败时,将消息打印到屏幕	if(wiringPiSetup() == -1){
      		printf("setup wiringPi failed !");		return 1; 	}    //干簧管传感器Pin设置为输入模式	pinMode(makerobo_ReedPin, INPUT);	double_colorLED("makeroboGREEN");  //点亮绿色LED模块		while(1){
     		//干簧管传感器去除抖动处理		if(0 == digitalRead(makerobo_ReedPin))        {
      //干簧管传感器检测到磁性物质			delay(10);       // 延时去抖动			if(0 == digitalRead(makerobo_ReedPin)){
     				double_colorLED("makeroboRED");	   // 点亮红色LED灯				printf("Detected Magnetic Material!\n");// 打印出检测到磁性物质			}		}		else if(1 == digitalRead(makerobo_ReedPin))        {
      // 干簧管传感器没有检测到磁性物质			delay(10);        // 延时去抖动			if(1 == digitalRead(makerobo_ReedPin)){
     				while(!digitalRead(makerobo_ReedPin));				double_colorLED("makeroboGREEN");   // 点亮绿色LED灯				printf("No Detected Magnetic Material!\n"); // 打印出没有检测到磁性物质			}		}	}	return 0;}

更详细的函数解释,可以参考之前的博客👉专栏链接

3.1编译代码

在linux控制台下输入以下语句,编译生成可执行文件TEST

gcc -Wall 10reedswitch.c -o TEST -lwiringPi

3.1.1 GCC中-Wall指令的作用

上一篇博客中,我在编译代码的时候就没有使用-Wall指令,但程序依旧编译成功了

实际上,-Wall指令的作用是让GCC编译器显示程序的警告

  • 编译器在程序中检查出时,会终止编译
  • 编译器在程序中检查出时,依旧能编译生成可执行文件

windows系统中的VS编译器下,也有错误/警告两种报错方式

image-20220418124957665

之前我就没有弄明白Linux环境下这两个之间的区别,导致我认为gcc编译器中不支持用==直接比较常量字符串(然后就把它改成了strcmp,当然这样也没错哈)

image-20220418124406979

如果我们在编译的时候去掉-Wall指令,就不会显示这两个警告

image-20220418125106465

更多关于-Wall指令的知识,大家可以参考这位dalao的博客学习一二👉传送门


3.2实验效果

./TEST运行可执行文件,查看实验结果

GIF

检测到磁性物质时,屏幕打印Detected Magnetic Material!

没有检测到的时候,打印No Detected Magnetic Material!

Screenshot_2022_0418_130006


结语

本次实验到这里就结束啦,希望对你学习树莓派的操作有一些帮助

学校高数和大物欠下的学习债终于补上了,可以摸🐟了

QQ图片20220418131327

标签: 两线磁性传感器磁电式传感器两根线

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

锐单商城 - 一站式电子元器件采购平台