无封装
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define DOOR1 "/home/pi/1.txt"
#define DOOR2 "/home/pi/2.txt"
#define DOOR3 "/home/pi/3.txt"
#define DOOR4 "/home/pi/4.txt"
#define DEVICE_ADDR 0X10
#define RELAY1 0x01
#define RELAY2 0x02
#define RELAY3 0x03
#define RELAY4 0x04
#define ON 0XFF
#define OFF 0X00
int main() //获取门的名字并删除对应文档
{
int door;
int fd;
while(1)
{
if((access(DOOR1,F_OK))!=-1)
{
printf("door = 1\n");
remove(DOOR1);
fd = wiringPiI2CSetup(DEVICE_ADDR);
wiringPiI2CWriteReg8(fd,1,ON); //
sleep(1); //延时1s
wiringPiI2CWriteReg8(fd,1,OFF);
}
if((access(DOOR2,F_OK))!=-1)
{
printf("door = 2\n");
remove(DOOR2);
fd = wiringPiI2CSetup(DEVICE_ADDR);
wiringPiI2CWriteReg8(fd,2,ON); //
sleep(1); //延时1s
wiringPiI2CWriteReg8(fd,2,OFF);
}
if((access(DOOR3,F_OK))!=-1)
{
printf("door = 3\n");
remove(DOOR3);
fd = wiringPiI2CSetup(DEVICE_ADDR);
wiringPiI2CWriteReg8(fd,3,ON); //
sleep(1); //延时1s
wiringPiI2CWriteReg8(fd,3,OFF);
}
if((access(DOOR4,F_OK))!=-1)
{
printf("door = 4\n");
remove(DOOR4);
fd = wiringPiI2CSetup(DEVICE_ADDR);
wiringPiI2CWriteReg8(fd,4,ON); //
sleep(1); //延时1s
wiringPiI2CWriteReg8(fd,4,OFF);
}
}
return 0;
}
封装
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define DOOR1 "/home/pi/1.txt"
#define DOOR2 "/home/pi/2.txt"
#define DOOR3 "/home/pi/3.txt"
#define DOOR4 "/home/pi/4.txt"
#define DEVICE_ADDR 0X10
#define RELAY1 0x01
#define RELAY2 0x02
#define RELAY3 0x03
#define RELAY4 0x04
#define ON 0XFF
#define OFF 0X00
int doorname() //获取门的名字并删除对应文档
{
int door_name;
if((access(DOOR1,F_OK))!=-1)
{
door_name = 1;
printf("door = %d\n",door_name);
remove(DOOR1);
}
if((access(DOOR2,F_OK))!=-1)
{
door_name = 2;
printf("door = %d\n",door_name);
remove(DOOR2);
}
if((access(DOOR3,F_OK))!=-1)
{
door_name = 3;
printf("door = %d\n",door_name);
remove(DOOR3);
}
if((access(DOOR4,F_OK))!=-1)
{
door_name = 4;
printf("door = %d\n",door_name);
remove(DOOR4);
}
return door_name;
}
void opendoor(int name) //打开指定的门
{
int fd;
if(name == 1||name == 2||name == 3||name == 4)
{
fd = wiringPiI2CSetup(DEVICE_ADDR);
wiringPiI2CWriteReg8(fd,name,ON); //
sleep(1); //延时1s
wiringPiI2CWriteReg8(fd,name,OFF);
}
}
int main()
{
int i ;
while(1)
{
int door = doorname(); //获取门的名字
opendoor(door); //打开指定门
}
return 0;
}
编译
gcc door.c -lwiringPi -o door
执行
./door
设置开机自启动
执行sudo vim /etc/rc.local
命令编辑rc.local文件,
在exit 0 上面一行添加语句/home/pi/Auto_Start_Demo.py &
,表示运行Auto_Start_Demo.py文件(在文件代码中已经指定了用python运行),而& 符号可以简单理解为让程序运行在后台。
尝试了多次,发现该方法并不能保证成功,用reboot 重启的话成功率还高点,断点重启的话基本都不行。此外,成功的时候如果输入ps -ef | grep Auto_Start
来查看进程情况,发现竟然有两个一样的进程
sudo cp ./rc.local /etc/init.d