文章目录
- 0 前言
- 1 简介
- 2 主要器件
- 3 实现效果
- 4 设计原理
- 5 部分核心代码
- 6 最后
0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 单片机温湿度环境检测仪
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:4分
- 工作量:4分
- 创新点:3分
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
主函数
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;
}
}
}