日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

宠物喂食器的设计-基于涂鸦三明治三件套

發(fā)布時(shí)間:2024/3/24 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 宠物喂食器的设计-基于涂鸦三明治三件套 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

寵物喂食器的設(shè)計(jì)-基于涂鴉三明治三件套

本文章允許涂鴉智能轉(zhuǎn)載使用
去年疫情突發(fā),全國(guó)很多地區(qū)封城,封小區(qū),讓原本備受寵愛(ài)的主子與鏟屎官異地分離。遇到有準(zhǔn)備的鏟屎官,主子們還能勉強(qiáng)度日,那些沒(méi)有準(zhǔn)備的主子只能靠吃貓砂,吃垃圾度日,甚至有些小可憐被活活餓死。
疫情緩解后,為了避免這樣的事件再次發(fā)生,也為了解放懶惰的鏟屎官,于是自動(dòng)貓砂盆,自動(dòng)喂食器,自動(dòng)喂水器的需求不斷提升。有數(shù)據(jù)顯示,疫情后自動(dòng)貓砂盆增長(zhǎng)879%,自動(dòng)喂水器增長(zhǎng)120%,自動(dòng)喂食器增長(zhǎng)也超一倍。畢竟主子是家里的老大,要吃好喝好還要拉好。
此次DIY自動(dòng)投食器由涂鴉智能開(kāi)展的【寵物喂食器】實(shí)戰(zhàn)營(yíng)策劃,并提供了涂鴉三明治開(kāi)發(fā)套件,其中包括:
涂鴉三明治 Wi-Fi MCU 通信板1

涂鴉三明治H橋直流電機(jī)驅(qū)動(dòng)功能板1


涂鴉三明治直流供電電源板*1。

除此之外,用戶還需要自行準(zhǔn)備MCU控制板和電機(jī)等組件,該WiFi模組出廠默認(rèn)為透?jìng)髂J?#xff0c;只負(fù)責(zé)數(shù)據(jù)轉(zhuǎn)發(fā),不負(fù)責(zé)數(shù)據(jù)處理,所以我們只需要準(zhǔn)備MCU用于數(shù)據(jù)處理和外設(shè)控制。

涂鴉智能平臺(tái)

1.前往涂鴉智能開(kāi)發(fā)平臺(tái)

