简易接线图:

解决思路:
振动传感器震动被STM32接收到,然后STM32再控制继电器闭合,随后与继电器连接的LED便会打开,反之亦然。
代码实现:
震动传感器:
shake.h
#ifndef SHAKE_H_
#define SHAKE_H_
void Shake_Init(void);
#endif
shake.c
#include "stm32f10x.h"
#include "shake.h"
void Shake_Init(void)
{
GPIO_InitTypeDef shake_initstruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//ʱÖӵijõʼ>>¯
shake_initstruct.GPIO_Mode=GPIO_Mode_IPU;
shake_initstruct.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOA, &shake_initstruct);
}
继电器:
relay.h
#ifndef RELAY_H_
#define RELAY_H_
void Relay_Init(void);
#endif
relay.c
#include "relay.h"
#include "stm32f10x.h"
void Relay_Init(void)
{
GPIO_InitTypeDef Relay_initstruct;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
Relay_initstruct.GPIO_Pin = GPIO_Pin_1;
Relay_initstruct.GPIO_Speed = GPIO_Speed_10MHz;
Relay_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &Relay_initstruct );
}
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "shake.h"
void delay(uint16_t time)
{
uint16_t i=0;
while(time--)
{
i =12000;
while(i--);
}
}
int main()
{
LED_Init();
Shake_Init();
GPIO_SetBits( GPIOA, GPIO_Pin_1);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0) //检测震动(震动显示低电平)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
delay(1000);
GPIO_SetBits( GPIOA, GPIO_Pin_1);
delay(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
delay(1000);
GPIO_SetBits( GPIOA, GPIO_Pin_1);
delay(1000);
}
else //未振动为高电平
{
GPIO_SetBits( GPIOA, GPIO_Pin_1);
}
}
}
实现结果:
若出现震动继电器闭合打开两次,使得灯闪烁两次。
个人积累:
振动传感器震动输出低电平
继电器闭合需要低电平