初探物联网 - 基于Arduino的气象站和View and Data API的结合实例

简介:


如果你参加了上个月在北京的Autodesk 开发者日,你应该看到了我做的关于Arduino的物联网实例演示,如果你没看到,欢迎参加14号在上海的开发者日,到时候我会再演(xian)示(bai)一下。

这是个基于这样一个场景的简单演示。我的一个建筑物上面安装了这样一个温度传感器,随时把当前环境温度上传到云端,在浏览器端可以显示这个建筑物的三维模型和温度变化曲线图。如果温度到达一定的高温,比如大于40度,那可能是起火了,就需要发出高温报警,在三维模型中定位出报警的温度传感器的位置,并发出火警警报。

演示地址 : http://arduiview.herokuapp.com/ 

 

继续之前你可能需要阅读一下我前面的两篇文章:

迈出物联网的第一步,玩儿一下Arduino

使用 Arduino 和 LM35 温度传感器监测温度

 

下面简单介绍一下这个实例系统的实现。下图为系统的架构图, Arduino 和 Viewer都通过REST 的方式和云端的服务器进行通信。Arduino 定时把当前温度通过REST的方式上传,Viewer定时取得温度信息并绘制曲线图,如遇高温则报警。貌似相当简单,这种基于HTTP的REST API方式的一个缺点就是实时性不好,需要进行轮询。后面我做了改进,通过WebSocket和MQTT协议,可以实现更好的实时传输,这个我们后面再说。

Screen Shot 2015-12-03 at 2.50.53 PM

 

下图就是Arduino 和LM 35温度传感器的链接情况。Arduino 本身并没有联网功能,所以还需要一个额外的设备,我采用了CC3000 WiFi Shield模块,在淘宝上也可以买到。把Arduino 和CC3000两个套在一起,然后按照前面文章中提到的方式把温度传感器连接起来即可。

arduino-lm35

然后我们需要写些代码驱动CC3300 WiFi模块联网。我们可以使用Adafruite CC3000 Library 。 在Arduino IDE里面,“Project” –> “Include Libraries” –> “Manage Libraries”, 搜索“CC3000”,找到这个类库安装。然后你可以阅读一下自带的例子。这一点Arduino 做的非常好,每个类库都有完备的实例,拿过来改一下就可以了。

 Screen Shot 2015-12-03 at 1.25.34 PM

 

下面我们需要创建云端的服务器,我用node.js来创建并且暴露了一些REST API。其中一个就是用来解释Arduino上传的温度数据的REST API。如下所示:

PUT /sensors/somesensorId/values

body:

{

value : 22

}

node.js中路由部分的代码实现为:

router.route('/sensors/:sensorId/values')
  .get(sensorController.getSensorValues)
  .put(sensorController.appendSensorValues);

下面是sensorController控制器的实现代码。这里没有列出的是,其实后端我还使用的mongoose和mongoDb以便把上传的温度数据保存起来,这样以后就可以做大数据分析了。不过这个例子只是为了演示,我也没保存全部数据,只是保存了最近50多个。

exports.appendSensorValues = function(req,res){  //append

    //we just save 50 + 1 values items to save db spaces
    var MAX_VAULE_ITEM_COUNT = 50;

    var sensorId = req.params.sensorId;

    Sensor.findById(sensorId, function(err, sensor){
      if(err)
        res.json(err);

      var sensorValueItem = {};
      sensorValueItem.timestamp = new Date().getTime();
      sensorValueItem.value = req.body.value;

      //console.log(sensorValueItem);
      var len = sensor.values.length;
      sensor.values = sensor.values.slice(len - MAX_VAULE_ITEM_COUNT );

      sensor.values = sensor.values.concat(sensorValueItem);

      sensor.save(function(err){
        
        if(err)
          res.send(err);

        res.json(sensorValueItem);
      })
    });

}

这里的代码还是挂一漏万,如果大家感兴趣还是在github上看完整代码.https://github.com/duchangyu/project-arduivew/tree/v0.1,

 

下面来实现Arduino的部分,获取温度并通过REST的方式上传。前面提到的CC3000提供的实例已经演示了怎么连接到WiFi并上网,这里略过,如果你感兴趣可以看我的完整代码。这里我们只说说Arduino怎么发送REST请求的部分。在Arduino里面,我没有找到好的REST 的client库,不过说起来也不复杂,就是按照HTTP的协议发送原生字符串即可。按照我们的REST接口的定义,上传的REST协议应该是这样的:

PUT /api/sensors/somesensorid/value HTTP/1.1

HOST: arduiview.heroku.com

content-type : application/json

Content-Length : 19

{

value : 22

}

 

下面就是构建这样的字符串,然后通过CC3000客户端发送出去即可,代码片段如下:

