【分享】Arduino+GPRS+红外传感器 实现客流量统计方案-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 22825|回复: 8

【分享】Arduino+GPRS+红外传感器 实现客流量统计方案

[复制链接]
发表于 2016-1-20 15:35 | 显示全部楼层 |阅读模式
本帖最后由 robert_jw 于 2016-1-20 16:34 编辑

前言:

        OneNET是中移物联网有限公司基于开放、共赢的理念,面向公共服务自主研发的开发云平台,为各种跨平台物联网应用、行业解决方案提供简便的云端接入、海量存储、计算和大数据可视化服务,从而降低物联网企业和个人(创客)的研发、运营和运维费用,使物联网企业和个人(创客)更加专注于应用,共建以OneNET设备云为中心的物联网生态环境。
OneNET支持多种接入协议,包括:EDPRestfulMQTTModbusJT/T808-2011等,具体接入文档请到OneNET官方网站进行下载:
http://open.iot.10086.cn/download

本文将采用RestfulHTTP),利用arduino+SIM900A+红外传感器,将数据上传到OneNET平台,形成一个简易的客流量统计方案。

——————————————————————————————————————————————————

所用到的器材如下所示:

Arduino Leonardo开发板

Arduino Leonardo开发板

Arduino Leonardo硬件开发板


SIM900A模块

SIM900A模块

SIM900A模块

漫反射光电开关

漫反射光电开关

漫反射光电开关

实验原理
        Ardiuno Leonardo的Pin2/Pin3为外部中断输入口,本实例采用外部中断的形式采集红外检测信号,对于NPN型红外传感器,没有人通过的时候输出高电平,有人通过的时候输出低电平。在Ardiuno Leonardo中利用中断的方式进行信号检测,有人通过的时候就会触发中断进行计数。
除此之外,可以用两个红外传感器检测信号,根据产生信号的先后顺序识别行人通行的方向。客流统计的测量方法示意图:
ZYLCS]_[YDYK1(4PO}2O949.png
客流统计的测量方法示意图
        两个对射式红外传感器可以判断物体进出状态。将A、A',C、C'两对对射式红外传感器平行安装在场所的出入口内、外两侧,当A、A'先于C、C'检测到屏蔽信号时,表明所测物体为离开;当C、C'先于A、A'检测到屏蔽信号时物体为进入。程序大致逻辑流程:
TCS5J}0`P0D7ED6%3U[1Z9Q.png
方法实现逻辑流程图
Step1 平台端准备工作
        首先是做好在OneNET平台端的准备工作,包括申请账号、创建设备、创建数据流、创建并关联ApiKey。这里需要创建两个数据流,一个统计进入人数,一个统计走出人数。因为是使用RestFul API接入,设备类型选择HTTP。

Step2  硬件连线
硬件接线示意图如下所示:
4.png
   其中,两个红外传感器数据线分别接arduino板的数字2 3引脚
实物连接图如下:
5.png

Step3 编写代码
        硬件和OneNET平台端的准备工作都做好了,需要完成Arduino硬件板上的代码编写,对于GPRS模块操作,ArduinoIDE中没有通用的库可供使用,需要根据模块使用手册自行编写代码。针对RestFul API的数据报文封装,OneNET官方也开发了相关的Arduino库,该库的头文件为HttpPacket.h。源代码如下所示:
[mw_shl_code=c,true]#include <ArduinoJson.h>
#include <HttpPacket.h>

#define DEVICE_ID "78488"
#define HOSTADD "api.heclouds.com"
#define API_KEY  "B4ZGKmtaL5eJw6NIpjEEI+kULqQ="
#define TRYTIMES 3
#define RET_OK   0
#define RET_ERR  1

unsigned long timer1 = 0, timer2 = 0, comeIn = 0, goOut = 0;
char flag1 = 0, flag2 = 0;
StaticJsonBuffer<200> jsonBuffer;
char jsonStr[200] = {0};
HttpPacketHead packetHead;

void setup()
{
    Serial1.begin(115200);
    Serial.begin(115200);

    while (!Serial1)
    {
        ; // wait for serial port to connect. Needed for Leonardo only
    }
    while (!Serial)
    {
        ; // wait for serial port to connect. Needed for Leonardo only
    }

    attachInterrupt(0, getEventTime1, FALLING);
    attachInterrupt(1, getEventTime2, FALLING);

    while (1)
    {
        Serial1.println("AT+COPS?\r");
        delay(200);

        if (Serial1.find("CHINA") == true )
        {
            Serial.println("CHINA MOBILE");
            break;
        }
    }
    sendCmd("AT+CLPORT=\"TCP\",\"2000\"\r");
}

void loop()
{
    establishTCPConnect("AT+CIPSTART=\"TCP\",\"183.230.40.33\",\"80\"\r");
    startSendData("AT+CIPSEND\r");
    JsonObject &jsonData = jsonBuffer.createObject();

    JsonArray &data = jsonData.createNestedArray("datastreams");
    addJsonDataRecord("come_in", comeIn, data);
    addJsonDataRecord("Go_out", goOut, data);

    jsonData.printTo(jsonStr, 200);

    packetHead.setHostAddress(HOSTADD);
    packetHead.setDevId(DEVICE_ID);
    packetHead.setAccessKey(API_KEY);
    packetHead.createCmdPacket(POST, TYPE_DATAPOINT, jsonStr);

    Serial1.print(packetHead.content);
    jsonData.printTo(Serial1);
    Serial1.println("");
    delay(500);
    closeTCPConnect("AT+CIPCLOSE\r");
    delay(1000);
}

void getEventTime1(void)
{
    timer1 = millis();
    Serial.println(timer1);
    flag1 = 1;

    if (flag2)
    {
        flag1 = 0;
        flag2 = 0;
        if (timer2 > timer1)
        {
            comeIn ++;
        }
        else
        {
            goOut ++;
        }
    }
}

void getEventTime2(void)
{
    timer2 = millis();
    Serial.println(timer2);
    flag2 = 1;

    if (flag1)
    {
        flag1 = 0;
        flag2 = 0;
        if (timer2 > timer1)
        {
            comeIn ++;
        }
        else
        {
            goOut ++;
        }
    }
}

void addJsonDataRecord(char key[], int value, JsonArray &array)
{
    JsonObject &root = array.createNestedObject();
    root.add("id", key);
    JsonArray &data = root.createNestedArray("datapoints");
    JsonObject &root1 = data.createNestedObject();
    root1.add("value", value);
}

char startSendData(String data)
{
    int i = 0;
    Serial1.println(data);
    while (1)
    {
        delay(1000);
        if ((Serial1.find(">") == true) || i > TRYTIMES)
        {
            Serial.println(data);
            break;
        }
        Serial1.println(data);
        i++;
    }
    return RET_OK;
}

char sendCmd(String data)
{
    int i = 0;
    Serial1.println(data);
    while (1)
    {
        delay(1000);
        if ((Serial1.find("OK") == true))//|| i > TRYTIMES)
        {
            Serial.println(data);
            break;
        }
        Serial1.println(data);
        i++;
    }
    return RET_OK;
}

char establishTCPConnect(String data)
{
    int i = 0;
    Serial1.println(data);
    while (1)
    {
        delay(1000);
        if ((Serial1.find("CONNECT OK") == true) || i > TRYTIMES)
        {
            //LedFlash();
            Serial.println("CONNECT OK");
            break;
        }
        Serial1.println(data);
        i++;
    }
    return RET_OK;
}

char closeTCPConnect(String data)
{
    int i = 0;
    Serial1.println(data);
    while (1)
    {
        delay(1000);
        if ((Serial1.find("CLOSE OK") == true) || i > TRYTIMES)
        {
            Serial.println("CLOSE OK");
            break;
        }
        Serial1.println(data);
        i++;
    }
    return RET_OK;
}
[/mw_shl_code]


step4 运行程序
        将以上代码在IDE中编译并下载到开发板中。运行程序后,在平台端查看数据上传情况,运用应用孵化器生成客流统计应用展示曲线,如下图所示:
0.png


发表于 2016-2-4 09:42 | 显示全部楼层
这么强大,学习一下。推荐一下,初学arduino使用什么板子好呀
 楼主| 发表于 2016-2-4 15:06 | 显示全部楼层
jackytone 发表于 2016-2-4 09:42
这么强大,学习一下。推荐一下,初学arduino使用什么板子好呀

这里例子里面用的是wido,利用GPRS模块和onenet平台,arduino板子个人感觉其实都差别不大,主要还是熟悉一下aruino IDE 和 arduino语言哈
发表于 2016-4-28 17:19 | 显示全部楼层
LZ,你好
能把HttpPacket文件分享一下么,我在网上没找到呢,谢谢
发表于 2016-5-10 23:09 | 显示全部楼层
jackytone 发表于 2016-2-4 09:42
**** 作者被禁止或删除 内容自动屏蔽 ****

你好 IntoRobot平台非常不错,有丰富的教程例子,支持在线编程,调试,烧录。还可以图形化编程,关联控制。云平台,APP支持,用了你会喜欢!可以参看:http://bbs.intorobot.com/thread-669-1-1.html
发表于 2016-5-17 20:55 | 显示全部楼层
楼主,这个  漫反射光电开关 ,是什么型号的,我需要。
发表于 2016-12-6 15:28 | 显示全部楼层
已经在包含文件中添加了库,但编译中出现如下错误,该怎么解决啊。
fatal error: ArduinoJson.h: No such file or directory
   #include<ArduinoJson.h>
   #include<HttpPacket.h>
   compilation terminated
发表于 2017-9-20 20:20 | 显示全部楼层
请问这个漫反射光电开关电源是外接的吗?数据接在Arduino上能正常获取数据?
发表于 2017-12-12 22:37 | 显示全部楼层
请问可以给一下库文件HTTPPACKET.H的链接吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-20 13:43 , Processed in 0.120479 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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