一、总体概述
二、硬件系统
传感器模块调试
编译环境:
C编译器-IAR Embedded Workbench 带有C/C++编译器和调试器的集成开发环境(IDE)、实时操作系统和中间件、开发套件、硬件仿真器以及状态机建模工具。
------------------------------------------------------------------------------------------
新建工作空间
在一个工作空间下,可以包含多个工程,每个工程可以单独配置与编译、调试、下载等,十分适合工业化需求与系统管理。操作如下:File\New\Workspace,点击保存按钮,设置文件名后保存。
1、先创建一个工作区(Workspace)
2、创建一个工程并将创建的工程添加到工作区 选择Project->Create New Project。弹出Create New Project对话框,可以让用户按照模板创建新工程。
单片机中的串口是什么
最通俗的解释:一种通讯接口,用来传输一些数据。
硬件特性
1、主流单片机包括CPU、4KB容量的RAM、128 KB容量的ROM、
2个16位定时/计数器、4个8位并行口、全双工串口行口、ADC/DAC、SPI、I2C、ISP、IAP。
RAM(random access memory)即随机存储内存,这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。
ROM(Read-Only Memory)即只读内存,是一种只能读出事先所存数据的固态半导体存储器。
2、系统结构简单,使用方便,实现模块化;
3、单片机可靠性高,可工作到10^6 ~10^7小时无故障;
4、处理功能强,速度快。
5、低电压,低功耗,便于生产便携式产品
6、控制功能强
7、环境适应能力强
软件的使用:
1、Proteus的简介
EDA工具(仿真软件)
2、Keil C51的简介
DHT11用的是单总线协议,一次传送40位的数据。注意了,看到这一句话,也就是说我们每次读取DHT11的数据时,都要一次性读取40次,也就是读取40位。
并且数据前16位是与湿度相关的,中间16位是与温度相关的,最后八位是用来校验的,当我们校验成功后,证明这一次的温湿度结果正确的,我们单片机就可
以使用这个温湿度值;如果校验不通过,那么就代表我们这次读取出来的温湿度值,是错误的(也许是我们的时序错误了,也许是传感器的问题),我们不进
行采样。
单片机A/D转换,
A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。
但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。
单片机怎么和传感器通信连接
选择器材STM32、温湿度传感器、PM2.5传感器、分贝传感器、GPRS模块、LORA模块
选择开发IAR软件,通过ST-Link和单片机连接下载
单片机和lora模块
单片机和GPRS模块
调试:将USB转TTL串口与SIM模块连接
SIM800C通讯模块调试(一)用这个案例连接,然后用OneNet的案例调试
GPRS: 视频讲解 1,是GSM的一种移动数据业务,是2G移动通信的数据传输技术。 2,传输速率为几十kbps 3,永远在线,不会被呼入的电话打断 4,模块启动电流较大,约2A GPRS应用 1,目前应用最广泛的移动物联网解决方案。 2,信号覆盖面积最广的移动物联网,野外/山区/原野。 3,广泛应用于环境监测、自动抄表、电力公司输电线路检测、车联网、工程建筑质量监理、智慧农业等几乎所有户外移动物联网应用场景。 4,模块价格¥20-30 NB-IOT 1, NB-IoT,即窄带物联网(Narrow Band Internet of Things)。可直接部署于GSM网络、UMTS网络或LTE网络,部署成本低。 2,一种新兴技术,覆盖面积广,低功耗广域网。 3,资费低,未来可能取代GPRS 4,模块价格预计5美元。 视频讲解:https://weibo.com/tv/v/Gkiet9IYe?fid=1034:4fd2e7318d9a0eb317da2bfcfad19ee5
用loar模块进行数据传输
http://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=615488&highlight=E32-TTL-100
视频开发版调试
oneNet视频开发版,linux指令
执行好./wifi后自动回到命令行输入,每次进入修改一下保存!!!
vi config.json 每次进入都要假修改再保存退出
1、表的设计
https://www.cnblogs.com/chenchao1990/p/5311531.html?utm_source=tuicool&utm_medium=referral
2、echarts X轴数据显示不全问题
很奇怪,X轴只显示了部分节点。没有显示全。
在xAxis上加上下面的配置就能解决:
axisLabel :{
interval:0
}
坐标轴刻度标签的显示间隔,在类目轴中有效。
默认会采用标签不重叠的策略间隔显示标签,可以设置成 0 强制显示所有标签。
手机端推流,网页端直播
https://cloud.tencent.com/document/product/267/5704
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>地图坐标定位</title> <script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=67jMQ5DmYTe1TLMBKFUTcZAR"></script> {# 直播推流#} <script src="//qzonestyle.gtimg.cn/open/qcloud/video/live/h5/live_connect.js" charset="utf-8"></script>; {# <script src="http://vjs.zencdn.net/5.19/lang/zh-CN.js"></script>#} {# #} <style type="text/css"> body { margin: 0; padding: 0; font: 12px/1 "Microsoft Yahei", "微软雅黑", sans-serif; } p, span { font-family: 'Microsoft Yahei' !important; } #map { overflow: hidden } #allmap { float: left } #container { float: left } {# video#} </style> {# echarts #} <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-gl/echarts-gl.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-stat/ecStat.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/dataTool.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/world.js"></script> <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=ZUONbpqGBsYGXNIYHicvbAbM"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/bmap.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/simplex.js"></script> {# echarts #} </head> <body> <div id="map"> <div style="width: 800px; height: 503px;" id="allmap"></div> <div id="container" style="width: 600px;height: 400px"></div> </div> <div> <button style="width: 300px;height: 50px;" id="map1"> 定位到武汉黄鹤楼 </button> <button style="width: 300px;height: 50px;" id="map2"> 定位到武汉大学文理学部 </button> </div> {#<div id="video" style="width: 600px; height: 400px;"></div>#} <div id="id_video_container" ></div> </body> <iframe style="display: none;" id="geoPage" width="100%" height="30%" frameborder=0 scrolling="no" src="https://apis.map.qq.com/tools/geolocation?key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77&referer=myapp&effect=zoom"></iframe> <!-- 接收到位置信息后 通过 iframe 嵌入位置标注组件 --> <script type="text/javascript"> function ShowMap(zuobiao, name, addrsee, phone, chuanzhen, zoom) { var arrzuobiao = zuobiao.split(','); var map = new BMap.Map("allmap"); map.addControl(new BMap.OverviewMapControl()); map.centerAndZoom(new BMap.Point(arrzuobiao[0], arrzuobiao[1]), zoom); map.addControl(new BMap.NavigationControl()); var marker = new BMap.Marker(new BMap.Point(arrzuobiao[0], arrzuobiao[1])); map.addOverlay(marker); var infoWindow = new BMap.InfoWindow('<p style="color: #bf0008;font-size:14px;">' + name + '</p><p>地址:' + addrsee + '</p><p>电话:' + phone + '</p><p>传真:' + chuanzhen + '</p>'); marker.addEventListener("click", function () { this.openInfoWindow(infoWindow); }); marker.openInfoWindow(infoWindow); } var loc; var isMapInit = false; //监听定位组件的message事件 window.addEventListener('message', function (event) { loc = event.data; // 接收位置信息 //console.log('location', loc); if (loc && loc.module == 'geolocation') { //定位成功,防止其他应用也会向该页面post信息,需判断module是否为'geolocation' var markUrl = 'https://apis.map.qq.com/tools/poimarker' + '?marker=coord:' + loc.lat + ',' + loc.lng + ';title:我的位置;addr:' + (loc.addr || loc.city) + '&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77&referer=myapp'; //给位置展示组件赋值 // document.getElementById('markPage').src = markUrl; var lng = loc.lng//经度 var lat = loc.lat //维度 console.log(lng) ShowMap('' + lng + ',' + lat + '', 'dome', loc.city, '1388888888', '010-88888888', '20'); } else { console.log('定位失败'); } }, false); $('#map1').click(function () {//点击更换坐标 ShowMap('114.313479,30.547525', 'dome', '武汉', '武汉黄鹤楼', '888666888', '20'); $.ajax( { url: '', type: 'post', // success: function (data) { data = data['k2'] console.log(data); if (data) { var dom = document.getElementById("container"); var myChart = echarts.init(dom); var app = {}; option = null; option = { xAxis: { type: 'category', boundaryGap: false, axisLine: {onZero: false}, data: data[0].map(function (str) { return str.replace(' ', '\n') }), axisLabel: { interval: 0 } }, yAxis: { name: '温度', type: 'value' }, series: [{ data: data[1], type: 'line' }] }; ; if (option && typeof option === "object") { myChart.setOption(option, true); } } } }) }) $('#map2').click(function () {//点击更换坐标 ShowMap('114.368107,30.543083', 'dome', '武汉 ', '武汉大学文理学部', '021-66658888', '20'); // 登录验证 $.ajax( { url: '', type: 'post', // success: function (data) { data = data['k1'] console.log(data); if (data) { var dom = document.getElementById("container"); var myChart = echarts.init(dom); var app = {}; option = null; option = { xAxis: { type: 'category', data: data[0], }, yAxis: { type: 'value' }, series: [{ data: data[1], type: 'line' }] }; ; if (option && typeof option === "object") { myChart.setOption(option, true); } } } }) }) var option = { "live_url" : "rtmp://3891.liveplay.myqcloud.com/live/3891_user_c1c2c329_5224?bizid=3891&txSecret=d31ab37d0e5fb0967b80f0855ff6d93b&txTime=5C27718F", "live_url2" : "http://2000.liveplay.myqcloud.com/live/2000_2a1.flv", "width" : 480, "height" : 320 //...可选填其他属性 }; var player = new qcVideo.Player("id_video_container", option) </script> </html>
谷歌问题无法播放的问题
用Django 发送邮件的方法
1、通过ONENET文档中心的快速开始进行平台的注册及产品的创建。
2、设备联网,对准备上传的数据进行组包。可使用restful API或直接用平台写好的SDK
{“liu”:123}
3、设备和平台建立连接(通过设备ID和APIkey)
至此,您已经在OneNET上完成了产品的创建。
若您选择的是EDP,MQTT,HTTP,Modbus或者JT\T808作为接入协议,请进入公开协议产品指南了解详情;
若您选择的是RGMP作为接入协议,请进入私有协议产品指南了解详情。
1、采集终端:
从中移动onenet平台获取数据
import urllib #python3 DEVICE_ID='3*****6'#设备ID API_KEY='tJX4fe************WbQoGo= '#产品的APIKEY,是MAsterKey,具有最大权限 #获取的是数据流最近更新的数据点值 def http_get_data(): url='http://api.heclouds.com/devices/'+DEVICE_ID+'/datapoints' request = urllib.request.Request(url) request.add_header('api-key',API_KEY) request.get_method = lambda:'GET' # 设置HTTP的访问方式 request = urllib.request.urlopen(request) return request.read() post = str(http_get_data())#返回的报文转换成字符串格式 print('*'*100) print(post) str1=post.split('datapoints":')[1].split('[{')[1].split('},')[0] str2=post.split('datapoints":')[2].split('[{')[1].split('},')[0] str3=post.split('datapoints":')[3].split('[{')[1].split('},')[0] str4=post.split('datapoints":')[4].split('[{')[1].split('},')[0] str5=post.split('datapoints":')[5].split('[{')[1].split('},')[0] print('*'*100) print(str1) print('*'*100) print(str2) print('*'*100) print(str3) print('*'*100) print(str4) print('*'*100) print(str5) print('*'*100)
基于Django的环境监测系统
温度、湿度、PM2.5、视频模块
oneNet平台添加触发器设置报警规则,对超过预设阀值的异常环境数据进行报警以引起用户的注意
向用户预留的手机号码或邮箱进行消息报警
设置定时器功能,每5分钟上报一次,每5分钟采集一次
OneNET介绍学习资料、视频、例程代码汇总帖(2017年6月19日)
树莓派能用来做啥?
温度没问题
湿度
一、湿度,表示大气干燥程度的物理量。
二、在一定的温度下在一定体积的空气里含有的水汽越少,则空气越干燥;水汽越多,则空气越潮湿。
三、空气的干湿程度叫做“湿度”。在此意义下,常用绝对湿度、相对湿度、比较湿度、混合比、饱和差以及露点等物理量来表示。
四、若表示在湿蒸汽中水蒸气的重量占蒸汽总重量(体积)的百分比,则称之为蒸汽的湿度。
五、人体感觉舒适的湿度是:相对湿度低于70%。
分贝:
分贝(decibel)是量度两个相同单位之数量比例的计量单位,主要用于度量声音强度,常用dB表示。
pm2.5:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>地图坐标定位</title> <meta name="viewport" content="width=device-width,initial-scale=1"/> <link rel="stylesheet" href="/static/blog/bootstrap-3.3.7/css/bootstrap.css"> <script src="/static/JS/jquery-3.2.1.min.js"></script> <script src="/static/blog/bootstrap-3.3.7/js/bootstrap.min.js"></script> <script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=67jMQ5DmYTe1TLMBKFUTcZAR"></script> {# 直播推流#} <script src="//qzonestyle.gtimg.cn/open/qcloud/video/live/h5/live_connect.js" charset="utf-8"></script> {#导航栏#} <link rel="stylesheet" href="/static/css/index.css"> <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 --> {# #} {# <script src="http://vjs.zencdn.net/5.19/lang/zh-CN.js"></script>#} {# #} <style type="text/css"> body { margin: 0; padding: 0; font: 12px/1 "Microsoft Yahei", "微软雅黑", sans-serif; } p, span { font-family: 'Microsoft Yahei' !important; } #all, #all2 { overflow: hidden } #allmap { float: left } #show, #show2 { float: left } #show3, #id_video_container { float: left } </style> {# echarts #} <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-gl/echarts-gl.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-stat/ecStat.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/dataTool.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/world.js"></script> <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=ZUONbpqGBsYGXNIYHicvbAbM"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/bmap.min.js"></script> <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/simplex.js"></script> {# echarts #} </head> <body> {#导航栏#} <script type="text/javascript"> $(function () { $('.navbar-nav li ').click(function () { //添加类名addclass、siblings查找所有兄弟元素---不包括自己 $(this).addClass('active').siblings('li').removeClass('active'); }); }) </script> <nav class="navbar navbar-inverse"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/index/">首页</a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li id="person_index"><a href="/{{ request.user }}/">个人主页<span class="sr-only">(current)</span></a></li> <li id="notebook"><a href="/cn_backend/">笔记</a></li> <li id="monitor_center" class="active"><a href="/map/">监控中心</a></li> </ul> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid --> </nav> {#-------导航栏----end#} <div id="all"> <div style="width: 800px; height: 700px;" id="allmap"></div> {# 可视化图形 #} <div id="show"> <div id="container" style="width: 600px;height: 300px"> <div id="dashboard" style="width: 280px;height:280px;display:inline-block "></div> <div id="dashboard2" style="width: 280px;height:280px;display:inline-block "></div> </div> <div id="container2" style="width: 600px;height: 400px"></div> {# 所有传感器#} </div> <div id="show2"> <div id="container3" style="width: 600px;height: 300px"> <div id="dashboard3" style="width: 280px;height:280px"> <button type="button" class="btn btn-success">(成功)Success</button> </div> <div id="dashboard4" style="width: 280px;height:280px"> <button type="button" class="btn btn-info">(一般信息)Info</button> </div> </div> <div id="container4" style="width: 600px;height: 300px"></div> {# 视屏显示#} </div> </div> <div id="all2"> <div id="show3" style="width: 800px;height: 300px"> <button style="width: 300px;height: 50px;" id="map1"> 定位到武汉黄鹤楼 </button> <button style="width: 300px;height: 50px;" id="map2"> 定位到武汉大学文理学部 </button> </div> <div id="id_video_container"></div> </div> {#<div id="video" style="width: 600px; height: 400px;"></div>#} </body> <iframe style="display: none;" id="geoPage" width="100%" height="30%" frameborder=0 scrolling="no" src="https://apis.map.qq.com/tools/geolocation?key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77&referer=myapp&effect=zoom"></iframe> <!-- 接收到位置信息后 通过 iframe 嵌入位置标注组件 --> <script type="text/javascript"> function ShowMap(zuobiao, name, addrsee, administrator, phone, zoom) { var arrzuobiao = zuobiao.split(','); var map = new BMap.Map("allmap"); map.addControl(new BMap.OverviewMapControl()); map.centerAndZoom(new BMap.Point(arrzuobiao[0], arrzuobiao[1]), zoom); map.addControl(new BMap.NavigationControl()); var marker = new BMap.Marker(new BMap.Point(arrzuobiao[0], arrzuobiao[1])); map.addOverlay(marker); //var infoWindow = new BMap.InfoWindow('<p style="color: #bf0008;font-size:14px;">' + name + '</p><p>详细地址:' + addrsee + '</p>'); var infoWindow = new BMap.InfoWindow('<p style="color: #bf0008;font-size:14px;">' + name + '</p><p>地址:' + addrsee + '</p><p>负责人:' + administrator + '</p><p>电话:' + phone + '</p>'); marker.addEventListener("click", function () { this.openInfoWindow(infoWindow); }); marker.openInfoWindow(infoWindow); } var loc; var isMapInit = false; //监听定位组件的message事件 window.addEventListener('message', function (event) { loc = event.data; // 接收位置信息 //console.log('location', loc); if (loc && loc.module == 'geolocation') { //定位成功,防止其他应用也会向该页面post信息,需判断module是否为'geolocation' var markUrl = 'https://apis.map.qq.com/tools/poimarker' + '?marker=coord:' + loc.lat + ',' + loc.lng + ';title:我的位置;addr:' + (loc.addr || loc.city) + '&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77&referer=myapp'; //给位置展示组件赋值 // document.getElementById('markPage').src = markUrl; var lng = loc.lng//经度 var lat = loc.lat //维度 console.log(lng) ShowMap('' + lng + ',' + lat + '', '监测点', loc.city, 'someone', '18012346542', '20'); } else { console.log('定位失败'); } }, false); $('#map1').click(function () {//点击更换坐标 ShowMap('114.313479,30.547525', '监测点A', '武汉黄鹤楼', '张三', '13612346541', '20'); $.ajax( { url: '', type: 'post', // success: function (data) { //data = data['k2']//===[list,list2] console.log(data, typeof data); if (data) { var dom = document.getElementById("container2"); var myChart = echarts.init(dom); option = null; option = { title: { text: '传感器读数' }, tooltip: { trigger: 'axis' }, legend: { data: ['温度(℃)', '湿度(%)', 'PM2.5(μg/m3)', '分贝(dB)'] }, xAxis: { type: 'category', boundaryGap: false, axisLine: {onZero: false}, data: data['Humidity'][0].map(function (str) { return str.replace(' ', '\n') }), axisLabel: { interval: 0 } }, yAxis: { type: 'value' }, series: [ { name: '温度(℃)', type: 'line', data: data['Temperature'][1] }, { name: '湿度(%)', type: 'line', data: data['Humidity'][1] }, { name: 'PM2.5(μg/m3)', type: 'line', data: data['PM2_5_Content'][1] }, { name: '分贝(dB)', type: 'line', data: data['NoiseValue'][1] }, ] }; myChart.setOption(option, true); } //two if (data['new_Temperature']) { var dom2 = document.getElementById("dashboard"); var myChart2 = echarts.init(dom2); option = { series: [ { name: '业务指标', type: 'gauge', detail: {formatter: '{value}℃'}, data: [{value: data['new_Temperature'][1], name: '温度'}] }, ] }; myChart2.setOption(option, true); } //three if (data['new_Humidity']) { var dom3 = document.getElementById("dashboard2"); var myChart3 = echarts.init(dom3); option = { series: [ { name: '业务指标', type: 'gauge', detail: {formatter: '{value}%'}, data: [{value: data['new_Humidity'][1], name: '湿度'}] } ] }; myChart3.setOption(option, true); } //four } }) }); $('#map2').click(function () {//点击更换坐标 ShowMap('114.368107,30.543083', '监测点B', '武汉大学文理学部教5 ', '李四', '021-66658888', '20'); // 登录验证 $.ajax( { url: '', type: 'post', // success: function (data) { //data = data['k1'] console.log(data); if (data['NoiseValue']) { data4 = data['NoiseValue'] var dom = document.getElementById("container"); var myChart = echarts.init(dom); var app = {}; option = null; option = { xAxis: { type: 'category', data: data[0], }, yAxis: { type: 'value' }, series: [{ data: data[1], type: 'line' }] }; if (option && typeof option === "object") { myChart.setOption(option, true); } } } }) }); var option = { "live_url": "rtmp://3891.liveplay.myqcloud.com/live/3891_user_1693306d_5838?bizid=3891&txSecret=5d4c6dd2ab8b914246c56a58ef0495c3&txTime=5C2EB1C6", {#"live_url2" : "http://2000.liveplay.myqcloud.com/live/2000_2a1.flv",#} "width": 480, "height": 300 //...可选填其他属性 }; var player = new qcVideo.Player("container4", option) </script> </html>
Django网页开发
网页端百度地图引用出现问题: