宠物喂食器的设计-基于涂鸦三明治三件套
寵物喂食器的設計-基于涂鴉三明治三件套
本文章允許涂鴉智能轉載使用
去年疫情突發,全國很多地區封城,封小區,讓原本備受寵愛的主子與鏟屎官異地分離。遇到有準備的鏟屎官,主子們還能勉強度日,那些沒有準備的主子只能靠吃貓砂,吃垃圾度日,甚至有些小可憐被活活餓死。
疫情緩解后,為了避免這樣的事件再次發生,也為了解放懶惰的鏟屎官,于是自動貓砂盆,自動喂食器,自動喂水器的需求不斷提升。有數據顯示,疫情后自動貓砂盆增長879%,自動喂水器增長120%,自動喂食器增長也超一倍。畢竟主子是家里的老大,要吃好喝好還要拉好。
此次DIY自動投食器由涂鴉智能開展的【寵物喂食器】實戰營策劃,并提供了涂鴉三明治開發套件,其中包括:
涂鴉三明治 Wi-Fi MCU 通信板1
涂鴉三明治H橋直流電機驅動功能板1
涂鴉三明治直流供電電源板*1。
除此之外,用戶還需要自行準備MCU控制板和電機等組件,該WiFi模組出廠默認為透傳模式,只負責數據轉發,不負責數據處理,所以我們只需要準備MCU用于數據處理和外設控制。
涂鴉智能平臺
1.前往涂鴉智能開發平臺
(https://auth.tuya.com/register_source=7b811ac2e872ccb62376ba4dfe0568eb)注冊開發者賬號
2.在涂鴉loT平臺創建產品
3.在小家電品類里面找到【寵物喂食器】
4.使用MCU SDK方案,完善產品信息
5.產品創建后添加標準功能
6.硬件開發選項
以上步驟更加具體配置可參考涂鴉IOT平臺產品創建流程(https://shimo.im/docs/HvHRgTtjUDYIvLlA/read)產品創建完成后下載開發資料,建議全部下載,其中MCU SDK的內容會根據你所選擇的標準功能不同而不同,為了方便可在選擇功能時盡可能多的考慮到需要配置的功能,當然,即使你一個不選,SDK也開放了各個功能的函數,只是被屏蔽,可自行放開。
功能調試
MCU對接方案通信原理圖
1.WIFI模組調試
打開上一步最終下載的文件如圖,接著我們打開涂鴉調試助手
將WiFi的通信板的串口1接到usb-ttl上,接到電腦,一定是串口1,串口0是查看模組本身的logo的,打開涂鴉調試助手。選擇MCU模擬,此時調試助手就相當于是MCU,可以與WiFi模組通信,可用此來調試WiFi模組。選擇好串口,波特率默認9600.功能點調試文件選擇之前下載的json文件。初始化配置保持默認,點擊開始調試。如收到以下數據說明模組與助手連接正常,可以開始調試。
此時我們下載涂鴉智能APP,注冊后選擇添加設備,在小家電里面找到寵物喂食器,選擇2.4G的WiFi網絡。輸入密碼。點擊下一步
此時在模組調試助手點擊smart配網,手機點擊下一步
配網成功后會在手機APP和調試助手同時看到相應信息。連接成功后會定時發送心跳包保持連接。
至此WiFi模組配網完成,改配網信息會保存在WiFi模組內部,下次上電會自動連接該網絡。如果更換網絡環境需要重置后再次配網。此時可在DP CMD里面測試相關DP點的數據上報,觀察有無數據的上報下發。
2.MCU調試
WiFi模組調試完成之后我們需要調試我們的主控,也就是MCU,在我這里就是STM32F103ZET6。在進行MCU調試之前我們需要先進行SDK的移植,將之前下載的SDK移植到我們的STM32項目中。
1.工程搭建
本文實在串口驅動實驗的基礎上搭建的,因為后面需要用到串口;
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) //標準庫需要的支持函數 struct __FILE { int handle; }; FILE __stdout; //定義_sys_exit()以避免使用半主機模式 void _sys_exit(int x) { x = x; } //重定義fputc函數 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循環發送,直到發送完畢 USART1->DR = (u8) ch; return ch; } #endif #if EN_USART1_RX //如果使能了接收 //串口1中斷服務程序 //注意,讀取USARTx->SR能避免莫名其妙的錯誤 u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個字節. //接收狀態 //bit15, 接收完成標志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字節數目 u16 USART_RX_STA=0; //接收狀態標記 void uart_init(u32 bound) {//GPIO端口設置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時鐘//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; //復用推挽輸出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 ;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器//USART 初始化設置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟串口接受中斷USART_Cmd(USART1, ENABLE); //使能串口1 }void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) {/* 發送一個字節數據到USART */USART_SendData(pUSARTx,ch);/* 等待發送數據寄存器為空 */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寫一個發送單字節函數,此函數必須,用于向WiFi模組發送數據。
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) {/* 發送一個字節數據到USART */USART_SendData(pUSARTx,ch);/* 等待發送數據寄存器為空 */while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }2.移植SDK
基礎工程搭建完成后將SDK放入工程,記得在keil中添加文件路徑。
這個時候要是編譯,會瘋狂報錯,主要是官方方便我們修改。
在下圖的函數中填入上面寫的串口單字節發送函數
3.確認protocol.h的相關宏定義
1.定義 PID。PRODUCT_KEY 為產品 PID 宏定義。PID 即產品 ID, 為每個產品的唯一標識,可在 IoT 平臺的產品詳情頁面獲取。
2.定義 Wi-Fi 模塊工作模式。CONFIG_MODE 為配網方式,支持默認模式(AP 和 SmartConfig 互相切換)、安全模式、防誤觸模式。建議選擇防誤觸模式。
3.定義模塊工作方式(必選)
如果配網按鍵和 LED 接在 MCU 端,即選擇模塊和 MCU 配合處理工作模式(常用),保持 WIFI_CONTROL_SELF_MODE 宏定義處于被注釋狀態。
如果配網指示燈和按鍵是接在 Wi-Fi 模塊上的,即選擇模塊自處理工作模式,開啟 WIFI_CONTROL_SELF_MODE 宏定義,然后根據實際的硬件連接,將指示燈和按鍵所連接的 GPIO 腳位填入下面兩個宏定義。
#ifdef WIFI_CONTROL_SELF_MODE //模塊自處理#define WF_STATE_KEY 14 //Wi-Fi 模塊狀態指示按鍵,請根據實際 GPIO 管腳設置#define WF_RESERT_KEY 0 //Wi-Fi 模塊重置按鍵,請根據實際 GPIO 管腳設置 #endif以上三點較為重要,其他可自行安排,都有相關介紹。
移植protocol.c文件及函數調用
走到這一步,SDK移植已經完成了,接下來將單片機的串口街道電腦進行調試。此時調試助手選擇模組模擬。同時我們在protocol.c文件中將all_data_update() 函數中的所有DP點上傳函數打開,默認為0。
此時MCU接到調試助手,打開串口,添加DP點文件,啟動調試,便會看到所有DP點的上報
進入DP CMD添加一個開啟小夜燈的指令并下發,便可看到模組成功接收,說明MCU的SDK移植成功。
一個完整的自動喂食器的MCU工程便已搭建完成,后續我們只需要解析wifi模組下發的消息,并進行相應的外設控制便可。當然,每次MCU完成動作后也要上傳數據給模組。完成服務器和手機APP端的數據刷新。
3.相關功能完善
1.一鍵配網功能
配網有兩種模式AP配網和smart配網,這里僅介紹smart類型。
配網指令有兩個函數可以實現:mcu_reset_wifi() 和 mcu_set_wifi_mode()。通常在按鍵觸發配網后,在按鍵處理函數中調用。mcu_reset_wifi()調用后復位 Wi-Fi 模組,復位后之前的配網信息全部清除。mcu_reset_wifi() 每調用一次,Wi-Fi 模塊即在 AP 和 Smart 之間切換一次配網模式。
mcu_set_wifi_mode()參數為SMART_CONFIG和AP_CONFIG。調用后清除配網信息,進入 Smart 模式或者 AP 模式。值了在按鍵KEY0中斷函數中調用 mcu_get_wifi_work_state() 函數主動獲取 Wi-Fi 狀態。根據 Wi-Fi 狀態,寫入相應閃燈的模式。通過switch()判斷進入何種狀態,狀態可選參數如下:
exti.c
在外部中斷函數0里面添加了mcu_reset_wifi(),復位模組,清除全部配網信息,然后調用mcu_set_wifi_mode()函數,參數添加SMART_CONFIG進入smart模式。在這用TFTLCD屏幕顯示是否進入smart配網模式,還可顯示其他狀態。
現在將MCU與模組通過串口1連接,注意TX與RX反接并共地。按下按鍵,LED快閃,打開手機APP進行配網,當wifi配置完成燈會熄滅,連接上路由器之后燈會重新點亮,并保持常亮。此過程本人已測試無問題,但是過程比較長不適合貼圖,會在視頻中展示。
2.添加小夜燈等類似功能
配網完成了,那么怎么執行功能呢?在protocol.c中dp_download_handle()函數可以處理下發的數據。在此函數中會對下發的指令進行歸類,我們找到小夜燈的處理,這里可以進行小夜燈指令的處理,處理完成之后會上報數據,用于更新APP數據。我們跳轉進dp_download_light_handle()函數,此函數中有具體的處理,針對不同的開或關會進入不同的if函數。我們在對LED的端口初始化后便可以將開關燈填入。達到不同下發指令實現開關燈。開關功能類似,不贅述。
3. 添加手動喂食執行功能
這里沒有使用涂鴉提供的H橋驅動板,大家要是想要用,直接上一個12V的減速電機,每分鐘12轉,驅動力大,速度慢,易于控制。將電機接到驅動板的U和V接線柱上,控制口PWM1和PWM2接到單片機PA2和PA3。給PA2和PA3不同的高低電平就可以實現正反轉,因為電機本身速度比較慢,就不用軟件進行控制速度了。而且因為場景的關系,不用控制正反兩個反向,只控制正轉和停止。
我在這里用的就不是涂鴉提供的了,步進電機:28BYJ-48,驅動電路:ULN2003芯片的驅動板,
motor.c
編寫控制函數,參數為投喂量,通過轉動時間來控制投喂量,延時時間需要與寵物的飯盒出糧口搭配,不同出糧口修改延時基數。
隨后在dp_download_quick_feed_handle()函數中執行該函數,參數由mcu_get_dp_download_value()函數提供,該函數會提取手機下發的命令。
最后我還加了語音控制功能,下面的文件里有這個工程的全部文件,包括語音模塊的設計,就是類似于小度小度那樣的智能管家,這里就不在一一介紹了,大家自行下載,看我的演示視頻吧。
文件地址:https://download.csdn.net/download/kekebb/16207490
總結
以上是生活随笔為你收集整理的宠物喂食器的设计-基于涂鸦三明治三件套的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360天擎卸载密码_Windows安装和
- 下一篇: SIKI学院lua热更新技术