基于树莓派上实现的智能垃圾桶

基于树莓派的智能清洁桶(C语言) 文章目录智能清洁桶硬件GPIO接口设置树莓派wiringPi常用的函数介绍 智能清洁桶硬件 硬件包括小车底盘套装(底盘、车轮、电机)、超声波探测模块(HC-SR04)、树莓派、OLED 屏幕(I2C 12832)、L9110S桥两路直流电机驱动板、DS18B20温度传感器、SG90舵机、垃圾桶 GPIO接口设置 树莓派wiringPi常用的函数介绍 在这里,我使用的是wiringPi编码,编译时... 阅读详情

基于树莓派上实现的智能垃圾桶

整体功能

垃圾桶分为移动模式和清洁桶模式,移动模式垃圾桶通过电机操作马达轮子进行移动,清洁桶模式则LED屏幕亮起,检测温度,自动拉起桶盖,整体通过远程利用客户端进行控制。

LED屏的实现

oled.c

#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>
#include "wd.h"
int fd;
unsigned char  yi[4][16]={
"                ",//第一行
"                ",//第二行
"                ",//第三行
"                " //第四行
};               //显示内容
const unsigned char zi[];
void initoled(void)//初始化
{
	wiringPiSetup();
        fd=wiringPiI2CSetup(0x3c);//i2c初始化 0x3c是oled的从机地址
        wiringPiI2CWriteReg8(fd,0x00,0xa1);//图像反了修改成0xa0
        wiringPiI2CWriteReg8(fd,0x00,0xc8);//行输出反了修改成0xc0
        wiringPiI2CWriteReg8(fd,0x00,0x8d);//允许电荷泵
        wiringPiI2CWriteReg8(fd,0x00,0x14);
        wiringPiI2CWriteReg8(fd,0x00,0xa6);//想反相显示改成0xa7
	wiringPiI2CWriteReg8(fd,0x00,0x21);//重置列地址
	wiringPiI2CWriteReg8(fd,0x00,0x00);
	wiringPiI2CWriteReg8(fd,0x00,0x7f);
    wiringPiI2CWriteReg8(fd,0x00,0xaf);//开显示
	
	 system("sudo modprobe w1-gpio");
	 system("sudo modprobe w1-therm");
}
void qingping(void)//清屏
{
	char zt1,zt2;
	for(zt1=0;zt1<8;zt1++)
	{
		wiringPiI2CWriteReg8(fd,0x00,0xb0+zt1);
	        for(zt2=0;zt2<128;zt2++) wiringPiI2CWriteReg8(fd,0x40,0x00);
	}
}
void ascii(void)//显示ASCII码8*16
{
	int zt;
        char zt3,zt4;
	for(zt3=0;zt3<4;zt3++)
        {
		wiringPiI2CWriteReg8(fd,0x00,0xb0+(zt3*2));
                for(zt4=0;zt4<16;zt4++)
			for(zt=0;zt<8;zt++)
                wiringPiI2CWriteReg8(fd,0x40,zi[yi[zt3][zt4]*16+zt]);
                wiringPiI2CWriteReg8(fd,0x00,0xb0+(zt3*2)+1);
                for(zt4=0;zt4<16;zt4++)
                	for(zt=0;zt<8;zt++)
                        	wiringPiI2CWriteReg8(fd,0x40,zi[yi[zt3][zt4]*16+zt+8]);
	}
}
void wendu(void)//调用温度函数
{
	float value;
	char buf[100];
	value=wd();
	gcvt(value, 5, buf);
	
    strcpy(yi[0],buf);
}

void shijian(void)//当前时间
{
    struct tm *ptr;
    time_t lt;
	FILE *f;
	char data[255];
    lt=time(&lt);
    ptr=localtime(&lt);
    strftime(yi[1],16,"%m/%d %a",ptr); //月/日 周几
	strftime(yi[2],16,"%R %p",ptr);//时:分 am或pm
	
	
}
void oled(void)
{
	while(1)
	{
		
		
		shijian();
		wendu();
		ascii();
		delay(100);
	}
	
}

