STM32项目分享:基于STM32的智能洗衣机
“我们不做一锤子买卖,只做技术成长的长期伙伴!”
目录
一、视频展示
二、项目简介
三、原理图设计
四、PCB硬件设计
五、程序设计
六、资料分享
一、视频展示
基于STM32的智能洗衣机 -视频分享
二、项目简介
题目:洗衣机
主控:STM32
显示:OLED显示屏
DS18B20温度传感器
水位传感器
湿度传感器
控制模块:抽水继电器➕排水继电器
声光报警:LED+蜂鸣器
功能:
1、可按键选择模式(快洗,慢洗,甩干,速度不同),时间,水位等数据。
2、选择完毕之后按下开始,进行抽水,当水位超过阈值后开始根据模式进行转动,转动时间根据设定时间进行转动,一共三次,等完毕后,打开排水,直到水位小于10,最后快速甩干。然后结束蜂鸣器报警两下,中间可按键暂停,暂停中蜂鸣器报警。
三、原理图设计
四、PCB硬件设计
五、程序设计
#include "stm32f10x.h" // Device header
#include "delay.h"
#include "lcd.h"
#include "dht11.h"
#include "adc.h"
#include "pwm.h"
#include "IOput.h"
#include "usart.h"
#include "timer.h"#define d 2.7
/* 改p值这个偏差就行 */
#define p 168
float water;
int voltage;extern u8 res;
u16 i = 0;
u8 show_flag,show1_flag,max_wd=30,dec_wd=20,max_sd=60,dec_sd=40;
u16 count1=0;
u8 mode = 0; /*模式*/
u8 mode_over = 1;
u16 gears = 0;
u8 time = 0; /*时间*/
u8 time_chose_over = 1;
u8 leofwa = 0; /*阈值*/u16 leofwa_now = 0; /*实际水位值*/
u8 rain = 0;void Mode_Chose(u8* mode,u8* time,u8* level);
void start_wash(u8 mode,u8 time,u8 leofwa);
void turn(u8 mode,u8 time,u8 leofwa);float Water_read(void)
{u16 adcx;float voltage;adcx=Get_Adc_Average(ADC_Channel_1,10);voltage = adcx*(float)d/(float)p;Delay_1ms(50);return voltage;
}float Water_out(int o)
{int i;float num = 0;float out;for(i=0;i<o;i++){ num += Water_read(); } out = num/o; return out;
}int main (void)
{delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);DHT11_Init();Adc_Init();OLED_Init();delay_ms(1);OLED_Clear();output_init();input_init();TIM_PWM_Init(100,36);while(1){Mode_Chose(&mode,&time,&leofwa);start_wash(mode,time,leofwa);// rain = 100-Get_Adc_Average(4,10)*100/4096;
// OLED_ShowNum(40,2,rain,2,16);}
}
void Mode_Chose(u8* mode,u8* time,u8* level)
{OLED_Clear();while(mode_over){key_scan(1,1,1);if(set_flag == 1){*mode = 1;*time = 5;*level = 30;OLED_ShowCH(0,2,"mode: ");OLED_ShowNum(40,2,*mode,2,16);OLED_ShowCH(0,4,(u8*)"time: ");OLED_ShowNum(48,4,*time,2,16);OLED_ShowCH(0,6,(u8*)"level: ");OLED_ShowNum(50,6,*level,2,16);key_scan(1,1,1);if(add_flag){OLED_Clear();mode_over = 0;add_flag = 0;return;}}else if(set_flag == 2){*mode = 2;*time = 5;*level = 35;OLED_ShowCH(0,2,"mode: ");OLED_ShowNum(40,2,*mode,2,16);OLED_ShowCH(0,4,(u8*)"time: ");OLED_ShowNum(40,4,*time,2,16);OLED_ShowCH(0,6,(u8*)"level: ");OLED_ShowNum(50,6,*level,2,16);key_scan(1,1,1);if(add_flag){OLED_Clear();mode_over = 0;add_flag = 0;return;}}else if(set_flag == 3){*mode = 3;*time = 4;*level = 20;OLED_ShowCH(0,2,"mode: ");OLED_ShowNum(40,2,*mode,2,16);OLED_ShowCH(0,4,(u8*)"time: ");OLED_ShowNum(48,4,*time,2,16);OLED_ShowCH(0,6,(u8*)"level: ");OLED_ShowNum(50,6,*level,2,16);key_scan(1,1,1);if(add_flag){OLED_Clear();mode_over = 0;add_flag = 0;return;}}else if(set_flag == 4){set_flag = 0;}}
}
void start_wash(u8 mode,u8 time,u8 leofwa)
{OLED_Clear();OLED_ShowCH(30,2,(u8*)"START....");delay_ms(3000);turn(mode,time,leofwa);/*开始运转*/}
void turn(u8 mode,u8 time,u8 leofwa)
{for(i=0;i<3;i++){/*抽水*/while(1 && mode ){JDQ1_Control(0);/*打开抽水继电器*/JDQ2_Control(1);/*关闭排水继电器*/leofwa_now = Water_out(10)-20;if(leofwa_now>=40){leofwa_now=40;}
// leofwa_now = Get_Adc_Average(1,20);OLED_Clear();OLED_ShowCH(0,1,"level: ");OLED_ShowNum(56,1,leofwa_now,2,16);if(leofwa < leofwa_now){JDQ1_Control(1);/*关闭抽水继电器*/mode = 0;break;}}if(dec_flag == 0){run_dir(0,500);delay_ms((time*1000)/3);run_dir(0,0);delay_ms(1000);}key_scan(1,1,1);if(dec_flag == 1){while(1){beep_contr();key_scan(1,1,1);if(add_flag){dec_flag = 0;add_flag = 0;Beep_Off();break;}}}Beep_Off();}run_dir(0,0);while(1){JDQ1_Control(1);/*关闭抽水继电器*/JDQ2_Control(0);/*打开排水继电器*/leofwa_now = Water_out(10)-20;if(leofwa_now>=40){leofwa_now=40;}rain = 100-Get_Adc_Average(4,10)*100/4096;OLED_Clear();OLED_ShowCH(0,1,"level: ");OLED_ShowNum(56,1,leofwa_now,2,16);OLED_ShowCH(0,4,(u8*)"humi: ");OLED_ShowNum(48,4,rain,2,16);if(leofwa_now <= 10){JDQ2_Control(1);/*关闭排水继电器*/for(i=0;i<9;i++){rain = 100-Get_Adc_Average(4,10)*100/4096;OLED_ShowCH(0,4,(u8*)"humi: ");OLED_ShowNum(48,4,rain,2,16);run_dir(0,500);delay_ms(100);run_dir(0,0);delay_ms(100);}break;}}beep_contr();mode_over = 1;}
六、资料分享
点击即可查看当前资料分享。