×

公共交通服务的低成本全自动收费系统

消耗积分:0 | 格式:zip | 大小:0.40 MB | 2022-10-28

安德森大

分享资料个

描述

介绍

Touchless Do More ,我们就是这样开始的。在这场COVID-19大流行中,它强调了尽可能避免人与人之间的接触以打破这种传染性传播链的重要性。所以我们选择解决的问题是收费问题。也许归结为同时实现两个目标。这意味着我们的印度确实需要一些强大的系统来在公共交通部门收取车费,即使在这个传染性传播的时期,我们也迫切需要避免人与人之间的接触。唔。两全其美!即使所有发达国家都在实施,但在印度大规模实施仍然不可行。这就是我们的系统发挥作用的地方,A印度公共交通服务的低成本全自动收费系统

pYYBAGNYtKmAMeIeAACF3Ynmkfc492.png
架构框图
 

Overview Of The Project

现在,我们将解释如何使用来自 Arduino 的 Arduino MKR WiFi 1010 板、Mifare MFRC522 RFID 读写器、Google firebase 和 Google 表格制作 TapToPay 自动收费系统。MKR 板和读卡器使用 SPI 进行通信。我们使用标签作为巴士站标识符和个人用户的卡片。

Brief Introduction about RFID Technology

RFID或射频识别系统由两个主要组件组成,标签和阅读器。阅读器由射频模块和产生高频电磁场的天线组成。另一方面,标签通常是无源设备。它包含一个存储和处理信息的微芯片。

poYBAGNYtKuAdY90AAAl8WQlPig490.png
图片来源:数据表
 

让我们成功吧

第一步:检测停止卡和用户卡

当 RFID 靠近 RFID 阅读器时,它会与数据库进行核对,以确定它是 Stop Card 还是Passenger Card。如果是停止卡,则更新系统中的当前停止。

 

Step2:更新旅客名单

如果读取的卡 ID 不存在于公交车站数据库中,则它是乘客卡。为已登机的乘客保留一个单独的列表。读取乘客卡后,将在乘客列表中搜索该 ID。如果 ID 不在列表中,则添加乘客 ID 和当前停靠点作为乘客的登机点。

乘客列表以链表形式维护

int update_pass_list(byte *rfTag, int point, int amount)
{
    passenger_t *pass = NULL;

    if (!head) {
        /* Passenger on boarding case */
        if (amount < min_req_amt(point)) {
            Serial.print("Problem");
            return -1;
        }
        pass = (passenger_t *) malloc(sizeof(passenger_t));
        if (!pass) {
            /* This case will hit only when the system in bad state */
            printf("Failed to allocate Memory\n");
            exit (-EXIT_FAILURE);
        }
        head = tail = pass;
        memcpy(pass->rfTag, rfTag, RFTAG_MAX_LEN);
        pass->startPoint = point;
        pass->next = NULL;
    } else {
        pass = search_tag(rfTag);
        if (pass) {
            /* Passenger getting off case */
            /* Deduct money and write */
            byte data[MAX_DATA_SIZE] = { };
            byte* out = 0;

            int_to_byte(Cal_fare(amount, (point - pass->startPoint)), data);

            updated_balance = byte_to_int(data);

            /* Deleting entry from list */
            delete_entry(rfTag);
        } else {
            /* Passenger on boarding case */
            if (amount < min_req_amt(point)) {
                /* If the passenger card has low amount then reject it */
                return -1;
            }

            pass = (passenger_t *) malloc(sizeof(passenger_t));
            if (!pass) {Serial.print("Failed to allocate Memory");
                /* This case will hit only when the system in bad state */
                printf("Failed to allocate Memory\n");
                exit (-EXIT_FAILURE);
            }

            tail->next = pass;
            memcpy(pass->rfTag, rfTag, RFTAG_MAX_LEN);

            pass->startPoint = point;
            pass->next = NULL;
            tail = tail->next;
        }
    }
}

第 3 步:计算票价并更新余额

乘客下车时,应刷卡。我们的系统将读取卡片并在乘客列表中搜索 ID,并从列表中获取乘客登机点。以当前站点和乘客的上车站点计算票价。计算的票价将从该乘客卡的可用余额中扣除,剩余余额将更新到该卡。

int Cal_fare(int amt, int num_stop) 
{ 
    return (amt - (num_stop * FARE_PER_STOP)); 
} 

void int_to_byte(int data, byte buffer[MAX_DATA_SIZE]) 
{
    int x = data / MAX_AMT_PER_BYTE;
    int y = data % MAX_AMT_PER_BYTE;
    int i = 0;

    memset(buffer, 0, MAX_DATA_SIZE);

    if (x == 0) {
        buffer[0] = y;
    } else {
        /* update dataBlock with new balance amount */
        for (i = 0; i < x; i++) {
            buffer[i] = 0xff;
        }
        buffer[x] = y;
    }
}

int byte_to_int(byte buffer[MAX_AMT_SIZE])
{
    int curr_output = 0;
    for(int i = 0; i < MAX_AMT_SIZE; i++) {
        curr_output = curr_output + (int) buffer[i];
    }
    return curr_output;
}

第 4 步:删除条目

将剩余金额更新到乘客卡后,将在列表中搜索乘客 ID,并将条目从列表中删除。该列表仅维护列表中的已登机乘客。

void delete_entry(byte *rfTag)
{
    passenger_t *list = head;
    passenger_t *prev = NULL;

    if (!rfTag)
        return;

    /* Updating the head in case of first entry itself the match */
    if (list && !memcmp(list->rfTag, rfTag, RFTAG_MAX_LEN)) {
        head = list->next;
        free(list);
        return;
    }

    /* searching the entry in the list */
    while (list && memcmp(list->rfTag, rfTag, RFTAG_MAX_LEN)) {
        prev = list;
        list = list->next;
    }

    if (!list)
        return;

    prev->next = list->next;

    /* Updating the tail */
    if (list == tail)
        tail = prev;

    free(list);
}

第 5 步:将 UID 发送到 Firebase 并更新 Google 表格

乘客详细信息云数据库中更新这将有助于跟踪乘客的路线,以防他被检测出 COVID-19 呈阳性。

乘客详细信息是乘客 ID、随时间登机的停靠站、随时间停靠的停机坪。

 

软件流程:

pYYBAGNYtK2ATFQ7AABR-7AKR-o80.jpeg
软件算法
 

该系统将如何减缓 Covid-19 在印度的传播?

印度,与世界上许多其他地方一样,冠状病毒对运输造成了巨大打击。提高公共汽车运输的安全性将是最紧迫的问题。在印度的公共汽车运输中,乘客使用现金支付车费,通过这种方式可能会传播病毒。印度摆脱现金的做法得到了政府的帮助。尽管有推动,印度仍然是一个现金密集型经济体。一些州政府也开始为其巴士使用电子票务系统,以尽量减少接触。如果实施,我们基于 Arduino 的 TapToPay 系统将在印度交通系统中发挥重要作用

增强功能

  • 作为原型,我们使用了单个 RFID 读写器。在实时部署中,它可以使用两个或多个 RFID 读取器/写入器。一张用于停车标签,一张用于乘客卡。
  • 单独的RFID读写器可用于记录登机乘客和离开乘客的数据。
  • 可以使用单独的服务器和新的数据库技术将乘客的旅行详细信息存储在云中。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"//m.obk20.com/www/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'公共交通服务的低成本全自动收费系统',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"https://www.elecfans.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);