香橙派垃圾桶增加开关盖的功能
功能说明:语音模块控制摄像头负责拍照获得图片上传到阿里云平台进行对比,如果是干垃圾,湿垃圾,可回收垃圾,有害垃圾;语音模块将信息传给香橙派打开对应的垃圾桶;实现了语音打开垃圾桶
代码如下
main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<wiringPi.h>
#include "pwm.h"
#include "uartTool.h"
#include "garbage.h"
static int detect_process(const char * process_name) //判断进程是否在运行
{
int n = -1;
FILE *strm;
char buf[128]={0};
sprintf(buf,"ps -ax | grep %s|grep -v grep", process_name); //指令
if((strm = popen(buf, "r")) != NULL) //读取数据
{
if(fgets(buf, sizeof(buf), strm) != NULL) //获取pid
{
n = atoi(buf); //转换为数字
}
}
else
{
return -1;
}
pclose(strm);
return n;
}
int main(int argc,char* argv[])
{
int serial_fd=-1;
int len=0;
int ret=-1;
char* category=NULL;
unsigned char buffer[6]={0xAA,0x55,0x00,0x00,0x55,0xAA};
wiringPiSetup(); //初始化wiringPi库
garbage_init(); //初始化阿里云接口
ret=detect_process("mjpg_streamer"); //简称mjpg_streamer是否打开
if(-1==ret)
{
printf("detect process failed\n");
goto END;
}
serial_fd=myserialOpen(SERIAL_DEV,BAUD); //初始化串口
if(-1==serial_fd) //串口打开失败
{
printf("open serial failed\n");
goto END;
}
//进行垃圾分类识别
while(1)
{
len=serialGetstring(serial_fd,buffer); //获取串口的数据
if(len>0&&buffer[2]==0x46) //识别垃圾类型
{
buffer[2]=0x00; //对buffer[2]进行清空
system(WGET_CMD); //进行拍照
if(0==access(GARBAGE_FILE,F_OK)) //文件存在
{
category=garbage_category(category); //调用阿里云识别接口
if(strstr(category,"干垃圾")) //识别出干垃圾
{
buffer[2]=0x41;
}
else if(strstr(category,"湿垃圾")) //识别出湿垃圾
{
buffer[2]=0x42;
}
else if(strstr(category,"可回收垃圾")) //识别出可回收垃圾
{
buffer[2]=0x43;
}
else if(strstr(category,"有害垃圾")) //识别出有害垃圾
{
buffer[2]=0x44;
}
else //无法识别
{
buffer[2]=0x45;
}
}
else //无法识别
{
buffer[2]=0x45;
}
serialSendstring(serial_fd,buffer,6); //将识别的垃圾类型回传给语音模块
if(buffer[2]==0x43)
{
pwm_write(PWM_RECOVERALE_GARBAGE); //开盖
delay(5000);//开盖5s
pwm_stop(PWM_RECOVERALE_GARBAGE);//关盖
}
else if(buffer[2]==0x41)
{
pwm_write(PWM_GARBAGE); //开盖
delay(5000);//开盖5s
pwm_stop(PWM_GARBAGE);//关盖
}
else if(buffer[2]==0x42)
{
pwm_write(PWM_WET_GARBAGE); //开盖
delay(5000);//开盖5s
pwm_stop(PWM_WET_GARBAGE);//关盖
}
else if(buffer[2]==0x44)
{
pwm_write(PWM_HARMFUL_GARBAGE); //开盖
delay(5000);//开盖5s
pwm_stop(PWM_HARMFUL_GARBAGE);//关盖
}
buffer[2]=0x00;//清空是为了下一次识别
remove(GARBAGE_FILE); //清理缓存
}
}
close(serial_fd);
END:
garbage_final(); //释放python解析器
return 0;
}
pwm.c
#include<wiringPi.h>
#include<softPwm.h>
/*根据公式:PWMfreq = 1 x 10^6 / (100 x range) ,要得到PWM频率为50Hz,则range为200,即
周期分为200步,控制精度相比硬件PWM较低。*/
void pwm_write(int pwm_pin)
{
pinMode(pwm_pin,OUTPUT);
softPwmCreate(pwm_pin,0,200); //range设置周期分为200步,周期20ms
softPwmWrite(pwm_pin,10); //1ms 45度
delay(1000);
softPwmStop(pwm_pin); //在45度位置固定住
}
void pwm_stop(int pwm_pin)
{
pinMode(pwm_pin,OUTPUT);
softPwmCreate(pwm_pin,0,200); //range设置周期分为200步,周期20ms
softPwmWrite(pwm_pin,5); //1ms,45度
delay(1000);
softPwmStop(pwm_pin);
}
pwm.h
#ifndef _PWM_H
#define _PWM_H
#define PWM_GARBAGE 7 //干垃圾
#define PWM_WET_GARBAGE 8 //湿垃圾
#define PWM_RECOVERALE_GARBAGE 5 //可回收垃圾
#define PWM_HARMFUL_GARBAGE 11 //有害垃圾
void pwm_write(int pwm_pin);
void pwm_stop(int pwm_pin);
#endif
编译指令
gcc -o test *c *.h -I /usr/include/python3.10/ -l python3.10 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt
然后
sudo -E ./test
sudo——初始化wiringPi时,打开串口需要sudo权限
-E-------保留当前用户环境变量