原理图
蜂鸣器
示例代码
#include <stdio.h>
#include <wiringPi.h>
#include <unistd.h>
#define BEEP 0 //26pin
int main (void)
{
wiringPiSetup();//初始化wiringPi库
pinMode(BEEP, OUTPUT) ;//设置IO口输出输入模式:输出模式
while(1){
sleep(1);
digitalWrite(BEEP, HIGH);//设置相应的IP输出为高电平
sleep(1);
digitalWrite(BEEP, LOW); // On
}
return 0;
}
超声波测距
检测间隔时间示例代码
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
//int gettimeofday ( struct timeval * tv , struct timezone * tz )
/*
struct timeval{
long tv_sec; //秒
long tv_usec; //微秒
};
*/
//延时
void cntTime()
{
int i,j;
for(i=0;i<100;++i)
for(j=0;j<100;++j);
}
int main()
{
struct timeval timeStart;
struct timeval timeStop;
gettimeofday(&timeStart,NULL);
cntTime();
gettimeofday(&timeStop,NULL);
long timeSub = (timeStop.tv_sec - timeStart.tv_sec)*1000000 + timeStop.tv_usec-timeStart.tv_usec;
printf("test time:%ldμ\n",timeSub);
return 0;
}
检测距离
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <wiringPi.h>
#include <stdlib.h>
#define Trig 0
#define Echo 1
#define Echo_value digitalRead(Echo)
//digitalRead
double getDistance()
{
double dis;
struct timeval timeStart;
struct timeval timeStop;
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
digitalWrite(Echo,LOW);
digitalWrite(Trig,LOW);
usleep(5);
digitalWrite(Trig,HIGH);
usleep(10);
digitalWrite(Trig,LOW);
while(!Echo_value);
gettimeofday(&timeStart,NULL);
while(Echo_value);
gettimeofday(&timeStop,NULL);
long time = (timeStop.tv_sec - timeStart.tv_sec)*1000000+timeStop.tv_usec-timeStart.tv_usec;
dis = (34/2)*time*0.001;
return dis;
}
int main()
{
if(wiringPiSetup() == -1){
fprintf(stderr,"%s","wiringPiSetup error");
exit(-1);
}
while(1){
printf("current dis=%lf",getDistance());
usleep(500000);
}
return 0;
}
SG90舵机
初探定时器,结合信号使用
- 一个进程只能创建一个定时器
setitimer(ITIMER_REAL,&timer,NULL)
:- 第一个参数which:表示指定的定时器类型,可取值为ITIMER_REAL、ITIMER_VIRTUAL和ITIMER_PROF中的一个。ITIMER_REAL代表真实时间定时器,ITIMER_VIRTUAL代表用户CPU时间定时器,ITIMER_PROF代表用户和系统CPU时间定时器。
- 第二个参数new_value:指向itimerval结构体的指针,用来设置新的定时器计时时间,其中it_interval字段表示定时器周期,it_value字段表示第一次定时器触发的时间。
- 第三个参数old_value:指向itimerval结构体的指针,用于存放上一次定时器设置的计时时间信息,如果不需要保存这个信息则传入NULL即可。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
static int i=0;
void signal_handler(int signal)
{
if(signal == SIGALRM){
if(i == 2000){
printf("hello\n");
i=0;
}
i++;
}
}
int main()
{
struct itimerval timer;
timer.it_interval.tv_usec=500;
timer.it_interval.tv_sec=0;
timer.it_value.tv_usec=0;
timer.it_value.tv_sec=1;
if(setitimer(ITIMER_REAL,&timer,NULL) == -1){
fprintf(stderr,"%s","setitimer() error");
exit(-1);
}
//注册信号
signal(SIGALRM,signal_handler);
while(1);
return 0;
}
sg90舵机示例
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <wiringPi.h>
#define SG90_Init pinMode(5,OUTPUT)
#define SG90_High digitalWrite(5,HIGH)
#define SG90_Low digitalWrite(5,LOW)
static int i=0;
int jd = 1;
void signal_handler(int signal)
{
if(signal == SIGALRM){
if(i<=jd){
SG90_High;
}else {
SG90_Low;
}
if(i == 40){
i=0;
}
i++;
}
}
int main()
{
if(wiringPiSetup() == -1){
fprintf(stderr,"%s","wiringPiSetup() error");
exit(-1);
}
SG90_Init;//初始化舵机口
struct itimerval timer;
timer.it_interval.tv_usec=500;
timer.it_interval.tv_sec=0;
timer.it_value.tv_usec=0;
timer.it_value.tv_sec=1;
if(setitimer(ITIMER_REAL,&timer,NULL) == -1){
fprintf(stderr,"%s","setitimer() error");
exit(-1);
}
//注册信号
signal(SIGALRM,signal_handler);
while(1){
printf("scanf new jd change SG90\n");
scanf("%d",&jd);
}
return 0;
}