創作內容

14 GP

【Arduino框架ESP32實作】防疫送餐車

作者:汐鹿生│2022-04-20 18:43:46│巴幣:76│人氣:1175
撰寫時間 : 2022/01/18

前言
三上和組員合作使用Arduino mega2560和NodeMCU-32s(ESP32晶片)實作"防疫送餐車"作品,算是一次還不錯的經驗,每次分組合作最頭痛的問題是分工不明確與組員間常常約出來做反覆而無意義的討論,但這次組員間分工明確、各司其職,在一開始就分配好工作 - 我負責車上模組、組員A負責和車體移動相關的任務(循跡、房號編碼)、組員B負責後端處理(Line bot, HTTP server),降低我們程式之間的相關性,並先討論好彼此通訊的規則,包括跟後端對接的json格式與跟mega 2560的藍芽傳輸字串格式,彼此之間就不需要知道對方具體的實踐內容,只需要知道傳輸接口的規則

demo影片

點餐系統流程
點餐系統流程如下,依序為
1. Line導向指定網頁點餐
2. 後場確認餐點後送出
3. (車輛前往指定房號…)
4. 送達指定房號並由消費者完成取餐手續
5. (車輛返回起始點…)
6. 重複步驟1,繼續下一筆訂單

另外還有以下5個異常處理的狀況。
1. 運送途中食物重量異常減少
2. 消費者未遵照正常手續直接取餐
3. 消費者使用房卡(RFID)感應錯誤超過3次
4. 後場人員在一開始即取消訂單
5. 消費者逾時未取餐

各自分工
組員分工拆成3個部分 - 車體移動、車上模組、後端,如此以來只需要各自完成各自的功能。

1. 組員A負責和車體移動相關的任務(循跡、房號編碼),MCU使用Arduino Mega 2560。
考量實際路面不平,之後未實際demo循跡、房號編碼功能。

2. 我負責與車上模組相關的功能,MCU使用NodeMCU-32s。
功能 模組 通訊
在車上顯示即時資訊 黃藍雙色SSD1306 0.96吋 OLED I2C 共用
操作OLED面板 遊戲搖杆、按鈕 OUT1,2、訊號線1條
在車上秤重,防止運送時的突發狀況(實際demo用手機當作食物去測重) 秤重模組HX711 I2C 共用
個別房卡辨識 RFID模組MFRC-522、房卡(RFID) I2C 共用(UART、I2C、SPI皆可)
播放相應提示聲音
wav,mp3解碼器DFPlayer、MicroSD卡、喇叭

UART 2條
播放相應提示聲音2 無源蜂鳴器 訊號線1條
與Arduino Mega 2560開發版連線藍芽模組 HC-05 UART 2條


3. 組員B負責後端處理(Line bot, HTTP server)

ESP32與server、Arduino Mega 2560之間的通訊
ESP32(NodeMCU-32s)每隔3秒會訪問路徑/Update的,在未收到訂單時,會回傳0,而當使用者在網頁中送出訂單後,server會將/Update的數字改為1,而當ESP32再次訪問時,/Update的數字就會變為0,因此ESP32可以知道目前收到一筆訂單,並訪問server的路徑/Order,獲得以下json數據。
{
    "menu": [1, 2, 0, 0, 0, 3, 1, 8, 33, 0],
    "room": "h",
    "rfid": [0, 9, 10, 5],
}
ESP32使用ArduinoJson.h函式庫進行json解析,獲得10項商品的數量、房號位置、對應RFID的UID。
String payload = "";
int menu_latest[10];
int UID_latest[4];
DynamicJsonDocument doc(800);
deserializeJson(doc, payload);
for (int i = 0; i < 10; i++)
    menu_latest[i] = (int)doc["menu"][i];
String temp = doc["room"];
char room_number_latest = temp[0];
for (int i = 0; i < 4; i++)
    UID_latest[i] = (int)doc["rfid"][i];
將解析得到的資訊調用自定義queue的成員函數put進行enqueue,動態配置記憶體,如下是queue結構與成員函數put實踐部分片段。
template <typename T>
class Queue {
    struct Node {
        T room_number;
        int menu[10];
        int UID[4];
        Node *next;
        long waiting_time;
    };
    Node *head;
    Node *tail;
    int qsize;
    long start_time;
    public:
    Queue() {
        head = NULL;
        tail = NULL;
        qsize = 0;
    }
    ...
    void put(int (&menu)[10], const T &room_number, int (&UID)[4]) {
        Node *newNode = new Node;
        if (qsize) {
            tail->next = newNode;
            newNode->room_number = room_number;
            for (int i = 0; i < 10; i++)
                newNode->menu[i] = menu[i];
            for (int i = 0; i < 4; i++)
                newNode->UID[i] = UID[i];
            newNode->waiting_time = millis();
            newNode->next = NULL;
            tail = newNode;
        } else {
            head = tail = newNode;
            newNode->room_number = room_number;
            for (int i = 0; i < 10; i++)
                newNode->menu[i] = menu[i];
            for (int i = 0; i < 4; i++)
                newNode->UID[i] = UID[i];
            newNode->waiting_time = millis();
            newNode->next = NULL;
        }
        qsize++;
    }
}
當後場人員送完餐點後,從queue中讀取房號,並寫入ESP32的藍芽模組,假設queue.room_number()的返回值是h,會傳給Arduino mega 2560板子h,使其移動到h的位置。
// 宣告UART接口1
HardwareSerial SerialBT(1);
// HC-05
SerialBT.begin(38400, SERIAL_8N1, 27, 13);  // Serial的TX,RX
//車輛移動到h, j, k的位置
SerialBT.write(queue.room_number());
當ESP32收到Arduino mega 2560板子回傳的藍芽資訊1時,代表指派給車體移動的任務完成,接下來ESP32會進入下一個state,處理消費者付款的手續。其中也會訪問一次server的路徑/Arrived,讓server能告知使用者物流的狀態。
if (SerialBT.available()) {
    char completed = SerialBT.read();
    if (completed == '1') {
        notice_status("/Arrived"); // notice line
        state = 2;
        return;
    }
}
之後流程大同小異故省略,使用UART/I2C/SPI傳輸與不同模組溝通、使用特定library細節省略。最後跑完流程,調用成員函數queue.delete_node()釋放記憶體,避免memory leak,繼續跑下一筆訂單的任務。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=5439160
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:程式

留言共 8 篇留言

Ohooide
電神。。。

04-20 19:59


終於不釣魚了嗎

04-20 20:44

汐鹿生
寶...[e3]04-20 21:02
無業遊民
你是鬼吧

04-21 01:24

爬文四世
佬…

04-21 01:44

村村
太神啦!

06-01 19:32

黑子神也
太屌了吧

06-28 23:12

H是不行的⚓
汐寶…我的超人

09-16 10:17

屁股夾蟑螂
這時候的阿夕還沒被H醬封鎖

11-07 01:22

汐鹿生
就如同當初CRYCHIC還沒解散的美好時光 [e13]11-07 01:56
我要留言提醒:您尚未登入,請先登入再留言

14喜歡★n050470 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【Adobe】巴哈進版圖... 後一篇:【Matlab】使用複數...

追蹤私訊切換新版閱覽

作品資料夾

cwt12345可以幫遊戲Steam評論
復甦之島:愛與勝利,在Steam販售4/28前有10%折扣。這是款獸娘黃油看更多我要大聲說3小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】