这是利用SSD1306的0.91OLED模块通过以上代码实现显示在LED屏幕,温度函数这是利用DS18B20通过以下代码显示在LED屏
wd.c

#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>

float wd(void)
{
        char path[50] = "/sys/bus/w1/devices/";
        FILE *f;
        char rom[20];
        char buf[100];
        char cat[100];
        DIR *dirp;
        struct dirent *direntp;
        float value;
        char *get;
        get=malloc(sizeof(char));
        memset(cat,0,100);
        memset(buf,0,100);
        stpcpy(cat,"cat ");
        if((dirp = opendir(path)) == NULL)
        {
                printf("opendir error\n");
                exit(-1);
        }
        while((direntp = readdir(dirp)) != NULL)
        {
                if(strstr(direntp->d_name,"28-0"))
                {
                        strcpy(rom,direntp->d_name);
                }
        }
        closedir(dirp);
        strcat(path,rom);
        strcat(path,"/w1_slave");
        strcat(cat,path);
        if((f = popen(cat,"r")) < 0)
        {
                printf("open error\n");
                exit(-1);
        }
        fread(buf,1,100,f);
        get=strstr(buf,"t=");
        fclose(f);
        get++;
        get++;
        value = atof(get)/1000;
        return value;
}

电机

dj.c

#include <wiringPi.h>
#include <stdio.h>
int i;
void initdj()
{
        pinMode(22,OUTPUT);
        pinMode(23,OUTPUT);
        pinMode(24,OUTPUT);
        pinMode(25,OUTPUT);

        digitalWrite(22,LOW);
        digitalWrite(23,LOW);
        digitalWrite(24,LOW);
        digitalWrite(25,LOW);
}
void qian()
{
        digitalWrite(22,HIGH);
        digitalWrite(23,LOW);
        digitalWrite(24,HIGH);
        digitalWrite(25,LOW);
        while(1)
        {
                if(i==1)
                {
                        digitalWrite(22,LOW);
                        digitalWrite(23,LOW);
                        digitalWrite(24,LOW);
                        digitalWrite(25,LOW);
                        break;
                }
        }
}
void hou()
{
        digitalWrite(22,LOW);
        digitalWrite(23,HIGH);
        digitalWrite(24,LOW);
        digitalWrite(25,HIGH);
        delay(10000);
        digitalWrite(22,LOW);
        digitalWrite(23,LOW);
        digitalWrite(24,LOW);
        digitalWrite(25,LOW);


}
void zhou
{
		  digitalWrite(22,LOW);
	      digitalWrite(23,HIGH);
	      delay(10000);
	      digitalWrite(22,LOW);
       	  digitalWrite(23,LOW);
}
void you 
{
		  digitalWrite(24,LOW);
	      digitalWrite(25,HIGH);
	      delay(10000);
	      digitalWrite(24,LOW);
       	  digitalWrite(25,LOW);
}

舵机

sg.c

#include <stdio.h>
#include <string.h>
#include <wiringPi.h>
#include <pthread.h>
extern int i;
extern int o;

void initsg()
{
        pinMode(1,PWM_OUTPUT);
        pwmSetMode(PWM_MODE_MS);
        pwmSetRange(2000);
        pwmSetClock(192);
}
void sg()
{
        while(1)
        {
                if(i==1)
                pwmWrite(1,100);
                else if(i==0)
                pwmWrite(1,200);
                if(o==0)
                pthread_exit((void*)0);
        }
}

客户端

#include <stdio.h>
#include  "log.h"
#include <unistd.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include "msg.h"
#include "util.h"


