如何正确的使用开源物联网系统 - MIVMS-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5048|回复: 0

如何正确的使用开源物联网系统 - MIVMS

[复制链接]
发表于 2020-6-15 16:27 | 显示全部楼层 |阅读模式
如何正确的使用开源物联网系统 - 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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 04:45 , Processed in 0.252017 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表