香橙派垃圾桶增加开关盖的功能

这篇文章介绍了使用语音控制和阿里云识别技术的智能垃圾桶系统,通过摄像头拍照上传识别垃圾类型,进而控制对应的垃圾桶盖开启,实现干垃圾、湿垃圾、可回收垃圾和有害垃圾的分类投放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

香橙派垃圾桶增加开关盖的功能

功能说明:语音模块控制摄像头负责拍照获得图片上传到阿里云平台进行对比,如果是干垃圾,湿垃圾,可回收垃圾,有害垃圾;语音模块将信息传给香橙派打开对应的垃圾桶;实现了语音打开垃圾桶

代码如下

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-------保留当前用户环境变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值