• 【毕业设计】单片机温湿度环境检测仪 - stm32 物联网 嵌入式



    0 前言

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

    🚩 基于PID控制的智能平衡车设计与实现

    🥇学长这里给一个题目综合评分(每项满分5分)

    • 难度系数:4分
    • 工作量:4分
    • 创新点:3分

    🧿 选题指导, 项目分享:

    https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


    1 简介

    基于涂鸦智能与stm32的物联网温湿度计设计

    2 主要器件

    • STM32F103C8T6主控芯片
    • CH340N芯片
    • ME6212C33芯片
    • OLED屏
    • ME6212C33稳压芯片
    • SHT30温湿度传感器

    3 实现效果

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    4 设计原理

    硬件部分

    • 控制芯片采用的是STM32F103C8T6。
    • 采用锂电池进行供电,并可通过typec接口进行充电。
    • 板载了CH340N芯片,可与电脑进行串口通信,方便调试。
    • 采用两片ME6212C33芯片进行稳压,其中一块单独给MCU供电,另一块给其他外设供电。这样有利于-电路稳定,也可通过MCU控制断开其他外设的电源,起到节电的目的。
    • 联网模组采用“WB3S-IPEX WiFi&BLE 双协议模组”,具有wifi和蓝牙功能。
    • 温湿度传感器采用的是常用的SHT30,同时在它周围进行了开槽处理,尽量降低板子温度对SHT30的干扰。不过实际使用中测量到的温度还是会比真实温度高一点。
    • 通过OLED屏进行显示。
    • 板载两个按键和三个LED。

    主要原理图
    在这里插入图片描述
    软件部分
    涂鸦 MCU SDK 的移植
    在这里插入图片描述

    5 部分核心代码

    wifi部分

    void wifi_uart_service(void)
    {
        static unsigned short rx_in = 0;
        unsigned short offset = 0;
        unsigned short rx_value_len = 0;
        
        while((rx_in < sizeof(wifi_data_process_buf)) && with_data_rxbuff() > 0) {
            wifi_data_process_buf[rx_in ++] = take_byte_rxbuff();
        }
        
        if(rx_in < PROTOCOL_HEAD)
            return;
        
        while((rx_in - offset) >= PROTOCOL_HEAD) {
            if(wifi_data_process_buf[offset + HEAD_FIRST] != FRAME_FIRST) {
                offset ++;
                continue;
            }
            
            if(wifi_data_process_buf[offset + HEAD_SECOND] != FRAME_SECOND) {
                offset ++;
                continue;
            }  
            
            if(wifi_data_process_buf[offset + PROTOCOL_VERSION] != MCU_RX_VER) {
                offset += 2;
                continue;
            }      
            
            rx_value_len = wifi_data_process_buf[offset + LENGTH_HIGH] * 0x100;
            rx_value_len += (wifi_data_process_buf[offset + LENGTH_LOW] + PROTOCOL_HEAD);
            if(rx_value_len > sizeof(wifi_data_process_buf) + PROTOCOL_HEAD) {
                offset += 3;
                continue;
            }
            
            if((rx_in - offset) < rx_value_len) {
                break;
            }
            
            //数据接收完成
            if(get_check_sum((unsigned char *)wifi_data_process_buf + offset,rx_value_len - 1) != wifi_data_process_buf[offset + rx_value_len - 1]) {
                //校验出错
                //printf("crc error (crc:0x%X  but data:0x%X)\r\n",get_check_sum((unsigned char *)wifi_data_process_buf + offset,rx_value_len - 1),wifi_data_process_buf[offset + rx_value_len - 1]);
                offset += 3;
                continue;
            }
            
            data_handle(offset);
            offset += rx_value_len;
        }//end while
    
        rx_in -= offset;
        if(rx_in > 0) {
            my_memcpy((char *)wifi_data_process_buf, (const char *)wifi_data_process_buf + offset, rx_in);
        }
    }
    
    /**
     * @brief  协议串口初始化函数
     * @param  Null
     * @return Null
     * @note   在MCU初始化代码中调用该函数
     */
    void wifi_protocol_init(void)
    {
        rx_buf_in = (unsigned char *)wifi_uart_rx_buf;
        rx_buf_out = (unsigned char *)wifi_uart_rx_buf;
        
        stop_update_flag = DISABLE;
        
    #ifndef WIFI_CONTROL_SELF_MODE
        wifi_work_state = WIFI_SATE_UNKNOW;
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    主函数

    int main(void)
    {
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	PowerInit();			//外设供电初始化
    	EXTIX_Init();			//外部中断初始化
    	if(Check_WKUP()==0)Sys_Enter_Standby();    		//不是开机,进入待机模式		
    	LED_Init();		  		//LED初始化
    	LED_On();				//LED全亮
    	wifi_protocol_init();	//协议串口初始化
    	uart1_init(115200);		//串口初始化为115200
    	uart2_init(115200);		//串口初始化为115200	
    	RTC_Init();				//RTC初始化	
    	Adc_Init();				//ADC初始化
    	SHT30_IIC_Init();		//温湿度传感器“SHT30”初始化	
    	PWM_Init(5000-1, 288-1);//50HZ,即PWM周期为20ms		
    	OLED_Init();			//OLED初始化	
    	TIM2_Int_Init(1000-1, 7200-1);		//中断时间为0.1s,在中断中更新OLED显示,读取温湿度传感器等数据
    	StartUp();				//显示开机界面			
    	delay_ms(1000);
    	LED_Off();
    	while(1){						
    		switch (GuiNum){
    			case FeaSetN:
    				OledGui_FeaSet();		//设置界面
    				break;
    			case GuiTempHum:
    				OledGui_Temp_Hum();		//温湿度界面
    				break;
    			case GuiTime:
    				OledGui_Time();			//时钟界面
    				break;
    			case GuiWeather:
    				OledGui_Weather();		//天气界面
    				break;
    		}		
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    6 最后

  • 相关阅读:
    【Maven学习】3.7 实验七:测试依赖的传递性
    Servlet运行原理_API详解_请求响应构造进阶之路(Servlet_2)
    Matlab|考虑可再生能源消纳的电热综合能源系统日前经济调度模型
    Spring注解驱动之BeanDefinitionRegistryPostProcessor原理
    raylib部分源代码功能解读
    青龙面板安装及配置
    SE(Squeeze and Excitation)模块的理解以及代码实现
    TCP 通信流程详解(附有案例代码)
    Elasticsearch:什么时候应该考虑在 Elasticsearch 中添加协调节点?
    项目部署之安装和配置Canal
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/126314899