int get_cmd(char *buf)
{
	if (memcmp(buf,"yd",2)==0)
	{
	   	return 0;
	}
	else if (memcmp(buf,"qjt",3)==0)
	{
	   	return 1;
	}
	else if (memcmp(buf,"qian",4)==0)
	{
	   	return 2;
	}
	else if (memcmp(buf,"quit",4)==0)
	{
	   	return 4;
	}
	else if (memcmp(buf,"hou",3)==0)
	{
	   	return 3;
	}
	else 
	{
	   	return 5;

	}	

    
}



int main()
{
	int c_fd;
    enum FTP_CMD cmd;
    int	ret;
	struct sockaddr_in c_addr;
	int con;

	logcreate("./client.txt");

	struct Msg *msg_send;
	struct Msg *msg_recv;
	msg_send = (struct Msg *)malloc(sizeof(struct Msg));
    msg_recv = (struct Msg *)malloc(sizeof(struct Msg));
	c_fd=socket(AF_INET,SOCK_STREAM,0);
	if (c_fd==-1) 	
	{
		logwrite("perror connect: %s",c_fd);
		exit(-1);
	}

	c_addr.sin_family=AF_INET;
	c_addr.sin_port=htons(8989);
	inet_aton("192.168.43.60", &c_addr.sin_addr);



	con=connect(c_fd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr));
	if (con==-1)
	{
		logwrite("perror connect: %d",con);
		exit(-1);
	}

	struct password dl;
	printf("name:");
	scanf("%s",dl.name);
	printf("pass:");
	scanf("%s",dl.pass);
	logwrite("nmae:%s  pass%s\n",dl.name,dl.pass);
	ret=send2(c_fd,(char *)&dl,sizeof(struct password));
	logwrite("perror send: %d\n",ret);
	ret=recv(c_fd,&dl,sizeof(struct password),0);
	logwrite("perror recv: %d\n",ret);
	if (FTP_CMD_ERROR==dl.cmd)
	{
		printf("name or pass error\n");
		return -1;
	}
	while(1)
	{

		char buf[256];
		memset(msg_send,0,sizeof(struct Msg));
		memset(msg_recv,0,sizeof(struct Msg));
        // 等待用户输入
        fgets(buf,sizeof(buf),stdin);
        logwrite("get:%s",buf);
        // buf转为FTP_CMD
        cmd = get_cmd(buf);
        logwrite("cmd %d\n", cmd);		
		msg_send->cmd=cmd;		
		send2(c_fd,(char *)msg_send,sizeof(struct Msg));
		recv2(c_fd,(char *)msg_recv,sizeof(struct Msg));
		printf("%s\n",msg_recv->data);
		if (cmd==FTP_CMD_QUIT)
		{
			break;
		}
	}
	
	
	logout();
	close(c_fd);
	return 0;
}

服务端

#include <stdio.h>
#include "a.h"
#include "dj.h"
#include "oled.h"
#include "log.h"
#include "msg.h"
#include "util.h"
#include "sg.h"
#include <unistd.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <pthread.h>


int i=0;
int o=1;

void yd(int c_fd)//移动模式
{
	struct Msg *msg_send;
	struct Msg *msg_recv;
	msg_send = (struct Msg *)malloc(sizeof(struct Msg));
    msg_recv = (struct Msg *)malloc(sizeof(struct Msg));
    memset(msg_send,0,sizeof(struct Msg));
	memset(msg_recv,0,sizeof(struct Msg));
	strcpy(msg_send->data,"please output qian or hou or quit");
	send2(c_fd,(char *)msg_send,sizeof(struct Msg));
	while(1)
	{
		memset(msg_send,0,sizeof(struct Msg));
		memset(msg_recv,0,sizeof(struct Msg));
		recv2(c_fd,(char *)msg_recv,sizeof(struct Msg));
		if (msg_recv->cmd==2)
		{
			qian();
			send2(c_fd,(char *)msg_send,sizeof(struct Msg));
		}
		else if (msg_recv->cmd==3)
		{
			hou();
			send2(c_fd,(char *)msg_send,sizeof(struct Msg));
		}
		else if (msg_recv->cmd==4)
		{
			msg_recv->cmd=9;
			break;
		}
		else 
		{
			strcpy(msg_send->data,"please output qian or hou or quit");
			send2(c_fd,(char *)msg_send,sizeof(struct Msg));			
		}
	}

}

