初学HTML5,用eCharts做了一个空气质量检测仪

一直想自己动手做一个室内空气质量检测仪,主要关心颗粒物浓度、二氧化碳浓度和温湿度指标。

设计方案

网上也找到了一些爱好者作品的演示,发现大多是基于单片机+传感器+显示器的方案。比如下面这个x宝找到的:

笔者在多年以前也做过类似的产品开发。做这样一个界面,先要在pc机上规划好显示的页面,然后抠字模、扣图标,把这些字模和图标用专用的工具软件转为单片机能识别的格式,放到单片机存储空间的特定位置供程序绘图时调用。一个产品开发怎么也得3个月到半年的时间,其中主要的工作量在人机界面,需要堆砌大量的底层代码逻辑,这些底层代码的重用性是很差的,如果不大批量生产,这些劳动没有多少价值可言。

前端

最近由于工作的需要,刚好学习了一些前端HTML5 DIV+CSS的基础知识,就在想能不能用html5代码来码一个这样的界面呢?说干就干,直接在浏览器当中写代码,第一版的显示界面是这样的:

直接用div堆砌的色块,然后在里面显示各种空气质量参数。做好以后发现一个问题,满屏都是数字看得人眼花缭乱,头晕。

果断换用百度的eCharts,数据用图表方式显示:

Javascripts代码:

<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="js/popper.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/echarts.min.js"></script>
<script type="text/javascript">

$(document).ready(function(){
		var t = setInterval(tupdate, 1000);

            var pm25Chart = echarts.init(document.getElementById('pm2-5'));
            var pm25option = {
            title: {
                text: 'PM2.5', //
                x: 'center',
            },
            grid:{
                x:20,
                y:30,
                x2:20,
                y2:10,
            },
            series: [{
            name: 'PM2.5',
            type: 'gauge',
            min: 0,
            max: 400,  
            splitNumber: 8,
            axisLine: {
                lineStyle: {
                    color:[
                        [12/400, '#006000'],
                        [35.4/400, '#FFDC35'],
                        [55.4/400, '#FF8000'],
                        [150.4/400, '#EA0000'],
                        [250.4/400, '#460046'],
                        [400/400, '#750000']                     
                    ],
                    width:3,
                }
            },
            axisLabel: {
            	show:false,
            },

                detail: {formatter:'{value}',
                offsetCenter:[0,'60%'],
                	},
                data: [{value: 45.1, name: 'ug/m3'}]
            }]

            };
            
    function hchoupdate(data) {
        if (hchooption.series[0].data[0]['value'] != data/1000) {
        hchooption.series[0].data[0]['value'] = data/1000;
        hchoChart.setOption(hchooption);
      }
    	}

    function humiupdate(data) {
        $("#humin div.para_data").text(String(Math.round(data/10)));
    	}

    function tempupdate(data) {
        $("#temp div.para_data").text(String(Math.round(data/10)));
    }
                                                            
    function tupdate() {
    var d=new Date();
    var hours=d.getHours();
    var minutes=d.getMinutes();	
    var seconds=d.getSeconds();
    $("#date-time div.date").text(d.toDateString());
    $("#date-time div.time").text(((hours  <  10)  ?  "0"  :  "")+hours+":"+((minutes  <  10)  ?  "0"  :  "")+minutes+":"+((seconds  <  10)  ?  "0"  :  "")+seconds);

    $.getJSON("/air-quality-get", function(data) {
        for (var key in data) {
            if (key == 'co2Data')
                co2update(data['co2Data']);
            else if (key == 'hchoData')
                hchoupdate(data['hchoData']);
            else if (key == 'tempData')
                tempupdate(data['tempData']);
            else if (key == 'humiData')
                humiupdate(data['humiData']);
            else if (key == 'pm1Data')
                pm1update(data['pm1Data']);
            else if (key == 'pm10Data')
                pm10update(data['pm10Data']);
            else if (key == 'pm25Data')
                pm25update(data['pm25Data']);               
        }
 
    });

}

});
</script>

以上是javascripts的代码,有所简略。因为首页要放置一个菜单,所以还用到了bootstrap。

后端

关于后端,本来打算采用树莓派,直接通过GPIO扩展口和传感器模块相连。但是这里又有一个问题,市面上能买到的空气质量传感器,比如攀藤的PMS系列,Senseair的S8系列,都是串口通讯,而树莓派的扩展IO口,一共只有一个UART,还是和板内蓝牙共享的。所以后来采用了一块国产的单板计算机Innostick6,它有六个串口也支持Debian。

 

几点体会

1、采用HTML5做交互,和采用C语言像素描点完全不在一个层面上

没有编程基础的人也可以做这个工作,前端设计有很多中间件可以免费获得,因此真正的工作量就是调整和改善UI。这一点我觉得特别适合一些创新项目或者展示项目,可以把精力集中到应用上。

2、关于性能问题

这些年由于芯片技术的发展,尤其是手机芯片的突飞猛进。低功耗高性能的芯片层出不穷,在无风扇无散热的条件下跑一个桌面操作系统已经很平常了。笔者采用的就是一个ARM Cortex-A7单核的嵌入式计算机,运行Debian stretch,后端采用Python Flask架构,前端跑浏览器+eCharts,3000点的仪表盘显示cpu表示无压力。

 

最后放一张整体层次图

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值