A Lua-powered system for ESP32 with clean, modular architecture.
seluna/
├── include/
│ ├── config.h # Global configuration
│ ├── core/
│ │ └── LuaRunner.h # Lua interpreter wrapper
│ └── filesystem/
│ └── FileSystemManager.h # SPIFFS file operations
├── src/
│ ├── main.cpp # Application entry point
│ ├── core/
│ │ └── LuaRunner.cpp
│ └── filesystem/
│ └── FileSystemManager.cpp
├── data/ # Files uploaded to SPIFFS
│ ├── main.lua # Main Lua script
│ └── lib/ # Lua modules
└── lib/
└── lua/ # Lua 5.4 source
- ✅ Clean separation of concerns (Core, FileSystem, Config)
- ✅ Lua 5.4 interpreter integration
- ✅ Custom
require()loader for SPIFFS modules - ✅ File system manager for easy file operations
- ✅ Raspberry Pi style GPIO - Familiar RPi.GPIO interface (C++ implementation)
- ✅ PWM support - Hardware PWM dengan API simple
- ✅ IntelliSense support - Autocomplete untuk semua fungsi
- ✅ Configurable via config.h
- ✅ Module search paths:
/,/lib/,/modules/
data/main.lua:
-- Raspberry Pi style GPIO control
local GPIO = require("gpio")
-- Simple LED blink
GPIO.setup(2, GPIO.OUT)
GPIO.output(2, GPIO.HIGH)
GPIO.sleep(1)
GPIO.output(2, GPIO.LOW)
-- PWM for LED dimming
local pwm = GPIO.PWM(2, 1000)
pwm:start(50) -- 50% brightnessdata/lib/helper.lua:
local M = {}
function M.greet(name)
print("Hello, " .. name .. "!")
end
return M# Upload filesystem
pio run --target uploadfs
# Upload code
pio run --target upload
# Monitor
pio device monitorEdit include/config.h:
#define SERIAL_BAUD_RATE 115200
#define LUA_MAIN_SCRIPT "/main.lua"
#define DEBUG_ENABLED trueLuaRunner runner;
runner.init(); // Initialize
runner.executeFile("/script.lua"); // Load & run
runner.cleanup(); // Clean upFileSystemManager::init();
FileSystemManager::readFile("/file");
FileSystemManager::writeFile("/file", "content");
FileSystemManager::listFiles("/");Raspberry Pi Style (Recommended):
local GPIO = require("gpio")
Seluna menggunakan **Raspberry Pi style GPIO API** (implementasi C++ untuk performa optimal):
```lua
local GPIO = require("gpio")
-- Setup and control
GPIO.setup(2, GPIO.OUT)
GPIO.output(2, GPIO.HIGH) -- or GPIO.output(2, true)
GPIO.toggle(2)
-- Input
GPIO.setup(4, GPIO.IN)
value = GPIO.input(4)
-- PWM control
local pwm = GPIO.PWM(2, 1000) -- Pin 2, 1kHz
pwm:start(50) -- 50% duty cycle
pwm:ChangeDutyCycle(75)
pwm:stop()
-- Timing
GPIO.sleep(1) -- 1 secondLihat docs/RPI_GPIO.md dan docs/CPP_GPIO_BINDINGS.md untuk dokumentasi lengkap
-
Install Lua Extension:
- Open VS Code Extensions (
Cmd+Shift+X) - Search "Lua" by sumneko
- Click Install
- Open VS Code Extensions (
-
Start typing in any
.luafile:pin█ -- Autocomplete shows: pinMode, etc.
-
See parameter hints as you type:
pinMode(█) ^-- Shows: pin: number, mode: number
See docs/INTELLISENSE.md for complete setup guide.
Contoh penggunaan GPIO dengan Raspberry Pi style API:
-- LED blink
local GPIO = require("gpio")
GPIO.setup(2, GPIO.OUT)
for i = 1, 5 do
GPIO.output(2, true)
GPIO.sleep(0.5)
GPIO.output(2, false)
GPIO.sleep(0.5)
end
-- PWM LED dimming
local pwm = GPIO.PWM(2, 1000)
pwm:start(0)
for duty = 0, 100, 5 do
pwm:ChangeDutyCycle(duty)
GPIO.sleep(0.1)
end
pwm:stop()
-- Button input
GPIO.setup(4, GPIO.IN)
if GPIO.input(4) == GPIO.HIGH then
print("Button pressed!")
end└──────────────┬─────────────────────────┘ │ ┌──────────────▼─────────────────────────┐ │ ESP32 Hardware (Arduino API) │ │ - pinMode, digitalWrite │ │ - ledcSetup, ledcWrite │ └────────────────────────────────────────┘
**Components:**
- **Core**: Lua interpreter (LuaRunner)
- **FileSystem**: SPIFFS file operations
- **Bindings**: C++ GPIO dengan Raspberry Pi style API
- **Config**: Centralized setting