void qjt(int c_fd)//清洁桶模式
{	
	pthread_t thread1;
	pthread_t thread2;
	struct Msg *msg_send;
	struct Msg *msg_recv;
	msg_send = (struct Msg *)malloc(sizeof(struct Msg));
    msg_recv = (struct Msg *)malloc(sizeof(struct Msg));
    memset(msg_send,0,sizeof(struct Msg));
	memset(msg_recv,0,sizeof(struct Msg));
	strcpy(msg_send->data,"please output qian or hou or quit");
	send2(c_fd,(char *)msg_send,sizeof(struct Msg));
	pthread_create(&thread1,NULL,(void *)oled,NULL);
	pthread_create(&thread2,NULL,(void *)sg,NULL);
	while(1)
	{
		memset(msg_send,0,sizeof(struct Msg));
		memset(msg_recv,0,sizeof(struct Msg));
		printf("1111\n");
		recv2(c_fd,(char *)msg_recv,sizeof(struct Msg));
		printf("1111\n");
		if (msg_recv->cmd==FTP_CMD_QUIT)
		{
			msg_recv->cmd=9;
			o=0;
			break;
		}

	}
}

void chuli(struct Msg * get_cmd,int c_fd)
{

	switch(get_cmd->cmd)
	{
	case FTP_CMD_YD:
		yd(c_fd);
		break;
	case FTP_CMD_QJT:
		qjt(c_fd);
		break;
	default:
		break;		
	}
}


