|
如何正确的使用开源物联网系统 - MIVMS
如何正确的使用开源物联网系统 - MIVMS
MIVMS,全称为Mole intelligent vending machine system,为什么要取名为Mole,mole也就是鼹鼠,这和笔者看过的一部动画短片有关,短片名字叫Big Buck Bunny,是用开源动画软件Blender制作的,那里面有一只鼹鼠给我留下深刻影像,那贱贱的玩世不恭的小眼神顿时吸引了我,因此我把这套开源物联网系统取名为MIVMS,也是希望这套系统能有那么一点点与众不同。
项目地址:
https://gitee.com/akinggw/MIVMS/tree/master/f1c100s-rtt
这套东西很多,基本涉及到物联网的方方面面,我就不一一讲解,我们这篇文章中主要讲解关于基于全志f1c100s芯片上rt-thread系统的使用。
全志f1c100s是一颗性价比非常高的多媒体芯片,拥有32m的内存,但价格才8元左右,这么大的内存,能够让我们干许多有趣的事情。
rt-thread是一个rtos,也就是实时操作系统,是一个完全国产,功能全面,结构简单的系统。
我们的MIVMS就是基于他们基础之上编写而成,以便于更加简单高效的应用于物联网运用。
废话少说,让我们把系统跑起来吧
首先,要运行MIVMS,首先你需要购买一个f1c100s开发板,淘宝上可选的有2种,荔枝派nano大概36左右,widora tiny200,价格在50左右,另外最好能购买一块支持gt911触摸驱动,分辨率在800X480的电容触摸屏。最后因为我们的系统需要联网才能工作,因此,你还需要一个wifi芯片,建议购买nodemcu,或者其它基于esp8266的开发板。
首先nodemcu如果没有烧写固件,建议先烧写,固件和烧写工具在tools目录下:
esp8266_at_bin_v1.5.1_0.zip - 固件
ESP32-CAM烧录工具.rar - 烧写工具
烧写的文档在doc/esp8266下,按照文档所示进行烧写就可以了。
然后就是烧写MIVMS,MIVMS的烧写工具在tools下:
sunxi-tools-win32_f1_flash.zip
首先,先下载系统到本地:
git clone https://gitee.com/akinggw/MIVMS/
先烧写bootloader,bootloader在目录f1c100s-rtt/f1c100s_spl目录下的boot.bin。
烧写语句:
sunxi-fel -p spiflash-write 0x00000000 ../f1c100s_spl/boot.bin
我们这里使用了widora tiny200,它的进入烧写模式,是先按住BOOT按钮,然后再按下RESET按钮,然后再依次松开RESET按钮和BOOT按钮。
bootloader烧写完成后,我们再烧写主体程序固件,在目录
f1c100s-rtt/rt-thread/rtthread.bin。
烧写语句:
sunxi-fel -p spiflash-write 0x00010000 rtthread.bin
如果一切顺利,我们的系统就烧写完成了。
先照下图所示,将esp8266和widora tiny200进行连接:
如何正确的使用开源物联网系统 - MIVMS
然后,我们可以打开手机建立一个wifi热点,记住热点名称和密码,然后在widora tiny200上插入普通手机数据线,上电启动。
启动后会显示系统logo,如图所示:
如何正确的使用开源物联网系统 - MIVMS
然后开始连接wifi,第一次使用系统并没有保存wifi的信息,所以稍等几秒,会自动进入wifi设置,如图所示:
如何正确的使用开源物联网系统 - MIVMS
设置好你手机热点的wifi名称和密码后,系统将重启。然后会重新进入上面的页面,如果wifi连接成功后,系统会自动下载网站上的脚本文件,然后进行执行,因为这里的固件使用的是我的服务器,因此界面会显示一些我测试系统的东西。
如何正确的使用开源物联网系统 - MIVMS
如何烧写你自己的固件
先按照系统提供的文档搭建编译环境:
https://gitee.com/akinggw/MIVMS/tree/master/f1c100s-rtt
你最好先租一台vps,建立一个网站,然后上传f1c100s-rtt/lua_demo目录下main.lua文件到你的vps网站中,然后在rt-thread系统下进行配置,打开
f1c100s-rtt/rt-thread/rtconfig.h文件,然后搜索HTTP_LUA_URL。
然后设置成你的网站目录,比如像下面这样:
http://www.demo.cn/Public/main.lua
另外,我们这里rt-thread并没有支持https,只支持http。
你可以拷贝我们系统提供的一些测试代码到这个main.lua文件中进行测试,我们提供了许多功能的测试代码,都在f1c100s-rtt/lua_demo目录下。
一些系统控制命令
为了更方便的开发和调试程序,我们系统了一些基于mqtt的命令:
ota -- 用于更新系统固件
reset -- 重置系统固件,这里什么意思,比如你更新了系统固件,使用这个命令后,就会使用初始烧录的系统
restart -- 重新启动系统
lua -- 重新下载和启动脚本
这些系统的使用方法如下:
mosquitto_pub -h mq.tongxinmao.com -p 18830 -t /mqtt/system -m restart
lua 这个命令在我们修改脚本时非常有用,比如我们在网站上修改lua脚本后,就可以使用这个命令,让单片机重新下载和执行脚本。
这样就可以避免单片机反复烧录,另外这种方式对于远程修改系统需求和更改系统bug也非常有用。
系统使用和程序结构
笔者在设计MIVMS之前,有一段使用arduino的经验,arduino的系统结构给笔者留下了深刻的印象,因此我在设计MIVMS时也参考了arduino的这种程序结构,将arduino的这种简单使用的方法带入到MIVMS中。
下面我们来看一个点灯程序:
GPIO_PORT_A = 0;
GPIO_PIN_0 = 0;
IO_INPUT = 0;
IO_OUTPUT = 1;
function setup()
sys.println("gpio test.",0);
gpio.pinMode(GPIO_PORT_A,GPIO_PIN_0,IO_OUTPUT);
end
function loop()
gpio.digitalWrite(GPIO_PORT_A,GPIO_PIN_0,IO_OUTPUT);
sys.delay(1000);
gpio.digitalWrite(GPIO_PORT_A,GPIO_PIN_0,IO_INPUT);
sys.delay(1000);
end
和ardunio一样,我们的程序主结构也有两个函数,setup和loop。
setup用于系统一些资源的加载和一些系统配置。
loop是消息主循环
在上面这个程序中,sys.println用于换行打印日志,第二个参数表示是否要把日志通过mqtt发送,这个功能很有用,比如你要修改一台已经运营的机器,你不可能到现场去修改把,通过这个功能,日志会通过网络传送到本地进行查看。查看日志的命令如下:
mosquitto_sub -h mq.tongxinmao.com -p 18830 -t /mqtt/debug
sys.println还有另外一个命令sys.print是不换行输出。这里和arduino差不多,只是多了一个网络功能。
gpio.pinMode(GPIO_PORT_A,GPIO_PIN_0,IO_OUTPUT);
设置引脚0为输出,如果你接一个led,就可以查看到效果,led一闪一闪的。
以上是最基本的功能,下面我们再来看看mqtt的使用,代码如下:
function mqtt_sub_callback(topic_name,payload)
sys.println(topic_name..":"..payload,0);
if(payload == "test")
then
mqtt.Public("/mqtt/test","hello,the world!",0);
end
end
function setup()
sys.println("mqtt test.",0);
mqtt.Subscribe("/mqtt/test",0,mqtt_sub_callback);
end
function loop()
sys.delay(1000);
end
代码也非常简单,除了setup和loop函数外,我们有多了一个mqtt_sub_callback函数,这是一个回调函数,我们订阅一个mqtt消息时可以设置它的回调函数,比如这里代码:
mqtt.Subscribe("/mqtt/test",0,mqtt_sub_callback);
"/mqtt/test"就是我们订阅的消息,第二个参数是这个消息的质量,可以设置0,1,2三种质量。mqtt_sub_callback就是这个消息的回调,当我们收到这个消息时,消息就会到达这里进行处理。
function mqtt_sub_callback(topic_name,payload)
topic_name - 我们订阅的消息
payload - 消息内容
我们这里的代码是,我们订阅消息"/mqtt/test",如果我们收到"test"消息,就返回一个消息回去。
最后,我们再展示gui的一个使用例子:
button1 = -1;
button2 = -1;
imgbtnres = -1;
HIDDEN = 0;
SHOW = 1;
function btn_event(objindex,event)
if(event == 6)
then
sys.println(objindex..":"..event,0);
if(objindex == button1)
then
gui.addMsgbox("你点到普通按钮了");
elseif(objindex == button2)
then
gui.addMsgbox("你点到图形按钮了");
end
end
end
function setup()
sys.println("gui btn test.",0);
gui.setStatus(1,"正在加载资源,请稍后...");
sys.delay(10);
imgbtnres = gui.addImgres("http://www.51sccy.cn/Public/logo.png",-1);
sys.delay(10);
button1 = gui.addButton("测试按钮",0,50,100,HIDDEN,btn_event);
gui.setSize(button1,150,30);
button2 = gui.addImgbtn(imgbtnres,imgbtnres,0,250,100,HIDDEN,btn_event);
--gui.setSize(button1,150,30);
gui.setStatus(0,"");
gui.setDisplay(button1,SHOW);
gui.setDisplay(button2,SHOW);
end
function loop()
sys.delay(10);
end
这里,我们使用了最常用的按钮控件来进行演示,按钮控件分成普通按钮和图像按钮,我们下面来详细看看代码。
gui.setStatus(1,"正在加载资源,请稍后...");
显示一个状态消息
sys.delay(10);
延时10个tick
imgbtnres = gui.addImgres("http://www.51sccy.cn/Public/logo.png",-1);
从指定网站下载图片,第一个参数是网络图片的下载地址,第一个参数是指定的索引,这个参数一般情况下设置成-1,它只有当和删除图片资源配合时才能使用,否则有内存泄露的风险,请小心使用。
图片资源加载成功后,就返回一个图片资源的索引ID。
另外值得注意的是,我们的控件数量和图片资源数量最大只支持100个,当然这个可调,具体请看代码。
button1 = gui.addButton("测试按钮",0,50,100,HIDDEN,btn_event);
然后添加一个普通按钮,第一个参数是按钮名字,第二个参数表示按钮是否为toggle按钮,一般情况设置成0,第三第四个参数是显示位置,第五个参数是表示是否添加后就显示,第六个参数是事件回调函数。
按钮建立成功后返回控件索引ID。
button2 = gui.addImgbtn(imgbtnres,imgbtnres,0,250,100,HIDDEN,btn_event);
然后添加图像按钮,唯一不同的是前两个参数,分别表示正常和按下后显示的图片索引ID。
gui.setStatus(0,"");
gui.setDisplay(button1,SHOW);
gui.setDisplay(button2,SHOW);
然后隐藏状态消息,把所有按钮显示出来。
我们来看看事件回调函数:
function btn_event(objindex,event)
if(event == 6)
then
sys.println(objindex..":"..event,0);
if(objindex == button1)
then
gui.addMsgbox("你点到普通按钮了");
elseif(objindex == button2)
then
gui.addMsgbox("你点到图形按钮了");
end
end
end
objindex就是我们前面建立的控件的索引ID,event是事件ID,关于event的解析,请参考代码或者littlevgl,littlevgl是一个成熟的开源的GUI库,可以去它的官网查看文档。
我们这里代码的解释是,你点击某个按钮就弹一个相应的消息框出来。
从以上这些代码可以看出,我们的系统使用非常的简单,感觉比ardunio还要简单,有莫有。
当然,MIVMS拥有的功能还有很多,需要你慢慢去发现。
系统不足和一些远景规划
系统可能还存在一些未知的bug,当然这些bug,我们会在后期的运用中慢慢修改。
另外,系统不支持音频,视频,摄像头等等东西,这些也需要在后期增加。
最后祝你游戏愉快!
————————————————
版权声明:本文为CSDN博主「akinggw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/akinggw/article/details/106765072 |
|