void postTemperatureToCloudServer() {

  //connectToCloudServer
  Serial.println(F("trying to connect to cloud server....."));
  //client.close();
  client = cc3000.connectTCP(ip, 80);

  Serial.println(F("connected to cloud server - "));
  Serial.println(WEBSITE );

  Serial.println(F("begin uploading..."));

  float temp = 0.0;
  // get the current temperature from sensor
  int reading = analogRead(0);
  temp = reading * 0.0048828125 * 100;
  Serial.print(F("Current temp"));
  Serial.println(temp);

  int length;
  char sTemp[5] = "";
  //convert float to char*,
  dtostrf(temp, 2, 2, sTemp); //val, integer part width, precise, result char array
  //itoa(temp, sTemp,10);
  Serial.println(sTemp);


  char sLength[3];


  //prepare the http body
  //
  //{
  //  "value" : 55.23
  //}
  //

  char httpPackage[20] = "";

  strcat(httpPackage, "{\"value\": \"");
  strcat(httpPackage, sTemp);
  strcat(httpPackage, "\" }");

  // get the length of data package
  length = strlen(httpPackage);
  // convert int to char array for posting
  itoa(length, sLength, 10);
  Serial.print(F("body lenght="));
  Serial.println(sLength);

  //prepare the http header
  Serial.println(F("Sending headers..."));

  client.fastrprint(F("PUT /api/sensors/"));
  char *sensorId = SENSOR_ID;
  client.fastrprint(sensorId);
  //client.fastrprint(SENSOR_ID);
  client.fastrprint(F("/values"));

  client.fastrprintln(F(" HTTP/1.1"));
  Serial.print(F("."));

  client.fastrprint(F("Host: "));
  client.fastrprintln(WEBSITE);
  Serial.print(F("."));

  client.fastrprint(F("content-type: "));
  client.fastrprintln(F("application/json"));
  Serial.print(F("."));

  client.fastrprint(F("Content-Length: "));
  client.fastrprintln(sLength);
  client.fastrprintln(F(""));
  Serial.print(F("."));

  Serial.println(F("header done."));

  //send data
  Serial.println(F("Sending data"));
  client.fastrprintln(httpPackage);


  Serial.println(F("===upload completed."));

  // Get the http page feedback

  unsigned long rTimer = millis();
  Serial.println(F("Reading Cloud Response!!!\r\n"));
  while (millis() - rTimer < 2000) {
    while (client.connected() && client.available()) {
      char c = client.read();
      Serial.print(c);
    }
  }
  delay(1000);             // Wait for 1s to finish posting the data stream
  client.close();      // Close the service connection

 
  Serial.println(F("upload completed\n"));

}
 
感兴趣还是看一下完整代码,在这里:
https://github.com/duchangyu/project-arduivew/blob/v0.1/arduino/arduiview-lm35-2/arduiview-lm35-2.ino 
作者: 峻祁连
邮箱:junqilian@163.com 
出处: http://junqilian.cnblogs.com 
转载请保留此信息。





本文转自峻祁连. Moving to Cloud/Mobile博客园博客,原文链接:http://www.cnblogs.com/junqilian/p/5019706.html ,如需转载请自行联系原作者
相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
6月前
|
JSON API 数据格式
您可以在钉钉开放平台的API文档中找到对应的API接口来创建审批实例
您可以在钉钉开放平台的API文档中找到对应的API接口来创建审批实例【1月更文挑战第20天】【1月更文挑战第96篇】
127 2
|
6月前
|
JSON API 数据格式
您可以在钉钉开放平台的API文档中找到对应的API接口来创建审批实例
您可以在钉钉开放平台的API文档中找到对应的API接口来创建审批实例【1月更文挑战第9天】【1月更文挑战第41篇】
172 2
|
6月前
|
API 网络安全
调用钉钉的API获取审批实例ID列表时返回的结果为
调用钉钉的API获取审批实例ID列表时返回的结果为【1月更文挑战第5天】【1月更文挑战第21篇】
109 1
|
2月前
|
JSON 搜索推荐 API
深入了解亚马逊商品详情API:功能、作用与实例
亚马逊商品详情API接口由官方提供,允许开发者通过程序调用获取商品详细信息,如标题、价格等,适用于电商数据分析、搜索及个性化推荐等场景。接口名称包括ItemLookup、GetMatchingProductForId等,支持HTTP POST/GET请求,需提供商品ID、API密钥及其他可选参数。返回数据格式通常为JSON或XML,涵盖商品详情、分类、品牌、价格、图片URL及用户评价等。该接口对数据收集、实时推荐、营销活动及数据分析至关重要,有助于提升电商平台的数据处理能力、用户体验及商家运营效率。使用时需注册亚马逊开发者账号并申请API访问权限,获取API密钥后按文档构建请求并处理响应数据。
|
4月前
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用
循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用
|
3月前
|
SQL JSON API
【Azure Developer】使用REST API获取Activity Logs、传入Data Lake的数据格式问题
【Azure Developer】使用REST API获取Activity Logs、传入Data Lake的数据格式问题
|
5月前
|
人工智能 运维 Serverless
函数计算产品使用问题之启动的实例是否有调用api接口停止功能
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
API
Vue2和Vue3的区别,OptionsAPI与CompositionAPI的区别,Vue2所有的数据,都写在data和method方法中,setup是一个全新的配置项,Vue2是选项式API的写法
Vue2和Vue3的区别,OptionsAPI与CompositionAPI的区别,Vue2所有的数据,都写在data和method方法中,setup是一个全新的配置项,Vue2是选项式API的写法
|
6月前
|
传感器 存储 安全
【物联网】Arduino 实验合集
【物联网】Arduino 实验合集
195 2
|
6月前
|
弹性计算 运维 Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,使用阿里云API或SDK从函数计算调用ECS实例的服务如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
116 4

相关产品

  • 物联网平台