#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <poll.h>#define MSG(args...) printf(args) //函数声明
static int gpio_export(int pin);
static int gpio_unexport(int pin);
static int gpio_direction(int pin, int dir);
static int gpio_write(int pin, int value);
static int gpio_read(int pin);static int gpio_export(int pin)
{  char buffer[64];  int len;  int fd;  fd = open("/sys/class/gpio/export", O_WRONLY);  if (fd < 0) {  MSG("Failed to open export for writing!\n");  return(-1);  }  len = snprintf(buffer, sizeof(buffer), "%d", pin);  if (write(fd, buffer, len) < 0) {  MSG("Failed to export gpio!");  return -1;  }   close(fd);  return 0;
}  static int gpio_unexport(int pin)
{  char buffer[64];  int len;  int fd;  fd = open("/sys/class/gpio/unexport", O_WRONLY);  if (fd < 0) {  MSG("Failed to open unexport for writing!\n");  return -1;  }  len = snprintf(buffer, sizeof(buffer), "%d", pin);  if (write(fd, buffer, len) < 0) {  MSG("Failed to unexport gpio!");  return -1;  }   close(fd);  return 0;
} //dir: 0-->IN, 1-->OUT
static int gpio_direction(int pin, int dir)
{  static const char dir_str[] = "in\0out";  char path[64];  int fd;  snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/direction", pin);  fd = open(path, O_WRONLY);  if (fd < 0) {  MSG("Failed to open gpio direction for writing!\n");  return -1;  }  if (write(fd, &dir_str[dir == 0 ? 0 : 3], dir == 0 ? 2 : 3) < 0) {  MSG("Failed to set direction!\n");  return -1;  }  close(fd);  return 0;
}  //value: 0-->LOW, 1-->HIGH
static int gpio_write(int pin, int value)
{  static const char values_str[] = "01";  char path[64];  int fd;  snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin);  fd = open(path, O_WRONLY);  if (fd < 0) {  MSG("Failed to open gpio value for writing!\n");  return -1;  }  if (write(fd, &values_str[value == 0 ? 0 : 1], 1) < 0) {  MSG("Failed to write value!\n");  return -1;  }  close(fd);  return 0;
}static int gpio_read(int pin)
{  char path[64];  char value_str[3];  int fd;  snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin);  fd = open(path, O_RDONLY);  if (fd < 0) {  MSG("Failed to open gpio value for reading!\n");  return -1;  }  if (read(fd, value_str, 3) < 0) {  MSG("Failed to read value!\n");  return -1;  }  close(fd);  return (atoi(value_str));
}  // none表示引脚为输入,不是中断引脚
// rising表示引脚为中断输入,上升沿触发
// falling表示引脚为中断输入,下降沿触发
// both表示引脚为中断输入,边沿触发
// 0-->none, 1-->rising, 2-->falling, 3-->both
static int gpio_edge(int pin, int edge)
{
const char dir_str[] = "none\0rising\0falling\0both";
char ptr;
char path[64];  int fd;
switch(edge){
case 0:
ptr = 0;
break;
case 1:
ptr = 5;
break;
case 2:
ptr = 12;
break;
case 3:
ptr = 20;
break;
default:
ptr = 0;
}  snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/edge", pin);  fd = open(path, O_WRONLY);  if (fd < 0) {  MSG("Failed to open gpio edge for writing!\n");  return -1;  }  if (write(fd, &dir_str[ptr], strlen(&dir_str[ptr])) < 0) {  MSG("Failed to set edge!\n");  return -1;  }  close(fd);  return 0;
}//GPIO1_17
int main()
{
int gpio_fd, ret;
struct pollfd fds[1];
char buff[10];
unsigned char cnt = 0;
//LED引脚初始化
gpio_export(115);
gpio_direction(115, 1);
gpio_write(115, 0);
//按键引脚初始化
gpio_export(49);
gpio_direction(49, 0);
gpio_edge(49,1);
gpio_fd = open("/sys/class/gpio/gpio49/value",O_RDONLY);
if(gpio_fd < 0){
MSG("Failed to open value!\n");
return -1;
}
fds[0].fd = gpio_fd;
fds[0].events  = POLLPRI;
ret = read(gpio_fd,buff,10);
if( ret == -1 )
MSG("read\n");
while(1){
ret = poll(fds,1,0);
if( ret == -1 )
MSG("poll\n");
if( fds[0].revents & POLLPRI){
ret = lseek(gpio_fd,0,SEEK_SET);
if( ret == -1 )
MSG("lseek\n");
ret = read(gpio_fd,buff,10);
if( ret == -1 )
MSG("read\n");
gpio_write(115, cnt++%2);
}
usleep(100000);
}
return 0;
}

