查看: 3386|回复: 3

仓储物联网监控项目分享

[复制链接]
      作为蘑粉很荣幸参加了英特尔的物联网创客竞赛—,参加了蘑菇云4次培训,决定做仓储物联网项目,这里要感谢蘑菇云的大力支持,给我们培训,提供套件还有场地,无偿的帮助很感动!特别感谢其中的一个帅哥老师,问了一百多人只有他手里有打火机,每次从他那里找到打火机(测试火焰)的那种幸福感是难以言表的!整个文章前面讲场地后面讲我们做的东西,文字上比较活跃,由于我们都是做软件的,所以不能像其他创客那样有很多操作步骤上的讲解,更多的是给大家讲系统实现的方法。敬请担待:handshake!废话不多说,直接上图!让没去的蘑粉也感受下现场的热烈氛围!比赛场地一角
591796103998808133.jpg


旁边这桌也做的热火朝天,感谢他们带了一款众筹产品给我们试用。
468582912911591362.jpg


这个应该是某个大学的学生,一看就是朝气蓬勃,看到他们才感觉到我们真的老了,真的老了:(。
898496772661747085.jpg


这桌现场修理电磁炉,带着锅准备做饭,知道为什么吗?因为中午的饭分量太少,把我们这群IT狗饿得受不了了:lol!(这里我扯的),他们应该做的智能电器,能看得出来做的很用心。
144738342689542985.jpg


做android端的哥们,帅的一塌糊涂。哥们特意给我说过,上传的他的照片要打马赛克,一定要打马赛克!我按他说的做了;P!
529571270628394061.jpg


我怕你们看到我之后就得我队友不帅,所以就只上传有蘑菇云定制版联想笔记本。
545916829828949089.jpg


上面讲了那么多热烈的画面,接下来给大家讲点降温的东西


好了!接下来讲讲我们做的东西,其实很简单了!真的很简单!我都不好意思讲了!此处省略一百句谦虚。。。。。。。我们的做这个的想法来源于XX港的xx事件。
从官方的报道发现了这两个让我这个吃瓜群众觉得不可思议的地方
—1.消防队员到了之后无法得知堆场集装箱装载货物种类
—2.仓储区特殊货物对环境有比较高的要求,居然没有相关调控措施



做为IT吃瓜群众,我们几个是很难接受这个现实的,抄起家伙就干:victory:。设计了仓储物联网监控系统,下面是框架

20161119220206.png

用intel的物联网模块Edison作为HUB,此处再次感谢蘑菇云的场地套件培训,由于接线比较多,拍照看起来比较凌乱,下面的接线图就截的老师的此处感谢乔老师的无私奉献,吃瓜群众再次拜谢:$!偷拍乔老师的画面,超级敬业啊!
800519289446345236.jpg





接线图
clipboard1.png

clipboard2.png

clipboard3.png




功能实现:
1.HUB每20S上传一次温度,湿度,火警状态到服务器,手机端定时访问服务器获取信息并显示。
2.当温度,湿度,大于设定的阀值手机端和PC端都会发出报警提示音。
3.当火警状态时,手机端和PC会报警。HUB端会发出声光报警,工作人员查看没有火警情况下,按下复位键系统复位,继续监控场地信息,火警状态下,上传数据频率为1S/次。


各位大神原谅我吧!表达能力不行,程序上传共享,大神们看一眼就知道怎么回事。
首先上PC端登陆界面,输入用户名密码

clipboard4.png




进入设备信息列表
clipboard5.png


点击查看可以查看温湿度历史记录,各个时间点的,我觉得我哥们做的挺漂亮,我这哥们没女朋友,这里我给他发个征婚启示,张江IT男,憨厚老实,吃苦耐劳,居家过日子必备,好了又扯远了。下面是历史记录截图。

clipboard6.png



重点讲下通信协议:
Edison上传传感器数据到服务器我们用的HTTP协议GET方法,具体实现如下
[mw_shl_code=c,true]void httpRequest() {
  // close any connection before send a new request.
  // This will free the socket on the WiFi shield
  lastConnectionTime = millis();
  client.stop();
  Serial.println("connecting...");
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET /eservice/device.action?&action=saveDevRecord&sign=WlwebByRebel&devCode=" +  String(devId) + "&temperature=" + String(temperature) + "&humidity=" + String(humidityValue) + "&fireStatus=" + String(fireStatus) + " HTTP/1.1");
    client.println("Host:xxx.xxx.xxx.163");
    client.println();
  if (client.available()) {
    char c = client.read();
    Serial.println();
    Serial.println(c);
    Serial.println();   
  }
  // Serial.println("GET /eservice/device.action?&action=saveDevRecord&sign=WlwebByRebel&devCode=" +  String(devId) + "&temperature=" + String(temperature) + "&humidity=" + String(humidityValue) + "&fireStatus=" + String(fireStatus) + " HTTP/1.1");
   client.stop();
  } else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
  }
}[/mw_shl_code]
上面这段代码主要实现HTTP的GET方法,上传了温度,湿度,火警状态,设备编号信息。上传信息的接口要和做服务器的协商好,按照要求上传信息即可,如果不是团队做可以用第三方IOT服务器,像中国移动的OneNET按照预定协议格式上传而且还有APK模版,基本都是拿来修修改改就能用的。
[mw_shl_code=c,true]void fireWaring() {
  int i = 1;
  int ledNum = 0;
  int keyFlag = 0;
  int sensorValue = analogRead(0);//火焰传感器连到模拟口,并从模拟口读值
  //Serial.println(sensorValue);  
  delay(1);

    if(sensorValue > 500){ //  如果数大于500,说明有火源,蜂鸣器响 这里的设定值根据实际情况赋值
      fireStatus = 1;
      while(fireStatus == 1){
            //fireStatus = 1;
            for(int x=0; x<180; x++){
              //将 sin函数角度转化为弧度
              sinVal = (sin(x*(3.1412/180)));
              //用 sin函数值产生声音的频率
              toneVal = 2000+(int(sinVal*1000));
              //给引脚 8一个
              tone(8, toneVal);
              delay(15);  
              buttonState = digitalRead(buttonPin); //读取按键引脚的状态值
              Serial.println("w5   "+ String(buttonState));
              // 检测按键是否按下,如果是的话,按键状态值为 HIGH
              if (buttonState == HIGH) {      
//                digitalWrite(ledPin, LOW);  // 打开 LED
//                noTone(8);          //关闭蜂鸣器
//                fireStatus = 0;
                  keyFlag = 1;
                  break;
              }  
            }
            if(ledNum > 100){
              digitalWrite(ledPin, ~i);   // 关闭 LED
               ledNum=0;
              }else{
              ledNum++;
              }
            
            if(keyFlag == 1)
            {
              digitalWrite(ledPin, LOW);  // 打开 LED
              noTone(8);          //关闭蜂鸣器               
              fireStatus = 0;
              keyFlag = 0;
              break;
             }
             if(millis() - lastConnectionTime > 2000) {
              //lastConnectionTime = millis();
              httpRequest();
              //Serial.println(Mystring);
              }
      }   
    } else {    // 如果数据小于等于500,没有火源,关闭蜂鸣器
           noTone(8);          //关闭蜂鸣器  
    }
}[/mw_shl_code]

