文章目录

前言

好像没啥可以说的,直接开始进入今天的实验内容吧


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

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


1.实验器材

  • 树莓派开发板
  • 40p软排线+T型转接板+面包板
  • 干簧管传感器模块
  • 双色LED
  • 跳线若干

【树莓派C语言开发】实验10:干簧管传感器_嵌入式硬件

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


2.实验原理

干簧管传感器也是一种用于检测磁场的传感器。在常用的程控交换机、复印机、洗衣机、

电冰箱、照相机、消毒碗柜、门磁、窗磁、电磁继电器、电子衡器、液位计、煤气表、水

表等产品中都得到了很好的应用。


个人理解:干簧管传感器的效果和霍尔元件很像,不过后者的体积更小

笔记本电脑中就有霍尔元件,用于检测笔记本屏幕的开关,实现合盖休眠的功能

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


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

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

其外壳一般是一根密封的玻璃管,管中装有两个铁质的弹性簧片电板,还灌有一种叫金属的惰性气体。平时,玻璃管中的两个簧片是分开的。

  • 当有磁性物质靠近玻璃管时,在磁场磁力线的作用下,管内的两个簧片被磁化而互相吸引接触,簧片就会吸合在一起,使结点所接的电路连通。
  • 外磁力消失后,两个簧片由于本身的弹性而分开,线路也就断开了。
  • 因此,作为一种利用磁场信号来控制的线路开关器件,干簧管可以作为传感器用于计数、限位等等场景(在安防系统中主要用于门磁、窗磁的制作),同时还被广泛使用于各种通信设备中。
  • 在实际运用中,通常用磁铁控制这两根金属片的接通与否,所以又被称为“磁控管”

2.1电路图

电路图中​​Reed Switch(干簧管)​​部分,其实就是原理部分提到的密封玻璃管,内部有两个铁片

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

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

2.2接线图

类似这种通过一个传感器模块来控制双色LED的实验我们已经做过好几个了。它们的接线方式基本是一样的????

树莓派

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)

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

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

当接线完毕后,​​PWM-LED​​指示灯常亮

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

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

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

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;
}


更详细的函数解释,可以参考之前实验6~8的博客????​​专栏链接


3.1编译代码

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

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

3.1.1 GCC中-Wall指令的作用

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

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

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

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

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

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

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

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

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


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



3.2实验效果

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

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

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

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

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


结语

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


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


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