10083-基于STM32的无线串口白酒自动摘酒系统设计(仿真+原理图+源代码工程+详细介绍说明书)
功能描述:
本次系统需要实现的要求综合如下:
酒精浓度的检测;
酒精浓度的显示;
不同浓度的酒实现自动摘酒;
尾酒报警;
资料摘要:
在白酒的蒸馏过程中需要将不同浓度的酒分离开,从而区分不同的品质的酒进行分离保存,在传统的蒸酒过程中是通过人工观察酒花的方式进行查看在摘酒。但是通过人工的方式摘酒会造成一个问题:不同工人对于酒花的观察能力不同会导致酒的浓度不一致,无法达到最佳的摘酒效果。所以,随着电子信息技术的发展,摘酒的工作将逐渐往自动化的方向发展。
本此设计基于单片机的白酒自动摘酒系统,通过使用STM32F103单片机为主控器;MQ-3酒精浓度传感器;PCF8591高精度模数转换器采集酒精浓度;LCD液晶显示器作为系统的显示单元;按键作为尾酒的报警阈值调节;蜂鸣器作为尾酒报警设备;继电器作为自动摘酒动作设备;串口通信监测摘酒的过程。通过对系统的电路设计、软件系统设计来保证系统的功能实现摘酒自动化。解决了传统“看花摘酒”导致的浓度不一的问题,提高摘酒质量。在设计中考虑到了系统的定位精度、稳定性、抗干扰能力等,保证设计是一个可以经历市场验证的控制系统。
资料包含:
1、详细设计说明书-12743字
2、仿真工程文件
3、原理图工程文件
4、源代码工程文件
5、仿真截图
6、流程图-visio
7、文献资料
#include "app_demo.h"
#include "SysTick.h"
#include "key.h"
#include "lcd1602.h"
#include "beep.h"
#include "ds18b20.h"
#include "pcf8591.h"
#include "usart.h"
#include "ADC.h"
uint32_t AD_Val;
uint8_t vals;
uint32_t AD;
//定义结构体
_sys_ctrl sys_ctrl;
//相关控制模块管脚定义
#define LED_0 PBout(10)//
#define LED_1 PBout(11)//
#define LED_2 PBout(12)//
#define LED_3 PBout(13)//
#define LED_4 PBout(14)//
void ctrl_pin_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
}
//区间映射
u8 cal_map(u8 x, u8 in_min, u8 in_max, u8 out_min, u8 out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
//参数初始化
void sys_parm_init(void)
{
sys_ctrl.mode=0;
sys_ctrl.temph=50;
sys_ctrl.voll=5;
sys_ctrl.voll0L=65;
sys_ctrl.voll0H=80;
sys_ctrl.voll1L=55;
sys_ctrl.voll1H=63;
sys_ctrl.voll2L=40;
sys_ctrl.voll2H=50;
sys_ctrl.voll3L=15;
sys_ctrl.voll3H=40;
sys_ctrl.curl=20;
sys_ctrl.smog=50;
}
//系统初始界面显示
void sys_open_show(void)
{
lcd1602_clear();
lcd1602_show_string(0,0," Pick Wine Sys");
lcd1602_show_string(0,1,"Al by volume:");
}
//系统参数设置界面显示
void _parm_set_show(void)
{
lcd1602_clear();
lcd1602_show_string(0,0," Pick Wine Sys");
lcd1602_show_string(0,1,"Threshold :");
}
//系统数据获取
void sys_data_get(void)
{
static u8 i=0;
u8 temp=0;
while(1)
{
//
i++;
if(i%5==0)
//
temp=pcf8591_read_adcvalue(0);
temp=pcf8591_read_adcvalue(0);
sys_ctrl.vol=((float)temp*10/255) * 10;
break;
}
}
void sys_data_show(void)
{
u8 buf[6]; // 为了容纳三位数形式的电压值和百分号,数组长度设为6
while (1)
{
if (sys_ctrl.mode == 0)
{
// 电压显示
// sprintf(buf, "%03d.%d%%",(sys_ctrl.vol / 10), (int)(sys_ctrl.vol % 10)); // 格式化为00.0%形式
buf[0]=sys_ctrl.vol/10+0x30;
buf[1]=sys_ctrl.vol%10+0x30;
buf[2]='\0';
lcd1602_show_string(14, 1, buf);
}
else
{
// 电压阈值显示
buf[0]=sys_ctrl.voll/10+0x30;
buf[1]=sys_ctrl.voll%10+0x30;
buf[2]='\0';
lcd1602_show_string(14, 1, buf);
// 阈值设定,数据位置闪烁
switch (sys_ctrl.mode)
{
case 1: //电压
lcd1602_show_string(14, 1, " ");
delay_ms(100);
// 电压阈值显示
buf[0]=sys_ctrl.voll/10+0x30;
buf[1]=sys_ctrl.voll%10+0x30;
buf[2]='\0';
lcd1602_show_string(14, 1, buf);
break;
}
}
break;
}
}
//系统数据设置
void sys_data_set(void)
{
u8 key=0;
static u8 oneflag=0;
key=KEY_Scan(0);
//模式设置
if(key==KEY3_PRESS)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>=2)sys_ctrl.mode=1;
if(oneflag==0)
{
oneflag=1;
_parm_set_show();//系统参数设置显示
}
}
if(sys_ctrl.mode!=0)
{
//在设置模式下,加
if(key==KEY1_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://电压
sys_ctrl.voll++;
if(sys_ctrl.voll>60)sys_ctrl.voll=0;
break;
}
}
//在设置模式下,减
else if(key==KEY2_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://电压
sys_ctrl.voll--;
if(sys_ctrl.voll<0)sys_ctrl.voll=50;
break;
}
}
//确定
else if(key==KEY4_PRESS)
{
sys_ctrl.mode=0;
oneflag=0;
sys_open_show();//系统开机界面显示
}
}
}
//系统功能控制
void sys_fun_ctrl(void)
{
//正常工作模式下
if(sys_ctrl.mode==0)
{
//电压低于阈值,电压报警指示,蜂鸣器报警
if(sys_ctrl.vol< sys_ctrl.voll)
{
LED_0=0;
beep_alarm(10,1000);
}
else
{
LED_0=1;
}
//电压低于阈值,电压报警指示,蜂鸣器报警
if(sys_ctrl.vol > sys_ctrl.voll0L && sys_ctrl.vol < sys_ctrl.voll0H)
{
LED_4=0;
}
else
{
LED_4=1;
}
if(sys_ctrl.vol >sys_ctrl.voll1L && sys_ctrl.vol <sys_ctrl.voll1H)
{
LED_3=0;
}
else
{
LED_2=1;
}
if(sys_ctrl.vol > sys_ctrl.voll2L && sys_ctrl.vol < sys_ctrl.voll2H)
{
LED_2=0;
}
else
{
LED_2=1;
}
if(sys_ctrl.vol > sys_ctrl.voll3L && sys_ctrl.vol < sys_ctrl.voll3H)
{
LED_1=0;
}
else
{
LED_1=1;
}
}
}
void uart_print_log(void)
{
printf("********** Pick Wine Sys ********\r\n");
printf("\r\n");
printf("Alcohol by volume = %d%d\r\n",sys_ctrl.vol/10,sys_ctrl.vol%10);
printf("\r\n");
printf("***********************************\r\n");
delay_ms(200);
}
//应用控制系统
void appdemo_show(void)
{
u8 i=10;
sys_parm_init();//系统参数初始化
KEY_Init();
BEEP_Init();
ctrl_pin_init();
pcf8591_init();
lcd1602_init();//LCD1602初始化
//Adc_Init();
USART1_Init(115200);
// while(i--)
// {
// //温度获取
// // sys_ctrl.temp=DS18B20_GetTemperture();
// delay_ms(100);
// }
sys_open_show();//系统开机界面显示
while(1)
{
sys_data_get();//系统数据获取
sys_data_show();//系统数据显示
sys_data_set();//系统数据设置
sys_fun_ctrl();//系统功能控制
uart_print_log();
}
}