上面这段代码当时难住我的地方是满足判断条件后蜂鸣器一直不响,后来尝试加大延长时间到15ms问题就解决了。

下面这段是主函数逻辑部分,大部分都注释了,其实整个逻辑很简单。
[mw_shl_code=c,true]void loop() {
  char bufferChar[20];
  char bufferChar1[20];
  static unsigned long readSensorTimer=0;
  fireWaring();
  if(millis()-readSensorTimer>300)
  {
    readSensorTimer=millis();
    temperatureValue=analogRead(TemperaturePin);    //读取温度的模拟量
    humidityValue=analogRead(HumidityPin);          //读取湿度的模拟量

    temperature=(500 * temperatureValue) /1024;     //通过模拟量计算出实际温度
    Serial.print("humidityValue: ");
    Serial.println(humidityValue);
    Serial.print("temperature: ");
    Serial.println(temperature);
    //LCD显示当前温度
    lcd.setCursor(0, 0);    //光标移到第一行,第一个字符
    lcd.print("T:");
    lcd.print(temperature);
    lcd.print("C");
    lcd.print(" ");

    //LCD现实当前湿度
    lcd.setCursor(6, 0);    //光标移动到第一行,第七个字符
    lcd.print("H:");
    //lcd.print("");
    lcd.print(humidityValue);
    if(humidityValue < 99)
    lcd.print("  ");  //如果humidityValue大于99,下一次输出的数据小于100的话就会造成LCD上显示的数字不正确,所以有效数字后做了清空处理

    //显示当前土壤情况
    lcd.setCursor(0, 1);    //光标移动到第二行,第一个字符
    if (humidityValue<300) {
      lcd.print("Soil: Dry  ");
    }
    else if (humidityValue>=300 && humidityValue<700){
      lcd.print("Soil: Humid");
    }
    else{
      lcd.print("Soil: Water");
    }
  }
  // if you're not connected, and ten seconds have passed since
  if(millis() - lastConnectionTime > postingInterval) {
      //lastConnectionTime = millis();
      httpRequest();
      //Serial.println(Mystring);
  }
  
  
}[/mw_shl_code]



关于服务器不很我也不是很懂,以前自己做的是按照这个搭建的,链接如下
ubuntu下搭建服务器
大家可以看下,不过还是比较推荐个人创客用大公司的开发接口,这样开发难度会小一点,附上中国移动OneNET链接供参考中国移动OneNET

到此为止简单讲了我们做的东西,面太广,太杂了,讲的也没什么深度,请各位见谅!:handshake:handshake:handshake:handshake:handshake:handshake:handshake


蘑菇云物联特工队 @Ash

















hnyzcj  版主

发表于 2016-11-20 11:56:28

8 错
回复

使用道具 举报

吹口琴的钢铁侠  初级技匠

发表于 2016-11-20 13:32:35

你们做得好快,,这么快就上传教程了。。
回复

使用道具 举报

Ash  管理员

发表于 2016-11-21 16:17:41

记录得好详细~ 还不忘征婚 哈哈Hi,当时登记的团队成员名字可以给我一下吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主

楼主的其它帖子

上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail