本次我们使用到了STM32F103C8T6最小系统板作为我们的主控板,通过接收到SW-180 1P震动传感器的电平信号,进而来控制继电器的打开实现开灯。
1.首先是继电器,在图中我们可以看见有VCC,GND,IN三个引脚,它们分别对应的接线是电源 ,地和我们所设置的信号触发端(在本例程中为PA1引脚)。在引脚的另一端分别有NO,COM和NC端,它们分别对应了常开端,公共端和常闭端。在继电器中有两个灯,红色的为电源灯即供电即亮,绿色的为开关灯,IN口为低电平触发,即IN口接收到低电平,开关灯亮且开关跳转,COM端与NO端相连。在本次我们LED灯的正极连接在继电器的NO端(常开端),负极接在板子的GND上。继电器的COM端接在板子的VCC(3.3V或5V)。
下面是继电器GPIO口的配置
#include "relay.h"
#include "stm32f10x.h"
void Relay_Init(void)
{
GPIO_InitTypeDef Relay_init;
//1.使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//2.PA3结构体配置
Relay_init.GPIO_Mode=GPIO_Mode_Out_PP;
Relay_init.GPIO_Pin=GPIO_Pin_3;
Relay_init.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &Relay_init );
}
2,接下来是 SW-180 1P震动传感器。图中对应的震动传感器分别有4个引脚分别是VCC,GND,DO和AO引脚,分别对应的是电源端,地,数字量信号输出端,AO在本传感器无效。 震动传感器中有PWR-LED灯对应电源灯,DO-LED灯对应开关信号指示灯。其中DO接在我们设置的引脚(PA1)。
接下来是震动传感器的结构体配置 。
#include "shake.h"
#include "stm32f10x.h"
void Shake_Init(void)
{
GPIO_InitTypeDef shake_init;
//1.打开GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//2.配置GPIOA
shake_init.GPIO_Mode=GPIO_Mode_IPD;
shake_init.GPIO_Pin=GPIO_Pin_1;
shake_init.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &shake_init);
}
3.最后是main函数。其中使用到了一个GPIO_ReadInputDataBit来读取震动传感器的信号输出进行判断。
#include "stm32f10x.h"
#include "main.h"
#include "relay.h"
#include "shake.h"
void delay(uint16_t time)
{
uint16_t i=0;
while(time--)
{
i=12000;
while(i--);
}
}
int main()
{
Relay_Init();
Shake_Init();
GPIO_SetBits(GPIOA,GPIO_Pin_3); //初始化继电器为关闭状态
while(1)
{
if( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0) //判断是否发生振动
{
GPIO_ResetBits(GPIOA,GPIO_Pin_3); //开灯
delay(1000); //持续一秒
GPIO_SetBits(GPIOA,GPIO_Pin_3); //关灯
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_3);
}
}
}
最后我们就可以通过震动传感器来控制LED灯点亮了 。