宠物喂食器的设计-基于涂鸦三明治三件套
寵物喂食器的設(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
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è)面獲取。
2.定義 Wi-Fi 模塊工作模式。CONFIG_MODE 為配網(wǎng)方式,支持默認(rèn)模式(AP 和 SmartConfig 互相切換)、安全模式、防誤觸模式。建議選擇防誤觸模式。
3.定義模塊工作方式(必選)
如果配網(wǎng)按鍵和 LED 接在 MCU 端,即選擇模塊和 MCU 配合處理工作模式(常用),保持 WIFI_CONTROL_SELF_MODE 宏定義處于被注釋狀態(tài)。
如果配網(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)用
走到這一步,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
在外部中斷函數(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
編寫(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)題。
- 上一篇: 360天擎卸载密码_Windows安装和
- 下一篇: SIKI学院lua热更新技术