尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

esp32集成lua

esp32集成lua
📅 发布时间:2026/7/26 11:48:23

参考

lua在线运行.luatos
lua菜鸟教程.runoob
嵌入式终端AtShell的精简版.csdn

工程目录

要下载 lua-5.4.2.tar.gz

lib/ └──lua-5.4.2/src/* └──src └──── LuaEngine.h └──── LuaEngine.cpp └──── LuaGPIO.h └──── LuaGPIO.cpp └──── main.cpp platformio.ini

源码

platformio.ini

[platformio]src_dir=.[env:pico32]platform=espressif32 board=pico32 framework=arduino monitor_speed=115200monitor_port=COM3 upload_port=COM3 upload_speed=921600build_flags=-Isrc-Ilib/lua-5.4.2/src-DLUA_32BITSbuild_src_filter=+<src/>+<lib/lua-5.4.2/src/>-<lib/lua-5.4.2/src/lua.c>-<lib/lua-5.4.2/src/luac.c>

main.cpp

#include<Arduino.h>#include"LuaEngine.h"#include"LuaGPIO.h"structMotor{intspeed;floatvoltage;bool enable;};Motor motor;intg_mode;floatg_vol;LuaField motorFields[]={{"speed",LUA_FIELD_INT,offsetof(Motor,speed),0},{"voltage",LUA_FIELD_FLOAT,offsetof(Motor,voltage),0},{"enable",LUA_FIELD_BOOL,offsetof(Motor,enable),0}};staticintshowMotorInfo(lua_State*L){printf("g_mode=%d\r\n",g_mode);printf("g_vol=%f\r\n",g_vol);printf("motor.speed=%d\r\n",motor.speed);printf("motor.voltage=%f\r\n",motor.voltage);printf("motor.enable=%d\r\n",motor.enable);return0;}voidsetup(){Serial.begin(115200);Lua.init();luaRegisterGPIO();//绑定变量LUA_BIND_INT(g_mode);LUA_BIND_FLOAT(g_vol);LUA_BIND_STRUCT(motor,motorFields,3);//绑定函数LUA_BIND_FUNC(showMotorInfo);Serial.println("Lua Ready");}String script;voidloop(){while(Serial.available()){String line=Serial.readStringUntil('\n');line.trim();if(line=="END"){Lua.run(script.c_str());script="";}else{script+=line;script+="\n";}}}

LuaEngine.h

#ifndefLUA_ENGINE_H#defineLUA_ENGINE_Hextern"C"{#include"lua.h"#include"lauxlib.h"#include"lualib.h"}#include<stddef.h>enumLuaFieldType{LUA_FIELD_INT,LUA_FIELD_FLOAT,LUA_FIELD_BOOL,LUA_FIELD_STRING};structLuaField{constchar*name;LuaFieldType type;size_toffset;size_tsize;};class LuaEngine{public:lua_State*L;voidinit();voidrun(constchar*code);// 添加普通函数voidregisterFunction(constchar*name,lua_CFunction func);// 创建模块voidbeginModule(constchar*name);// 添加模块函数voidaddFunction(constchar*name,lua_CFunction func);// 结束模块voidendModule(constchar*name);//变量绑定voidbindInt(constchar*name,int*ptr);voidbindFloat(constchar*name,float*ptr);voidbindStruct(constchar*name,void*ptr,constLuaField*fields,intcount);private:staticintintIndex(lua_State*L);staticintintNewIndex(lua_State*L);staticintfloatIndex(lua_State*L);staticintfloatNewIndex(lua_State*L);staticintboolIndex(lua_State*L);staticintboolNewIndex(lua_State*L);staticintstructIndex(lua_State*L);staticintstructNewIndex(lua_State*L);};//绑定#defineLUA_BIND_FUNC(func)Lua.registerFunction(#func,func)#defineLUA_BIND_INT(v)Lua.bindInt(#v,&v)#defineLUA_BIND_FLOAT(v)Lua.bindFloat(#v,&v)#defineLUA_BIND_STRUCT(v,fields,count)Lua.bindStruct(#v,&v,fields,count)externLuaEngine Lua;#endif

LuaEngine.cpp

#include"LuaEngine.h"#include<Arduino.h>LuaEngine Lua;// 当前模块名字voidLuaEngine::init(){L=luaL_newstate();luaL_openlibs(L);}voidLuaEngine::run(constchar*code){intret=luaL_dostring(L,code);if(ret!=LUA_OK){Serial.print("Lua Error:");Serial.println(lua_tostring(L,-1));lua_pop(L,1);}}voidLuaEngine::registerFunction(constchar*name,lua_CFunction func){lua_register(L,name,func);}voidLuaEngine::beginModule(constchar*name){lua_newtable(L);}voidLuaEngine::addFunction(constchar*name,lua_CFunction func){lua_pushcfunction(L,func);lua_setfield(L,-2,name);}voidLuaEngine::endModule(constchar*name){lua_setglobal(L,name);}//int绑定structLuaIntObject{int*ptr;};intLuaEngine::intIndex(lua_State*L){LuaIntObject*obj=(LuaIntObject*)lua_touserdata(L,1);constchar*key=lua_tostring(L,2);if(strcmp(key,"value")==0){lua_pushinteger(L,*(obj->ptr));return1;}return0;}intLuaEngine::intNewIndex(lua_State*L){LuaIntObject*obj=(LuaIntObject*)lua_touserdata(L,1);constchar*key=lua_tostring(L,2);if(strcmp(key,"value")==0){*(obj->ptr)=luaL_checkinteger(L,3);}return0;}voidLuaEngine::bindInt(constchar*name,int*ptr){LuaIntObject*obj=(LuaIntObject*)lua_newuserdata(L,sizeof(LuaIntObject));obj->ptr=ptr;lua_newtable(L);lua_pushcfunction(L,intIndex);lua_setfield(L,-2,"__index");lua_pushcfunction(L,intNewIndex);lua_setfield(L,-2,"__newindex");lua_setmetatable(L,-2);lua_setglobal(L,name);}//float绑定structLuaFloatObject{float*ptr;};intLuaEngine::floatIndex(lua_State*L){LuaFloatObject*obj=(LuaFloatObject*)lua_touserdata(L,1);constchar*key=lua_tostring(L,2);if(strcmp(key,"value")==0){lua_pushnumber(L,*(obj->ptr));return1;}return0;}intLuaEngine::floatNewIndex(lua_State*L){LuaFloatObject*obj=(LuaFloatObject*)lua_touserdata(L,1);constchar*key=lua_tostring(L,2);if(strcmp(key,"value")==0){*(obj->ptr)=luaL_checknumber(L,3);}return0;}voidLuaEngine::bindFloat(constchar*name,float*ptr){LuaFloatObject*obj=(LuaFloatObject*)lua_newuserdata(L,sizeof(LuaFloatObject));obj->ptr=ptr;lua_newtable(L);lua_pushcfunction(L,floatIndex);lua_setfield(L,-2,"__index");lua_pushcfunction(L,floatNewIndex);lua_setfield(L,-2,"__newindex");lua_setmetatable(L,-2);lua_setglobal(L,name);}structLuaStructObject{void*ptr;constLuaField*fields;intcount;};staticLuaField*findField(LuaStructObject*obj,constchar*name){for(inti=0;i<obj->count;i++){if(strcmp(obj->fields[i].name,name)==0){return(LuaField*)&obj->fields[i];}}returnNULL;}intLuaEngine::structIndex(lua_State*L){LuaStructObject*obj=(LuaStructObject*)lua_touserdata(L,1);constchar*key=lua_tostring(L,2);LuaField*field=findField(obj,key);if(field==NULL)return0;uint8_t*addr=(uint8_t*)obj->ptr+field->offset;switch(field->type){caseLUA_FIELD_INT:lua_pushinteger(L,*(int*)addr);break;caseLUA_FIELD_FLOAT:lua_pushnumber(L,*(float*)addr);break;caseLUA_FIELD_BOOL:lua_pushboolean(L,*(bool*)addr);break;caseLUA_FIELD_STRING:lua_pushstring(L,(char*)addr);break;}return1;}intLuaEngine::structNewIndex(lua_State*L){LuaStructObject*obj=(LuaStructObject*)lua_touserdata(L,1);constchar*key=lua_tostring(L,2);LuaField*field=findField(obj,key);if(field==NULL)return0;uint8_t*addr=(uint8_t*)obj->ptr+field->offset;switch(field->type){caseLUA_FIELD_INT:*(int*)addr=luaL_checkinteger(L,3);break;caseLUA_FIELD_FLOAT:*(float*)addr=luaL_checknumber(L,3);break;caseLUA_FIELD_BOOL:*(bool*)addr=lua_toboolean(L,3);break;caseLUA_FIELD_STRING:strncpy((char*)addr,luaL_checkstring(L,3),field->size-1);break;}return0;}voidLuaEngine::bindStruct(constchar*name,void*ptr,constLuaField*fields,intcount){LuaStructObject*obj;obj=(LuaStructObject*)lua_newuserdata(L,sizeof(LuaStructObject));obj->ptr=ptr;obj->fields=fields;obj->count=count;lua_newtable(L);lua_pushcfunction(L,structIndex);lua_setfield(L,-2,"__index");lua_pushcfunction(L,structNewIndex);lua_setfield(L,-2,"__newindex");lua_setmetatable(L,-2);lua_setglobal(L,name);}

LuaGPIO.h

#ifndefLUA_GPIO_H#defineLUA_GPIO_HvoidluaRegisterGPIO();#endif

LuaGPIO.cpp

#include<Arduino.h>#include"LuaEngine.h"#include"LuaGPIO.h"staticintlua_gpio_write(lua_State*L){intpin=luaL_checkinteger(L,1);intvalue=luaL_checkinteger(L,2);pinMode(pin,OUTPUT);digitalWrite(pin,value);return0;}staticintlua_gpio_read(lua_State*L){intpin=luaL_checkinteger(L,1);pinMode(pin,INPUT);lua_pushinteger(L,digitalRead(pin));return1;}voidluaRegisterGPIO(){Lua.beginModule("gpio");//gpio.write(pin, value)Lua.addFunction("write",lua_gpio_write);// gpio.read(pin)Lua.addFunction("read",lua_gpio_read);Lua.endModule("gpio");}

测试

读写全局变量

[20:47:29.752]发→◇g_mode.value=7;g_vol.value=1.5;motor.speed=5;motor.voltage=5.3;motor.enable=1;showMotorInfo()END □[20:47:29.765]收←◆g_mode=7g_vol=1.500000motor.speed=5motor.voltage=5.300000motor.enable=1

读按键

[18:25:11.359]发→◇s1=gpio.read(0)print(s1);END □[18:25:11.367]收←◆1

算术运算

[18:27:31.432]发→◇s1=1+2 print(s1);END □[18:27:31.438]收←◆3

开灯

[18:29:51.824]发→◇gpio.write(2,1)END

关灯

[18:30:17.479]发→◇gpio.write(2,0)END

相关新闻

  • 2026年GEO相关源头厂家实力测评,价格透明才是真口碑 - 工业推荐榜
  • 函数堆栈图
  • TMS320C6743 DSP硬件设计:引脚配置、电源时序与时钟系统实战指南

最新新闻

  • CC27xx SACI接口实战:安全启动、Flash编程与调试认证全解析
  • 什么岗位该用猎头?2026年企业招聘账本:自招和猎头哪个更划算?
  • 7步攻克Kotaemon文档聊天工具配置难题:从零到精通的实战指南
  • 终极指南:如何用15个免费Illustrator脚本提升10倍设计效率 [特殊字符]
  • 建瓯黄金回收避坑全攻略|本地 30 年老店靠谱回收渠道汇总(城乡通用) - 福顺金黄金回收
  • Unity多人射击游戏开发:基于Photon Fusion 2的状态同步与网络对战实现

日新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号