int main()
{
	int s_fd;
	int c_fd;
	int ret;
	int ret2;
	struct sockaddr_in s_addr;
	struct sockaddr_in c_addr;
	struct Msg *msg_send;
	struct Msg *msg_recv;
	msg_send = (struct Msg *)malloc(sizeof(struct Msg));
    msg_recv = (struct Msg *)malloc(sizeof(struct Msg));
    memset(msg_send,0,sizeof(struct Msg));
	memset(msg_recv,0,sizeof(struct Msg));
	pthread_t thread;
	
	logcreate("./server.txt");
	//1.socket
	s_fd=socket(AF_INET,SOCK_STREAM,0);
	if(s_fd==-1)
	{
		logwrite("perror bind: %s",s_fd);
		exit(-1);
	}
	int on=1;
	if((setsockopt(s_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)
	{
		perror("setsockopt failed");
		exit(EXIT_FAILURE);
	}
	//2.bind
	s_addr.sin_family=AF_INET;
	s_addr.sin_port=htons(8989);
	s_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	ret=bind(s_fd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr_in));
	if (ret==-1)
	{
		logwrite("perror bind: %s",ret);
		exit(-1);
	}
	//3.listen
	ret2=listen(s_fd,10);
	if (ret2==-1)
	{
		logwrite("perror listen: %s",ret2);
		exit(-1);
	}
	//4.accpet
	int len=sizeof(struct sockaddr);
	c_fd=accept(s_fd,(struct sockaddr*)&c_addr, (socklen_t *)&len);
		if (c_fd==-1)
		{
			logwrite("perror accpet: %s",c_fd);
			exit(-1);
		}
	struct  password *dl;
	dl=malloc(sizeof(struct  password ));
	char name[64];
	char passw[64];
	recv2(c_fd,(char *)dl,sizeof(struct password));
	printf("%s   %s\n",dl->name,dl->pass);
	dl->cmd=FTP_CMD_YD;
	logwrite("nmae:%s  pass%s\n",dl->name,dl->pass);
	FILE *fd=fopen("passw.txt","r");

	if (NULL!=fd)
	{
		fscanf(fd,"%s %s",name,passw);
		
		fclose(fd);
	}
	if (strcmp(name,dl->name)!=0||strcmp(passw,dl->pass)!=0)
	{
		dl->cmd=FTP_CMD_ERROR;
	}
	send2(c_fd,(char *)dl,sizeof(struct password));
	if (dl->cmd==FTP_CMD_ERROR)
	{
		exit(-1);
	}
	initoled();//初始化
	qingping();
	initcsb();
	initdj();
	initsg();
	pthread_create(&thread,NULL,(void *)csb,NULL);
	while(1)
	{
	
		memset(msg_send,0,sizeof(struct Msg));
		memset(msg_recv,0,sizeof(struct Msg));
		recv2(c_fd,(char *)msg_recv,sizeof(struct Msg));
		chuli(msg_recv,c_fd);
		strcpy(msg_send->data,"please output yd or qjt ");
		send2(c_fd,(char *)msg_send,sizeof(struct Msg));
		if (msg_recv->cmd==FTP_CMD_QUIT)
		{
			printf("client quit\n");
			logwrite("client quit\n");
			break;
		}

	}
	
	close(s_fd);
	logout();
	
	return 0;
}

整套程序通过用户登录服务端,服务端接收指令来对垃圾桶进行操作。

感想

这个项目做了三天,三天来最大的问题在与一开始对于每个模块的不熟悉,以及网上对这些模块资料的不多,大多数都是用python写的C的资料较少,必须通过更多的实验来了解这些模块,还有就是对于线程的一些不熟悉导致有些问题会不能迅速解决,但幸好有日志,可以通过日志迅速的了解问题出在哪,在改程序的时候省下了不少时间。

基于树莓派的智能垃圾桶 基于树莓派的智能垃圾桶项目 预计所需要实现的功能 通过感应能够实现垃圾桶盖子的自动开关。 垃圾桶上装载OLED屏,屏幕上需要显示,温度,时间。 远程控制通过电脑端实现控制垃圾桶的移动。 功能模块: 1树莓派3B开发板一块 2OLED显示屏一块 3超声波模块 4SG90舵机 5直流电机,轮子,电机驱动板 6清洁桶 程序代码: 服务端程序(写在树莓派上的) include <stdio.h&gt... 阅读详情

相关推荐

智能垃圾桶(十三)——ESP8266模块+onenet(TCP透传)(树莓派pico实现物联网)

ESP8266模块+onenet(TCP透传)(树莓派pico实现物联网)

河海大学研究生在读的学习笔记 2712

智能垃圾桶

搜了这个这么多3b+的资料,自己只是想解决如何下程序和运行程序的博客,网上搜集的资料全是讲如何通过SSH或者网线连接树莓派,通过直接连接屏幕的教程较少。RPi.GPIO库,系统默认也是安装的,原因是设置引脚编号方式为BCM,其引脚编号和第一张引脚图有明显差异,设置为另一种模式,运行出错,另外可以获取引脚模式并输出。应该按照下面的图连线。

无敌三脚猫的专栏 791

智能垃圾桶(十一)——oled的显示(树莓派pico实现)

智能垃圾桶(十一)——oled的显示(树莓派pico实现)

河海大学研究生在读的学习笔记 1120

树莓派控制的智能垃圾桶项目

技术不断的革新,对于生活的享受也越来越注重了。下面我们开始今天的主题。 项目用到的硬件: 树莓派3b HC-SRO4超声波模块 sg90舵机 ds18b20温度模块 oled模块 两个电机 l9110s桥两路直流电机驱动板 垃圾桶一个 项目总体步骤和规划: 架构: 树莓派(服务端) linux虚拟机(客户端) 功能设计: 1移动的功能: 通过虚拟机的指令来操控垃圾桶的移动 2 oled显示屏功能...

weixin_43664986的博客 1986

智能垃圾桶(九)——震动传感器(树莓派pico实现)

智能垃圾桶(九)——震动传感器(树莓派pico实现)

河海大学研究生在读的学习笔记 1563

智能垃圾桶(七)——SG90舵机的介绍与使用(树莓派pico实现)

SG90舵机的介绍与使用(树莓派pico实现)

河海大学研究生在读的学习笔记 9052

初学树莓派(制作简易智能清洁桶)

用树莓派制作一个智能清洁桶 功能需求: 避障小车模式 避障移动。 清洁桶模式 手伸过去,自动把盖子打开。 屏幕显示状态。 检测温湿度。 远程控制,tcpip发送控制命令。 功能模块: 树莓派主控 oled显示屏 超声波模块 温湿度传感器 SG90舵机 马达及轮子 清洁桶 架构: 远程控制服务端 树莓派 远程控制客户端 linux虚拟机 实践步骤: 编写一个服务端和客户端,使树...

weivvvvvv的博客 601

智能垃圾桶(四)——树莓派pico实现超声波测距(HC-SR04)

pico实现超声波模块

河海大学研究生在读的学习笔记 1904

基于树莓派4B与Paddle-Lite实现的智能垃圾桶项目

采用最新的图片分类模型PPLCNet,并在树莓派32位原生系统上,使用了最新的Paddle-Lite-v2.11进行本地编译,最终在Paddle-Lite-Demo-develop上部署成功

m0_63642362的博客 2013

基于pytorch+pyqt5实现树莓派4b的智能垃圾分类系统源码+项目说明.zip

文件组成 data_set文件夹 train文件夹 模型训练集 val文件夹 模型验证集 logs文件夹 用于存放程序运行时产生的日志,如果被删除了需要手动创建一个 photo文件夹 用于存放程序运行时拍摄的照片,如果被删除了需要手动创建一个 tools文件夹 model.py 本质上是mobilenet_v2,用于训练时调用 predict.py 测试模型用的程序 train.py 训练模型用的程序 weight文件夹 class_indices.json 训练模型时自动生成的词典 xxx.pth 训练好的模型 alarm.py 控制蜂鸣器的函数 getpic.py 拍摄训练图片用的程序 main.py 垃圾分拣流程,注意:单独运行这个文件没有UI motocontrol.py 控制舵机的函数

Python基于树莓派的垃圾分类识别代码,含垃圾分类数据集和tf代码,使用神经网络进行图像识别处理

基于树莓派的垃圾分类识别代码,含垃圾分类数据集和tf代码,使用神经网络进行图像识别处理。 神经网络搭建—python 依赖 tensorflow,keras。

在树莓派上实现垃圾桶的粗糙智能化

首先,我们的智能垃圾桶拥有以下几个功能 1、超声波模块:当超声波测算的距离在一定范围内驱动舵机 2、L9110S桥两路直流电机驱动板:实现上下左右的行走功能 3、DS18B20温度传感器:检测温度并显示在显示屏上 我们来实现超声波模块: #include<stdio.h> #include<wiringPi.h> #include<sys/time.h> #d...

qq_38637416的博客 579

使用树莓派实现实时的垃圾分类!.zip

使用树莓派实现实时的垃圾分类!

智能垃圾桶小车

舵机模块 舵机模块在智能垃圾桶中用于配合超声波模块开关垃圾桶的盖子,当超声波模块检测到有物体小于5cm的时候舵机会旋转90度,以达到打开盖子的目的。 舵机原理: 树莓派不能直接输出模拟电信号,但我们可以使用PWM(脉宽调制)方法来模拟这一点。我们制作一个固定频率的数字信号,在那里我们将改变脉冲宽度,将“转换”改为“平均”输出电压的电平,如下图所示: 请注意频率本身不是重点,而是“占空比”,即脉冲...

qq_37806665的博客 1847

华为MA5620配置宽带及语音实例

华为EPON配置实例1、公共部分和宽带PPPOE部分用串口用户名密码root/mduadminMA5620E>enableMA5620E#configMA5620E(config)#MA5620E(config)#sysnamebigcow/给设备起名字/****之前为公共部一、建vlan和地址bigcow(config)#vlan100...

weixin_33862041的博客 6345

Li‘s 核磁共振影像数据处理-4-使用3D Slicer从DTI计算参数图(FA、ADC等)

从DTI计算参数图 通过3D Slicer软件计算 主要步骤 导入DICOM影像 3D Slicer似乎只能支持DICOM格式和NRRD格式的DTI处理,而无法支持NIFTI+磁场梯度信息文件的方式。(这里不确定,如有错误请指正。) 模块选择: 需要选择或设置的内容包括:选择DicomToNrrd,设置Output DWI Volume file,设置Input Dicom Data Directory。设置好后点击“Apply”。 制作mask。 实质就是去脑壳。 模块选择: 需要设置的内

weixin_38594676的博客 3920

基于视觉与板球系统的智能垃圾桶

沈阳航空航天大学 创新能力训练报告 2019.12.29 题目 基于视觉与板球系统的智能垃圾桶设计 班 级 学 号 学 生 姓 名 刘一博 指 导 教 师 基于视觉与板球系统的智能垃圾桶 刘一博 沈阳航空航天大学自动化学院## 标题 1.立题意义 垃圾分类是垃圾处理流程中的基础环节,一直以来是各级政府倡导与推行的重要工作.但是由于配套设施的不完善与人们的垃圾分类意识与能力不足,该项工作进展成效并不理想,收集到的“分类垃圾”往往仍是混合垃圾,严重影响了垃圾分类的秩序[1]。

qq_43988614的博客 3687

鼎捷T100—二次开发:客制化联络对象维护作业 aooi350

鼎捷T100二次开发,客制化

weixin_52342654的博客 1132

树莓派4bwlan驱动_暴发户才玩乐高,富二代都强上树莓派!

如果你经常刷抖音,肯定看到过肯多乐高大佬的视频。乐高在咱们手里只是普通的积木,但在他们手里是洗衣机、打印机、滑梯……反正只有你想不到,没有乐高大佬做不到。一句话说就是乐高无所不能!很多小老弟怀疑只要零件足够,乐高大佬能实现载人航天。年轻了弟弟们!看似无所不能的乐高实际上有一个致命的缺点:只能实现机械传动。说白了乐高玩的再花,本质也就是用一个齿轮转动,带动另一个齿轮转动。核心科技停留在第二...

weixin_40006133的博客 404

数据仓库实践:从ITR流程讲指标体系建设

从 ITR 流程或者其他客服反馈流程的考核过程可见,实际工作中不可能只通过单个指标评价一个业务过程,需要从多个维度梳理业务,并把多个高度相关的指标组织起来,以避免只考虑其中某个指标从而摧毁整个业务过程的结果,指标体系=指标+体系。

the_singing_towers的博客 2265

C#上位机性能优化全攻略:彻底解决界面卡顿+多线程死锁+PLC数据延迟,产线实测稳定运行2年

一开始我们用的是网上找的零散优化代码,根本满足不了要求,后来花了2个月的时间,把之前27条产线的代码整理、重构、优化,做了一套这套方案上线后,连续稳定运行2年零3个月:界面响应时间稳定在50ms以内,多线程死锁率持续为0,PLC数据延迟稳定在150ms以内,系统可用率≥99.99%,帮客户一年省下了超过480万的停线损失、罚款损失和人工成本,客户第二年就把剩下的22条产线也全部交给我们做了,还介绍了3家同行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 293
上一篇: 在linux内实现FTP传输
ffdsafsd
博客等级 码龄7年 5粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值