(https://auth.tuya.com/register_source=7b811ac2e872ccb62376ba4dfe0568eb)注冊(cè)開(kāi)發(fā)者賬號(hào)

2.在涂鴉loT平臺(tái)創(chuàng)建產(chǎn)品

3.在小家電品類里面找到【寵物喂食器】


4.使用MCU SDK方案,完善產(chǎn)品信息


5.產(chǎn)品創(chuàng)建后添加標(biāo)準(zhǔn)功能

6.硬件開(kāi)發(fā)選項(xiàng)


以上步驟更加具體配置可參考涂鴉IOT平臺(tái)產(chǎn)品創(chuàng)建流程(https://shimo.im/docs/HvHRgTtjUDYIvLlA/read)產(chǎn)品創(chuàng)建完成后下載開(kāi)發(fā)資料,建議全部下載,其中MCU SDK的內(nèi)容會(huì)根據(jù)你所選擇的標(biāo)準(zhǔn)功能不同而不同,為了方便可在選擇功能時(shí)盡可能多的考慮到需要配置的功能,當(dāng)然,即使你一個(gè)不選,SDK也開(kāi)放了各個(gè)功能的函數(shù),只是被屏蔽,可自行放開(kāi)。

功能調(diào)試

MCU對(duì)接方案通信原理圖

1.WIFI模組調(diào)試

打開(kāi)上一步最終下載的文件如圖,接著我們打開(kāi)涂鴉調(diào)試助手

將WiFi的通信板的串口1接到usb-ttl上,接到電腦,一定是串口1,串口0是查看模組本身的logo的,打開(kāi)涂鴉調(diào)試助手。選擇MCU模擬,此時(shí)調(diào)試助手就相當(dāng)于是MCU,可以與WiFi模組通信,可用此來(lái)調(diào)試WiFi模組。選擇好串口,波特率默認(rèn)9600.功能點(diǎn)調(diào)試文件選擇之前下載的json文件。初始化配置保持默認(rèn),點(diǎn)擊開(kāi)始調(diào)試。如收到以下數(shù)據(jù)說(shuō)明模組與助手連接正常,可以開(kāi)始調(diào)試。

此時(shí)我們下載涂鴉智能APP,注冊(cè)后選擇添加設(shè)備,在小家電里面找到寵物喂食器,選擇2.4G的WiFi網(wǎng)絡(luò)。輸入密碼。點(diǎn)擊下一步

此時(shí)在模組調(diào)試助手點(diǎn)擊smart配網(wǎng),手機(jī)點(diǎn)擊下一步


配網(wǎng)成功后會(huì)在手機(jī)APP和調(diào)試助手同時(shí)看到相應(yīng)信息。連接成功后會(huì)定時(shí)發(fā)送心跳包保持連接。

至此WiFi模組配網(wǎng)完成,改配網(wǎng)信息會(huì)保存在WiFi模組內(nèi)部,下次上電會(huì)自動(dòng)連接該網(wǎng)絡(luò)。如果更換網(wǎng)絡(luò)環(huán)境需要重置后再次配網(wǎng)。此時(shí)可在DP CMD里面測(cè)試相關(guān)DP點(diǎn)的數(shù)據(jù)上報(bào),觀察有無(wú)數(shù)據(jù)的上報(bào)下發(fā)。

2.MCU調(diào)試

WiFi模組調(diào)試完成之后我們需要調(diào)試我們的主控,也就是MCU,在我這里就是STM32F103ZET6。在進(jìn)行MCU調(diào)試之前我們需要先進(jìn)行SDK的移植,將之前下載的SDK移植到我們的STM32項(xiàng)目中。

1.工程搭建

本文實(shí)在串口驅(qū)動(dòng)實(shí)驗(yàn)的基礎(chǔ)上搭建的,因?yàn)楹竺嫘枰玫酱?#xff1b;
usart.h

#ifndef __USART_H #define __USART_H #include "stdio.h" #include "sys.h" #define USART_REC_LEN 200 //定義最大接收字節(jié)數(shù) 200 #define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收extern u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).末字節(jié)為換行符 extern u16 USART_RX_STA; //接收狀態(tài)標(biāo)記 //如果想串口中斷接收,請(qǐng)不要注釋以下宏定義 void uart_init(u32 bound); void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);#endif

usart.c

#include "sys.h" #include "usart.h" #include "mcu_api.h" #include "protocol.h" #include "system.h" #include "wifi.h" // //如果使用ucos,則包括下面的頭文件即可. #if SYSTEM_SUPPORT_OS #include "includes.h" //ucos 使用 #endif#if 1 #pragma import(__use_no_semihosting) //標(biāo)準(zhǔn)庫(kù)需要的支持函數(shù) struct __FILE { int handle; }; FILE __stdout; //定義_sys_exit()以避免使用半主機(jī)模式 void _sys_exit(int x) { x = x; } //重定義fputc函數(shù) int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢 USART1->DR = (u8) ch; return ch; } #endif #if EN_USART1_RX //如果使能了接收 //串口1中斷服務(wù)程序 //注意,讀取USARTx->SR能避免莫名其妙的錯(cuò)誤 u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié). //接收狀態(tài) //bit15, 接收完成標(biāo)志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字節(jié)數(shù)目 u16 USART_RX_STA=0; //接收狀態(tài)標(biāo)記 void uart_init(u32 bound) {//GPIO端口設(shè)置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時(shí)鐘//USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級(jí)3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優(yōu)先級(jí)3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器//USART 初始化設(shè)置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個(gè)停止位USART_InitStructure.USART_Parity = USART_Parity_No;//無(wú)奇偶校驗(yàn)位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無(wú)硬件數(shù)據(jù)流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開(kāi)啟串口接受中斷USART_Cmd(USART1, ENABLE); //使能串口1 }void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) {/* 發(fā)送一個(gè)字節(jié)數(shù)據(jù)到USART */USART_SendData(pUSARTx,ch);/* 等待發(fā)送數(shù)據(jù)寄存器為空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }void USART1_IRQHandler(void) {uint8_t ucTemp;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){ ucTemp = USART_ReceiveData(USART1);uart_receive_input(ucTemp); } USART_ClearFlag(USART1,USART_FLAG_RXNE); }#endif

寫(xiě)一個(gè)發(fā)送單字節(jié)函數(shù),此函數(shù)必須,用于向WiFi模組發(fā)送數(shù)據(jù)。

void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) {/* 發(fā)送一個(gè)字節(jié)數(shù)據(jù)到USART */USART_SendData(pUSARTx,ch);/* 等待發(fā)送數(shù)據(jù)寄存器為空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }

2.移植SDK

基礎(chǔ)工程搭建完成后將SDK放入工程,記得在keil中添加文件路徑。

這個(gè)時(shí)候要是編譯,會(huì)瘋狂報(bào)錯(cuò),主要是官方方便我們修改。

在下圖的函數(shù)中填入上面寫(xiě)的串口單字節(jié)發(fā)送函數(shù)

3.確認(rèn)protocol.h的相關(guān)宏定義

1.定義 PID。PRODUCT_KEY 為產(chǎn)品 PID 宏定義。PID 即產(chǎn)品 ID, 為每個(gè)產(chǎn)品的唯一標(biāo)識(shí),可在 IoT 平臺(tái)的產(chǎn)品詳情頁(yè)面獲取。

#define PRODUCT_KEY "gktqnpciyofn****" //開(kāi)發(fā)平臺(tái)創(chuàng)建產(chǎn)品后生成的16位字符產(chǎn)品唯一標(biāo)識(shí)

2.定義 Wi-Fi 模塊工作模式。CONFIG_MODE 為配網(wǎng)方式,支持默認(rèn)模式(AP 和 SmartConfig 互相切換)、安全模式、防誤觸模式。建議選擇防誤觸模式。
3.定義模塊工作方式(必選)
如果配網(wǎng)按鍵和 LED 接在 MCU 端,即選擇模塊和 MCU 配合處理工作模式(常用),保持 WIFI_CONTROL_SELF_MODE 宏定義處于被注釋狀態(tài)。

//#define WIFI_CONTROL_SELF_MODE //Wi-Fi 自處理按鍵及LED指示燈,如為MCU外接按鍵/LED指示燈請(qǐng)關(guān)閉該宏

如果配網(wǎng)指示燈和按鍵是接在 Wi-Fi 模塊上的,即選擇模塊自處理工作模式,開(kāi)啟 WIFI_CONTROL_SELF_MODE 宏定義,然后根據(jù)實(shí)際的硬件連接,將指示燈和按鍵所連接的 GPIO 腳位填入下面兩個(gè)宏定義。

#ifdef WIFI_CONTROL_SELF_MODE //模塊自處理#define WF_STATE_KEY 14 //Wi-Fi 模塊狀態(tài)指示按鍵,請(qǐng)根據(jù)實(shí)際 GPIO 管腳設(shè)置#define WF_RESERT_KEY 0 //Wi-Fi 模塊重置按鍵,請(qǐng)根據(jù)實(shí)際 GPIO 管腳設(shè)置 #endif

以上三點(diǎn)較為重要,其他可自行安排,都有相關(guān)介紹。

移植protocol.c文件及函數(shù)調(diào)用

  • 將wifi.h 文件保存至存放 Wi-Fi 相關(guān)文件的文件夾中,例如 main.c文件夾。而我是創(chuàng)建了一個(gè)WiFi文件夾,WiFi.c只是引用了wifi.h這個(gè)頭文件,其他為空。
  • 在 MCU 串口及其他外設(shè)初始化后調(diào)用 mcu_api.c 文件中的 wifi_protocol_init() 函數(shù)。
  • 將 MCU 串口單字節(jié)發(fā)送函數(shù)填入 protocol.c 文件中 uart_transmit_output 函數(shù)內(nèi),并刪除 #error。此步驟在上文已介紹。不贅述。
  • 在串口接收中斷服務(wù)函數(shù)里面調(diào)用 mcu_api.c 文件內(nèi)的 uart_receive_input 函數(shù),并將接收到的字符作為參數(shù)傳入。示例如下:
  • void USART1_IRQHandler(void) {uint8_t ucTemp;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){ ucTemp = USART_ReceiveData(USART1);uart_receive_input(ucTemp); } USART_ClearFlag(USART1,USART_FLAG_RXNE); }
  • 在主函數(shù)的while(1) 循環(huán)后調(diào)用 mcu_api.c 文件內(nèi)的 wifi_uart_service() 函數(shù)。該函數(shù)用于wifi串口數(shù)據(jù)處理服務(wù),同時(shí)維持心跳。此函數(shù)無(wú)需任何判斷條件,直接調(diào)用。在使用該函數(shù)時(shí)最好不要關(guān)閉總中斷或串口中斷,防止數(shù)據(jù)丟失,如必要,盡可能短的時(shí)間關(guān)閉。

    走到這一步,SDK移植已經(jīng)完成了,接下來(lái)將單片機(jī)的串口街道電腦進(jìn)行調(diào)試。此時(shí)調(diào)試助手選擇模組模擬。同時(shí)我們?cè)趐rotocol.c文件中將all_data_update() 函數(shù)中的所有DP點(diǎn)上傳函數(shù)打開(kāi),默認(rèn)為0。
    此時(shí)MCU接到調(diào)試助手,打開(kāi)串口,添加DP點(diǎn)文件,啟動(dòng)調(diào)試,便會(huì)看到所有DP點(diǎn)的上報(bào)
    進(jìn)入DP CMD添加一個(gè)開(kāi)啟小夜燈的指令并下發(fā),便可看到模組成功接收,說(shuō)明MCU的SDK移植成功。

    一個(gè)完整的自動(dòng)喂食器的MCU工程便已搭建完成,后續(xù)我們只需要解析wifi模組下發(fā)的消息,并進(jìn)行相應(yīng)的外設(shè)控制便可。當(dāng)然,每次MCU完成動(dòng)作后也要上傳數(shù)據(jù)給模組。完成服務(wù)器和手機(jī)APP端的數(shù)據(jù)刷新。
  • 3.相關(guān)功能完善

    1.一鍵配網(wǎng)功能

    配網(wǎng)有兩種模式AP配網(wǎng)和smart配網(wǎng),這里僅介紹smart類型。
    配網(wǎng)指令有兩個(gè)函數(shù)可以實(shí)現(xiàn):mcu_reset_wifi() 和 mcu_set_wifi_mode()。通常在按鍵觸發(fā)配網(wǎng)后,在按鍵處理函數(shù)中調(diào)用。mcu_reset_wifi()調(diào)用后復(fù)位 Wi-Fi 模組,復(fù)位后之前的配網(wǎng)信息全部清除。mcu_reset_wifi() 每調(diào)用一次,Wi-Fi 模塊即在 AP 和 Smart 之間切換一次配網(wǎng)模式。
    mcu_set_wifi_mode()參數(shù)為SMART_CONFIG和AP_CONFIG。調(diào)用后清除配網(wǎng)信息,進(jìn)入 Smart 模式或者 AP 模式。值了在按鍵KEY0中斷函數(shù)中調(diào)用 mcu_get_wifi_work_state() 函數(shù)主動(dòng)獲取 Wi-Fi 狀態(tài)。根據(jù) Wi-Fi 狀態(tài),寫(xiě)入相應(yīng)閃燈的模式。通過(guò)switch()判斷進(jìn)入何種狀態(tài),狀態(tài)可選參數(shù)如下:
    exti.c

    #include "exti.h" #include "led.h" #include "key.h" #include "delay.h" #include "usart.h" //#include "beep.h" #include "mcu_api.h" #include "protocol.h" #include "system.h" #include "wifi.h" #include "lcd.h" #include "text.h" #include "motor.h"//外部中斷0服務(wù)程序 void EXTIX_Init(void) {EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;KEY_Init(); // 按鍵端口初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能復(fù)用功能時(shí)鐘//GPIOE.2 中斷線以及中斷初始化配置 下降沿觸發(fā)GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器//GPIOE.3 中斷線以及中斷初始化配置 下降沿觸發(fā) //KEY1GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);EXTI_InitStructure.EXTI_Line=EXTI_Line3;EXTI_Init(&EXTI_InitStructure); //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器//GPIOE.4 中斷線以及中斷初始化配置 下降沿觸發(fā) //KEY0GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);EXTI_InitStructure.EXTI_Line=EXTI_Line4;EXTI_Init(&EXTI_InitStructure); //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器//GPIOA.0 中斷線以及中斷初始化配置 上升沿觸發(fā) PA0 WK_UPGPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStructure); //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按鍵WK_UP所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級(jí)2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子優(yōu)先級(jí)3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按鍵KEY2所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級(jí)2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子優(yōu)先級(jí)2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按鍵KEY1所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級(jí)2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子優(yōu)先級(jí)1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //使能按鍵KEY0所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級(jí)2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子優(yōu)先級(jí)0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器}//外部中斷0服務(wù)程序 void EXTI0_IRQHandler(void) {delay_ms(10);//消抖if(WK_UP==1) //WK_UP按鍵{ LED0=!LED0; mcu_reset_wifi();mcu_set_wifi_mode(SMART_CONFIG); // EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中斷標(biāo)志位 }EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中斷標(biāo)志位 }//外部中斷2服務(wù)程序 void EXTI2_IRQHandler(void) {delay_ms(10);//消抖if(KEY2==0) //按鍵KEY2{int i=1000;LED0=!LED0;for(i=1000;i>0;i--)motor_control_F(2);delay_ms(1000);} EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中斷標(biāo)志位 } //外部中斷3服務(wù)程序 void EXTI3_IRQHandler(void) {delay_ms(10);//消抖if(KEY1==0) //按鍵KEY1{ int i=1000; LED0=!LED0;for(i=1000;i>0;i--)motor_control_Z(2);delay_ms(1000);//LED1=!LED1;} EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中斷標(biāo)志位 }void EXTI4_IRQHandler(void) {delay_ms(10);//消抖if(KEY0==0) //按鍵KEY0{LED0=!LED0;switch(mcu_get_wifi_work_state()){case SMART_CONFIG_STATE:Led_Blink_Quick();POINT_COLOR=BLUE;Show_Str(30,20,200,16,"處于 Smart 配置狀態(tài)",16,0); break;case AP_STATE:Led_Blink_Slow();POINT_COLOR=BLUE;Show_Str(30,40,200,16,"處于 AP 配置狀態(tài)",16,0);break;case WIFI_NOT_CONNECTED:GPIO_ResetBits(GPIOB,GPIO_Pin_5);POINT_COLOR=BLUE;Show_Str(30,60,200,16,"Wi-Fi 配置完成,正在連接路由器",16,0);break;case WIFI_CONNECTED:GPIO_SetBits(GPIOB,GPIO_Pin_5);POINT_COLOR=BLUE;Show_Str(30,80,200,16,"路由器連接成功",16,0);break;case WIFI_CONN_CLOUD:GPIO_SetBits(GPIOB,GPIO_Pin_5);LCD_Clear(WHITE);//清屏 POINT_COLOR=BLUE;Show_Str(30,100,200,16,"WIFI已經(jīng)連接上云服務(wù)器",16,0); break;default:break;}} EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中斷標(biāo)志位 }

    在外部中斷函數(shù)0里面添加了mcu_reset_wifi(),復(fù)位模組,清除全部配網(wǎng)信息,然后調(diào)用mcu_set_wifi_mode()函數(shù),參數(shù)添加SMART_CONFIG進(jìn)入smart模式。在這用TFTLCD屏幕顯示是否進(jìn)入smart配網(wǎng)模式,還可顯示其他狀態(tài)。

    現(xiàn)在將MCU與模組通過(guò)串口1連接,注意TX與RX反接并共地。按下按鍵,LED快閃,打開(kāi)手機(jī)APP進(jìn)行配網(wǎng),當(dāng)wifi配置完成燈會(huì)熄滅,連接上路由器之后燈會(huì)重新點(diǎn)亮,并保持常亮。此過(guò)程本人已測(cè)試無(wú)問(wèn)題,但是過(guò)程比較長(zhǎng)不適合貼圖,會(huì)在視頻中展示。

    2.添加小夜燈等類似功能

    配網(wǎng)完成了,那么怎么執(zhí)行功能呢?在protocol.c中dp_download_handle()函數(shù)可以處理下發(fā)的數(shù)據(jù)。在此函數(shù)中會(huì)對(duì)下發(fā)的指令進(jìn)行歸類,我們找到小夜燈的處理,這里可以進(jìn)行小夜燈指令的處理,處理完成之后會(huì)上報(bào)數(shù)據(jù),用于更新APP數(shù)據(jù)。我們跳轉(zhuǎn)進(jìn)dp_download_light_handle()函數(shù),此函數(shù)中有具體的處理,針對(duì)不同的開(kāi)或關(guān)會(huì)進(jìn)入不同的if函數(shù)。我們?cè)趯?duì)LED的端口初始化后便可以將開(kāi)關(guān)燈填入。達(dá)到不同下發(fā)指令實(shí)現(xiàn)開(kāi)關(guān)燈。開(kāi)關(guān)功能類似,不贅述。

    3. 添加手動(dòng)喂食執(zhí)行功能

    這里沒(méi)有使用涂鴉提供的H橋驅(qū)動(dòng)板,大家要是想要用,直接上一個(gè)12V的減速電機(jī),每分鐘12轉(zhuǎn),驅(qū)動(dòng)力大,速度慢,易于控制。將電機(jī)接到驅(qū)動(dòng)板的U和V接線柱上,控制口PWM1和PWM2接到單片機(jī)PA2和PA3。給PA2和PA3不同的高低電平就可以實(shí)現(xiàn)正反轉(zhuǎn),因?yàn)殡姍C(jī)本身速度比較慢,就不用軟件進(jìn)行控制速度了。而且因?yàn)閳?chǎng)景的關(guān)系,不用控制正反兩個(gè)反向,只控制正轉(zhuǎn)和停止。
    我在這里用的就不是涂鴉提供的了,步進(jìn)電機(jī):28BYJ-48,驅(qū)動(dòng)電路:ULN2003芯片的驅(qū)動(dòng)板,


    motor.c

    #include "motor.h" #include "delay.h" #include "led.h"#define A1 GPIO_SetBits(GPIOC, GPIO_Pin_3); #define A2 GPIO_ResetBits(GPIOC, GPIO_Pin_3);#define B1 GPIO_SetBits(GPIOC, GPIO_Pin_4); #define B2 GPIO_ResetBits(GPIOC, GPIO_Pin_4);#define C1 GPIO_SetBits(GPIOC, GPIO_Pin_5); #define C2 GPIO_ResetBits(GPIOC, GPIO_Pin_5);#define D1 GPIO_SetBits(GPIOC, GPIO_Pin_6); #define D2 GPIO_ResetBits(GPIOC, GPIO_Pin_6);void motor_configuration(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PB,PE端口時(shí)鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; //PC.012 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOC, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOC.5GPIO_ResetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6); //PC.012 輸出低} void motor_control_F(int n) {A1;delay_ms(n);A2;B1;delay_ms(n);B2;C1;delay_ms(n);C2;D1;delay_ms(n);D2; }void motor_control_Z(int n) {A1;delay_ms(n);A2;D1;delay_ms(n);D2;C1;delay_ms(n);C2;B1;delay_ms(n);B2; } void Motor_Ctrl_Off(void){GPIO_ResetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6); }

    編寫(xiě)控制函數(shù),參數(shù)為投喂量,通過(guò)轉(zhuǎn)動(dòng)時(shí)間來(lái)控制投喂量,延時(shí)時(shí)間需要與寵物的飯盒出糧口搭配,不同出糧口修改延時(shí)基數(shù)。
    隨后在dp_download_quick_feed_handle()函數(shù)中執(zhí)行該函數(shù),參數(shù)由mcu_get_dp_download_value()函數(shù)提供,該函數(shù)會(huì)提取手機(jī)下發(fā)的命令。

    最后我還加了語(yǔ)音控制功能,下面的文件里有這個(gè)工程的全部文件,包括語(yǔ)音模塊的設(shè)計(jì),就是類似于小度小度那樣的智能管家,這里就不在一一介紹了,大家自行下載,看我的演示視頻吧。
    文件地址:https://download.csdn.net/download/kekebb/16207490

    總結(jié)

    以上是生活随笔為你收集整理的宠物喂食器的设计-基于涂鸦三明治三件套的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。