| | |
| | | * Filename: infrared.c |
| | | * Description: This file |
| | | * |
| | | * pi@raspberrypi:~ $ gpio readall #show BCM and wPi pinmap |
| | | * |
| | | * PIN #PIN BCM wPi |
| | | * VCC(left) ---- 2 ---- 5v ---- 5v |
| | | * I/O(indoor) ---- 16 ---- 23 ---- 4 |
| | | * I/O(hallway) ---- 18 ---- 24 ---- 5 |
| | | * GND(right) ---- 34 ---- 0v ---- 0v |
| | | * |
| | | * Version: 1.0.0(30/01/19) |
| | | * Author: Guo Wenxue <guowenxue@gmail.com> |
| | | * ChangeLog: 1, Release initial version on "30/01/19 03:37:16" |
| | |
| | | |
| | | #include <stdio.h> |
| | | #include <unistd.h> |
| | | #include <errno.h> |
| | | #include <string.h> |
| | | |
| | | //#define CONFIG_USE_WIRINGPI |
| | | |
| | | #ifdef CONFIG_USE_WIRINGPI |
| | | |
| | | #include <wiringPi.h> |
| | | |
| | | /* I/O Pin connected to PIN#16, BCM code pin number is 23 and wPi pin number is 4 */ |
| | | #define INFRARED_PIN 4 |
| | | //#define INFRARED_PIN 5 |
| | | |
| | | int main (int argc, char **argv) |
| | | { |
| | |
| | | sleep(1); |
| | | } |
| | | |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | #else |
| | | |
| | | #include <gpiod.h> |
| | | |
| | | #define INFRARED_PIN 23 |
| | | //#define INFRARED_PIN 24 |
| | | |
| | | int main (int argc, char **argv) |
| | | { |
| | | struct gpiod_chip* chip; |
| | | struct gpiod_line* line; |
| | | int rv = 0; |
| | | struct gpiod_line_event event; |
| | | |
| | | chip = gpiod_chip_open_by_name("gpiochip0"); |
| | | if( !chip ) |
| | | { |
| | | printf("gpiod open chip failure, maybe you need running as root\n"); |
| | | return 1; |
| | | } |
| | | |
| | | line = gpiod_chip_get_line(chip, INFRARED_PIN); |
| | | if( !line ) |
| | | { |
| | | printf("gpiod get line[%d] failure\n", INFRARED_PIN); |
| | | rv = 2; |
| | | goto cleanup; |
| | | } |
| | | |
| | | |
| | | //if( gpiod_line_request_rising_edge_events(line, "infrared") < 0 ) |
| | | if( gpiod_line_request_falling_edge_events(line, "infrared") < 0 ) |
| | | { |
| | | printf("gpiod request rising edge event failure: %s\n", strerror(errno)); |
| | | rv = 3; |
| | | goto cleanup; |
| | | } |
| | | |
| | | while(1) |
| | | { |
| | | /* This function will block, must call it to setup */ |
| | | printf("Start gpiod_line_event_wait...\n"); |
| | | if( gpiod_line_event_wait(line, NULL) < 0 ) |
| | | { |
| | | printf("gpiod line wait event failure!\n"); |
| | | } |
| | | |
| | | /* This function will block, must read to clear the event */ |
| | | printf("Start gpiod_line_event_read...\n"); |
| | | if (gpiod_line_event_read(line, &event) < 0) |
| | | { |
| | | printf("gpiod line wait event failure!\n"); |
| | | } |
| | | |
| | | if (event.event_type == GPIOD_LINE_EVENT_RISING_EDGE) |
| | | { |
| | | printf("Infrared monitor: Someone is closing!\n"); |
| | | } |
| | | } |
| | | |
| | | cleanup: |
| | | gpiod_chip_close(chip); |
| | | return rv; |
| | | } |
| | | |
| | | |
| | | #endif |