浴室灯代码实现和测试
1.首先编写一个测试demo,测试一下继电器是否能正常工作
#include <wiringPi.h>
#include <stdio.h>
#define LED1 21
#define LED2 22
#define LED3 23
#define LED5 24
int main()
{
int cmd;
if(wiringPiSetup()){
return -1;
}
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(LED4,OUTPUT);
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
digitalWrite(LED4,HIGH);
while(1){
scanf("%d",&cmd);
switch(cmd){
case 1:
digitalWrite(LED1,LOW);
break;
case 10:
digitalWrite(LED1,HIGH);
break;
case 2:
digitalWrite(LED2,LOW);
break;
case 20:
digitalWrite(LED2,HIGH);
break;
case 3:
digitalWrite(LED3,LOW);
break;
case 30:
digitalWrite(LED3,HIGH);
break;
case 4:
digitalWrite(LED4,LOW);
break;
case 40:
digitalWrite(LED4,HIGH);
break;
}
cmd = 0;
}
return 0;
}
这里测试一切正常,编译的时候记得加 -wiringPi
2.修改controlDevices.h:
加入pinNum,同时给开、关、初始化三个函数传入引脚参数
#include <wiringPi.h>
#include <stdlib.h>
struct Devices
{
char deviceName[128]; //设备名称
int status; //设备状态
int pinNum; //引脚
//设备的开、关、初始化
int (*open)(int pinNum);
int (*close)(int pinNum);
int (*deviceInit)(int pinNum);
//如果是火灾的话需要读取状态
int (*readStatus)();
int (*changeStatus)(int status);
//指向下一个设备
struct Devices *next;
};
3.修改bathroomLight.c的具体细节
#include "controlDevices.h"
int bathroomLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW);
}
int bathroomLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH);
}
int bathroomLightInit(int pinNum)
{
pinMode(pinNum,OUTPUT);
digitalWrite(pinNum,HIGH);
}
int bathroomLightStatus(int status)
{
}
struct Devices bathroomLight = {
.deviceName = "bathroomLight",
.pinNum = 22,
.open = bathroomLightOpen,
.close = bathroomLightClose,
.deviceInit = bathroomLightInit,
.changeStatus = bathroomLightStatus
}
struct Devices* addBathroomLightToDeviceLink(struct Devices *phead)
{
if(phead == NULL){
return &bathroomLight;
}else{
bathroomLight.next = phead;
phead = &bathroomLight;
return phead;
}
}
4.最后在mainPro.c中编写测试程序
#include <stdio.h>
#include <string.h>
#include "controlDevices.h"
struct Devices* findDeviceByName(char* name, struct Devices *phead)
{
struct Devices *tmp = phead;
if (phead == NULL){
return NULL;
}else{
while (tmp != NULL){
if(strcmp(name,tmp->deviceName) == 0){
return tmp;
}
tmp = tmp->next;
}
return NULL;
}
}
int main()
{
char *name = "bathroomLight";
if(wiringPiSetup() == -1){
return -1;
}
struct Devices* pdeviceHead = NULL;
pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead);
struct Devices* tmp = findDeviceByName(name,pdeviceHead);
if(tmp != NULL){
tmp->deviceInit(tmp->pinNum);
tmp->open(tmp->pinNum);
}
//1.指令工厂初始化
//2.设备控制工厂初始化
//3.线程池建立
// 3.1语音线程
// 3.2socket线程
// 3.3摄像头线程
// 3.4火灾线程
return 0;
}
代码写完后全部拷贝到树莓派中进行编译
gcc mainPro.c bathroomLight.c -lwiringPi
./a.out
此时可以看到22号pin灯亮了
运行一下gpio readall
看一眼22号pin的值
可以看到电位变成0了