- 1、理论介绍
- 2、案例介绍
- 2.1、GPIO控制继电器
- 2.2、GPIO控制超声波
- 2.3、GPIO控制继电器 + 超声波
GPIO是MCU常用的外设接口,主要有两种模式,一种是输入模式,用于检测外部信号的高低电平,例如传感器。另一种是输出模式,用于输出高低电平以用于控制外围电路,例如蜂鸣器,继电器。
2、案例介绍 2.1、GPIO控制继电器#include2.2、GPIO控制超声波#include #define RELAY_GPIO_NUM1 29 #define RELAY_GPIO_NUM2 28 #define RELAY_GPIO_NUM3 27 #define RELAY_GPIO_NUM4 26 void GpioInit(void) { pinMode(RELAY_GPIO_NUM1, OUTPUT); pinMode(RELAY_GPIO_NUM2, OUTPUT); pinMode(RELAY_GPIO_NUM3, OUTPUT); pinMode(RELAY_GPIO_NUM4, OUTPUT); } int main() { int cmd, relay_num = 0; if(wiringPiSetup() == -1) { printf("gpio init failn"); return -1; } GpioInit(); while(1) { printf("please input gpio_num and cmd:"); scanf("%d%d", &relay_num, &cmd); digitalWrite(30 - relay_num, !cmd); } return 0; }
#include2.3、GPIO控制继电器 + 超声波#include #include #define ECHO_GPIO_NUM 4 #define TRIGGER_GPIO_NUM 5 void UltraInit(void) { pinMode(TRIGGER_GPIO_NUM, OUTPUT); pinMode(ECHO_GPIO_NUM, INPUT); } float UltraMeasure(void) { struct timeval tv_begin, tv_end; float dis = 0; long start = 0, end = 0; digitalWrite(TRIGGER_GPIO_NUM, LOW); delayMicroseconds(3); digitalWrite(TRIGGER_GPIO_NUM,HIGH); delayMicroseconds(10); digitalWrite(TRIGGER_GPIO_NUM, LOW); while(digitalRead(ECHO_GPIO_NUM) == 0); gettimeofday(&tv_begin, NULL); while(digitalRead(ECHO_GPIO_NUM) == 1); gettimeofday(&tv_end, NULL); start = tv_begin.tv_sec * 1000000 + tv_begin.tv_usec; end = tv_end.tv_sec * 1000000 + tv_end.tv_usec; dis = (float)(end - start) / 1000000 * 34000 / 2; return dis; } int main() { float dis = 0; if(wiringPiSetup() == -1) { printf("gpio init failn"); return -1; } UltraInit(); while(1) { dis = UltraMeasure(); printf("dis = %0.2fn", dis); delay(1000); } return 0; }
#include#include #include #define ECHO_GPIO_NUM 4 #define TRIGGER_GPIO_NUM 5 #define RELAY_GPIO_NUM1 29 #define RELAY_GPIO_NUM2 28 #define RELAY_GPIO_NUM3 27 #define RELAY_GPIO_NUM4 26 #define RELAY_ON_CMD LOW #define RELAY_OFF_CMD HIGH void UltraInit(void) { pinMode(TRIGGER_GPIO_NUM, OUTPUT); pinMode(ECHO_GPIO_NUM, INPUT); } void RelayInit(void) { pinMode(RELAY_GPIO_NUM1, OUTPUT); pinMode(RELAY_GPIO_NUM2, OUTPUT); pinMode(RELAY_GPIO_NUM3, OUTPUT); pinMode(RELAY_GPIO_NUM4, OUTPUT); } void RelayControl(float first_dis, float cur_dis) { int cmd = 0; int relay_num = 0; if (cur_dis < 5) { return ; } if (cur_dis > first_dis) { cmd = RELAY_ON_CMD; } else { cmd = RELAY_OFF_CMD; } relay_num = cur_dis / 5; digitalWrite(30 - relay_num, cmd); } float UltraMeasure(void) { struct timeval tv_begin, tv_end; float dis = 0; long start = 0, end = 0; digitalWrite(TRIGGER_GPIO_NUM, LOW); delayMicroseconds(3); digitalWrite(TRIGGER_GPIO_NUM,HIGH); delayMicroseconds(10); digitalWrite(TRIGGER_GPIO_NUM, LOW); while(digitalRead(ECHO_GPIO_NUM) == 0); gettimeofday(&tv_begin, NULL); while(digitalRead(ECHO_GPIO_NUM) == 1); gettimeofday(&tv_end, NULL); start = tv_begin.tv_sec * 1000000 + tv_begin.tv_usec; end = tv_end.tv_sec * 1000000 + tv_end.tv_usec; dis = (float)(end - start) / 1000000 * 34000 / 2; return dis; } int main() { float first_dis, cur_dis = 0; if(wiringPiSetup() == -1) { printf("gpio init failn"); return -1; } UltraInit(); RelayInit(); while(1) { cur_dis = UltraMeasure(); RelayControl(first_dis, cur_dis); if (cur_dis != first_dis) { first_dis = cur_dis; } printf("cur_dis = %0.2fn", cur_dis); delay(1000); } return 0; }
显示效果:
树莓派继电器 + 超声波-演示视频



