2025年10月9日 星期四

Node-Red計算機程式

Node-Red計算機程式 




建立 Dashboard 介面

  1. 安裝 node-red-dashboard(若尚未安裝):

    npm install node-red-dashboard
  2. 在 Dashboard 中新增一個:

    • Tab(例如「計算機」)

    • Group(例如「主介面」)

 建立按鍵

在 flow 中加入以下 ui_button

  • 數字:0, 00, 1–9

  • 符號:+, -, ×, ÷, %, ., AC, ←, =

每顆按鍵輸出一個 payload

"1" // 按下 1 "+" // 按下 + "AC" // 按下清除

邏輯處理 Function

新增一個 function 節點,命名為「計算邏輯」,輸入以下程式碼:

let input = msg.payload; let calc = flow.get('calc') || ''; if (input === 'AC') { calc = ''; } else if (input === '←') { calc = calc.slice(0, -1); } else if (input === '=') { try { // 將 "×" 和 "÷" 轉換為 JS 運算 let expression = calc.replace(/×/g, '*').replace(/÷/g, '/'); let result = eval(expression); calc = result.toString(); } catch (e) { calc = 'Error'; } } else { calc += input; } flow.set('calc', calc); msg.payload = calc; return msg;

顯示計算結果

新增一個 ui_text 節點(或 ui_text_input 只讀模式)
function 的輸出連接到這個節點,這樣按下按鍵時會即時顯示計算結果。


Node-Red程式

[

    {

        "id": "deb22e6cba6ba4fb",

        "type": "tab",

        "label": "流程1",

        "disabled": false,

        "info": "",

        "env": []

    },

    {

        "id": "f_calc_logic",

        "type": "function",

        "z": "deb22e6cba6ba4fb",

        "name": "計算邏輯",

        "func": "let input = msg.payload;\nlet calc = flow.get('calc') || '';\n\nif (input === 'AC') {\n    calc = '';\n} else if (input === '←') {\n    calc = calc.slice(0, -1);\n} else if (input === '=') {\n    try {\n        let expression = calc.replace(/×/g, '*').replace(/÷/g, '/');\n        let result = eval(expression);\n        calc = result.toString();\n    } catch (e) {\n        calc = 'Error';\n    }\n} else {\n    calc += input;\n}\n\nflow.set('calc', calc);\nmsg.payload = calc;\nreturn msg;",

        "outputs": 1,

        "noerr": 0,

        "x": 300,

        "y": 80,

        "wires": [

            [

                "t_display"

            ]

        ]

    },

    {

        "id": "t_display",

        "type": "ui_text",

        "z": "deb22e6cba6ba4fb",

        "group": "group_calc",

        "order": 1,

        "width": 4,

        "height": 1,

        "name": "display",

        "label": "",

        "format": "{{msg.payload}}",

        "layout": "row-spread",

        "x": 520,

        "y": 80,

        "wires": []

    },

    {

        "id": "btn_AC",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "AC",

        "group": "group_calc",

        "order": 2,

        "width": 1,

        "height": 1,

        "label": "AC",

        "payload": "AC",

        "payloadType": "str",

        "x": 60,

        "y": 140,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn_back",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "←",

        "group": "group_calc",

        "order": 3,

        "width": 1,

        "height": 1,

        "label": "←",

        "payload": "←",

        "payloadType": "str",

        "x": 120,

        "y": 140,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn_pct",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "%",

        "group": "group_calc",

        "order": 4,

        "width": 1,

        "height": 1,

        "label": "%",

        "payload": "%",

        "payloadType": "str",

        "x": 180,

        "y": 140,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn_div",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "÷",

        "group": "group_calc",

        "order": 5,

        "width": 1,

        "height": 1,

        "label": "÷",

        "payload": "÷",

        "payloadType": "str",

        "x": 240,

        "y": 140,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn7",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "7",

        "group": "group_calc",

        "order": 6,

        "width": 1,

        "height": 1,

        "label": "7",

        "payload": "7",

        "payloadType": "str",

        "x": 60,

        "y": 180,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn8",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "8",

        "group": "group_calc",

        "order": 7,

        "width": 1,

        "height": 1,

        "label": "8",

        "payload": "8",

        "payloadType": "str",

        "x": 120,

        "y": 180,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn9",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "9",

        "group": "group_calc",

        "order": 8,

        "width": 1,

        "height": 1,

        "label": "9",

        "payload": "9",

        "payloadType": "str",

        "x": 180,

        "y": 180,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn_mul",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "×",

        "group": "group_calc",

        "order": 9,

        "width": 1,

        "height": 1,

        "label": "×",

        "payload": "×",

        "payloadType": "str",

        "x": 240,

        "y": 180,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn4",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "4",

        "group": "group_calc",

        "order": 10,

        "width": 1,

        "height": 1,

        "label": "4",

        "payload": "4",

        "payloadType": "str",

        "x": 60,

        "y": 220,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn5",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "5",

        "group": "group_calc",

        "order": 11,

        "width": 1,

        "height": 1,

        "label": "5",

        "payload": "5",

        "payloadType": "str",

        "x": 120,

        "y": 220,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn6",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "6",

        "group": "group_calc",

        "order": 12,

        "width": 1,

        "height": 1,

        "label": "6",

        "payload": "6",

        "payloadType": "str",

        "x": 180,

        "y": 220,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn_sub",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "-",

        "group": "group_calc",

        "order": 13,

        "width": 1,

        "height": 1,

        "label": "-",

        "payload": "-",

        "payloadType": "str",

        "x": 240,

        "y": 220,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn1",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "1",

        "group": "group_calc",

        "order": 14,

        "width": 1,

        "height": 1,

        "label": "1",

        "payload": "1",

        "payloadType": "str",

        "x": 60,

        "y": 260,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn2",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "2",

        "group": "group_calc",

        "order": 15,

        "width": 1,

        "height": 1,

        "label": "2",

        "payload": "2",

        "payloadType": "str",

        "x": 120,

        "y": 260,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn3",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "3",

        "group": "group_calc",

        "order": 16,

        "width": 1,

        "height": 1,

        "label": "3",

        "payload": "3",

        "payloadType": "str",

        "x": 180,

        "y": 260,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn_add",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "+",

        "group": "group_calc",

        "order": 17,

        "width": 1,

        "height": 1,

        "label": "+",

        "payload": "+",

        "payloadType": "str",

        "x": 240,

        "y": 260,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn00",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "00",

        "group": "group_calc",

        "order": 19,

        "width": 1,

        "height": 1,

        "label": "00",

        "payload": "00",

        "payloadType": "str",

        "x": 60,

        "y": 300,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn0",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "0",

        "group": "group_calc",

        "order": 18,

        "width": 1,

        "height": 1,

        "label": "0",

        "payload": "0",

        "payloadType": "str",

        "x": 120,

        "y": 300,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn_dot",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": ".",

        "group": "group_calc",

        "order": 20,

        "width": 1,

        "height": 1,

        "label": ".",

        "payload": ".",

        "payloadType": "str",

        "x": 180,

        "y": 300,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "btn_eq",

        "type": "ui_button",

        "z": "deb22e6cba6ba4fb",

        "name": "=",

        "group": "group_calc",

        "order": 21,

        "width": 1,

        "height": 1,

        "label": "=",

        "payload": "=",

        "payloadType": "str",

        "x": 240,

        "y": 300,

        "wires": [

            [

                "f_calc_logic"

            ]

        ]

    },

    {

        "id": "group_calc",

        "type": "ui_group",

        "name": "主介面",

        "tab": "tab_calc",

        "order": 1,

        "disp": true,

        "width": 4,

        "collapse": false

    },

    {

        "id": "tab_calc",

        "type": "ui_tab",

        "name": "計算機",

        "icon": "dashboard",

        "order": 1

    }

]

沒有留言:

張貼留言

ESP32 (ESP-IDF in VS Code) MFRC522 + MQTT + PYTHON TKinter +SQLite

 ESP32 (ESP-IDF in VS Code) MFRC522 + MQTT + PYTHON TKinter +SQLite  ESP32 VS Code 程式 ; PlatformIO Project Configuration File ; ;   Build op...