gpio操作实现人体感应灯(一)相关推荐

  1. 单片机人体感应灯c语言,单片机光控人体感应灯案例.doc

    本科毕业论文(设计) 题目: 单片机光控人体感应灯 学院: 物理与电子科学学院 班级: 2010级电子三班 姓名: 许鋆 指导教师: 杨春花 职称: 教授 完成日期: 2014 年 5 月 26 日 ...

  2. 红外线人体感应灯arduino_第五章 自制一盏人体感应灯(人体红外传感器SR501)(Arduino边做边学:从点亮Led到物联网)...

    本系列文章为作者原创,未经作者书面同意,不得转载! 现在很多有老人的家庭都会在卫生间安装一种感应灯,当人进入卫生间时,灯就会发光,过一会儿就自动关闭了.这种灯比传统的声控灯要科学一下,尤其晚上,不会打 ...

  3. 和12岁小同志搞创客开发:手撕代码,做一款人体感应灯

    目录 1.传感器原理 2.代码实践 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/categ ...

  4. 微波感应模块电路图_关于人体感应灯,你不知道的“冷”知识

    早些年前,人体感应灯大多应用在小区楼道,公共洗手间等场所,"人来灯亮,人走灯灭",使他们在生活中极为常见. 近几年来,智能人体感应灯越来越多的应用到家庭生活中,给我们的生活带来很多 ...

  5. 【电路】自用人体感应灯(HC-SR501人体感应模块)

    文章目录 低成本人体感应灯 需求分析 器件清单 参数测量 HC-SR501人体感应模块 LED灯板 方案设计 思路简介 原理图 PCB设计 成品 低成本人体感应灯 需求分析 老旧小区地下室没有灯,找钥 ...

  6. 单片机人体感应灯c语言,红外人体感应灯单片机方案

    近来,红外人体感应灯受到了居家人们关注和喜爱.为此,英锐恩推出了一款低成本红外人体感应灯单片机方案.红外人体感应灯可应用于走廊.床边.楼梯.衣柜等地方,提供柔和照明作用.人来即亮,人走即灭,不受强光影 ...

  7. 基于51控制的人体感应灯

    文章目录 前言 1 背景 2 可实现功能 3 制作材料 4 设计电路 5 设计原理 5.1 原理一(人体感应) 5.2 原理二(距离感应) 5.3 原理三(灯的亮度调节) 6 程序设计 7 成品模型展 ...

  8. Arduino制作一个人体感应灯

    现在的很多家庭中都装有感应灯,人体感应灯比声控感应灯的优点是不会影响别人休息,安静. 接下来就是简单的制作过程. 1.需要的设备: 1.arduino Uno主控板一个: 2.人体红外传感器一个: 3 ...

  9. 红外感应灯和人体感应灯两者之间区别在哪?

    感应灯在生活中的应用很普遍,感应灯有很多种,其中较为常见的是红外感应灯和人体感应灯,那么这两者之间有什么区别呢? 1.性质区别: 人体感应灯是基于红外线技术的一种自动控制产品,当有人进入感应范围的时候 ...

最新文章

  1. ie和firefox操作table对象的异同
  2. 不要上手就学深度学习!超详细的人工智能专家路线图,GitHub数天获2.1k星
  3. 2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势
  4. 怎么撤销定时说说_已注册商标遇到撤三申请怎么办
  5. jetbrains ide连接服务器上的docker
  6. Mysql执行计划2
  7. 用c语言覆盖前一个字符的值,C/C++笔试题
  8. npoi 未将对象引用设置到对象的实例_带你探索JVM的对象
  9. 复合存储引擎的设计和实现(包含ORM和内容存储)
  10. 最详细的SAI笔刷设置教程,非常全面详细!
  11. 顺网服务器ip修改工具,一键更换IP工具,修改IP地址 — 活动撸羊毛必备
  12. socket里sendto()函数
  13. confluence挖矿病毒(kdevtmpfsi 、solrd)解决
  14. [图形学] 实时体积云(Horizon: Zero Dawn)
  15. QT应用编程: 获取系统当前时间以及1970到现在的总秒数
  16. 在linux中 要删除abc目录,在Linux中,要删除abc目录及其全部内容的命令为()A.rmabcB.rm-rabcC.rmdirabcD.rmdir-rabc...
  17. js image对象
  18. Opencv 统计灰度图所有灰度值
  19. python中的与或非详解
  20. 罗兰贝格 | 适者生存:VUCA的世界

热门文章

  1. 爬虫学的好,牢饭吃得好(爬虫实例)
  2. 朱xx 现在开始有点不知道正义的一方是哪边了
  3. java采用匈牙利命名法_【Java】工具类,如何将匈牙利命名法转换成驼峰命名法-Go语言中文社区...
  4. 支付宝(蚂蚁)开放平台压力测试经验
  5. [译] 项目什么时候需要 React 框架呢?
  6. Linux-Apache服务器常规设置——用户个人主页
  7. 苹果手机怎么发语音短信?
  8. 《软技能,代码之外的生存指南》--教你如何当一名程序员
  9. 【Android系列1.0 驱动开发 --- Linux 驱动 内核】
  10. 公司建网站多少钱?【网站多少钱】