OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4879|回复: 0

校园疫情防护靠它!?DIY智能暂存柜,助你无接触取快递

[复制链接]

183

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
812
金钱
812
注册时间
2020-5-19
在线时间
78 小时
发表于 2021-1-14 14:49:34 | 显示全部楼层 |阅读模式
本帖最后由 智能物联研习社 于 2021-1-14 14:55 编辑

近年来,智能暂存柜在物流、服务行业大放异彩。例如顺丰蜂巢快递柜、菜鸟驿站智能柜等,不但解决了快递行业的 最后一公里 理念,还能在特殊的时期(例如疫情期间)避免人流聚集。
基于涂鸦 IoT 开发平台,使用涂鸦三明治 Wi-Fi MCU 通信板(WB3S)、涂鸦三明治电源板、STM32 开发板、门锁驱动、以及其他零部件,借助涂鸦 MCU SDK 低代码开发方式,您可以跟随本教程快速开发一个校园智能暂存柜产品原型。
本教程内容均为涂鸦开发者 @何权燊 提供,经其授权编辑发布。
物料清单:
1、涂鸦三明治 Wi-Fi MCU 通信板(WB3S)数量:1
适用于涂鸦 IoT 自定义方案中,照明、台灯、灯丝灯、调光器、照明遥控器、排插、开关、家电、运动健康、传感类产品原型。
2、涂鸦三明治直流供电电源板 数量:1
用于给涂鸦三明治其余相关的部件供电。
3、STM32 开发板 数量:1
支持评估高成本效益的超低功耗LPWAN远距离物联网连接。
4、门锁驱动板 数量:1
根据认证信号或钥匙动作,决定是否将内侧门把手轴和外侧门把手轴联接。
步骤
第 1 步:产品框架
  • 智能校园寄存柜管理系统由以下 IoT 组件组成:智能暂存柜设备:门锁驱动板、涂鸦三明治通讯板、涂鸦三明治电源板、STM 32开发板
  • 涂鸦云开发平台:设备管理、设备控制
  • 微信小程序(经由涂鸦小程序SDK开发):用户扫码开柜存放、用户取用存
  • 管理后台(由开发者服务器运行):用户列表、存放记录、管理员授权开柜、设备列表
第 2 步:组装设备 PCBA 和开发嵌入式软件
暂存柜硬件部分
暂存柜分为四部分:
门锁驱动板,门锁驱动原理如下图所示:


  • 涂鸦三明治通讯板
  • STM32开发板
  • 涂鸦三明治电源板
将这四部分硬件组装完成的PCBA如下所示:


暂存柜嵌入式软件部分
作品使用的涂鸦智能MCU接入方式接入:
1、在 涂鸦 IoT 平台 上参考 选品类创建产品 创建一个四路排查(升级版)_Wi-Fi_BLE 产品。产品的模型使用的是插排,该排插硬件方案与作者定义的智能暂存柜具备相似的 DP(Data Point)定义。


2、在 功能定义 页面,根据智能暂存柜的相关功能定义设置 DP。
作者添加了 4 个 DP,分别对应 4 个柜锁。


3、在 硬件开发 页面,选择一款模组,例如 WBR3 模组,然后在 下载资料 区域下载 MCU_SDK。


4、配置开发板,移植SDK。
作者使用的 STM32 官方开发板,采用 STM32CubeMX + CLion 方式进行单片机开发。芯片外设配置如下所示:


作者使用了一个串口用于涂鸦开发板通讯,以及四个 GPIO 分别控制对应的门锁继电器。对接涂鸦MCU_SDK时,作者主要使用了以下功能:
  • 串口接收和发送
  • SDK初始化以及运行
  • 网络状态以及配网
串口接收和发送
串口发送使用的寄存器方式发送数据:


将这个发送函数填入到SDK的 Protocol.c 中:


使用串口中断接收进行串口数据的接收:


并且在main里面启用串口中断接收:
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
SDK初始化以及运行
主要是在main和主循环里面分别填入 wifi_protocol_init 和 wifi_uart_service。


获取网络状态以及配网,使用 mcu_get_wifi_work_state 即可获取当前模组的网络状态。


复位配网
涂鸦提供了 Wi-Fi 快连配网和热点配网两种配网方式。
调用SDK的 mcu_api.c 中的 mcu_reset_wifi() 即可对模组进行复位并且进入配网状态。
控制继电器开锁
原理是给GPIO一个250ms的高电平使锁芯通电弹出锁钩。以开关1为例,其他以此类推。


第 3 步:连接涂鸦云开发平台
作者调用了 涂鸦云开发平台 的设备信息查询和设备控制能力进行后端环境开发。因为涂鸦云开发平台的主要 SDK 为 Java SDK,而作者的后端环境的使用的是 PHP,所以作者自行调用云开发平台 API 写了一个类,实现了是简单的鉴权和获取设备信息、设备控制。
实现代码如下:
<?phpnamespace sdk;use think\cache\driver\Redis;define("client_id", "请在涂鸦平台申请");define("secret", "请在涂鸦平台申请");define("APIURL", 'https://openapi.tuyacn.com');// define("redisarr", '192.168.31.3');class tuyasdk{    private $access_token;    private $refresh_token;    private $uid;    private $expire_time;    public function Requestopen($devicesid)    {        $data = $this->get_devices($devicesid);        $data = json_decode($data, true);        // var_dump($data);        if ($data['success']) {            foreach ($data['result']['status'] as $lock) {                if (!$lock['value']) {                    $data = $this->set_device($devicesid, $lock['code'], true);                    $data = json_decode($data, true);                    if ($data['success']) {                        return $lock['code'];                    }                }            }        }        return false;    }    public function Requestclose($devicesid, $lockcode)    {        $data = $this->set_device($devicesid, $lockcode, false);        $data = json_decode($data, true);        return $data['success'];    }    public function get_devices($devicesid)    {        $this->get_token();        $data = $this->queryheader_business();        $requestdata = $this->query_curl("GET", APIURL . "/v1.0/devices/" . $devicesid, $data, "");        return $requestdata;    }    public function get_devices_list($page_no, $page_size, $product_id)    {        $this->get_token();        $data = $this->queryheader_business();        $requestdata = $this->query_curl("GET", APIURL . "/v1.0/devices?page_no=" . $page_no . "&page_size=" . $page_size . "&product_id=" . $product_id, $data, "");        return $requestdata;    }    public function set_device($devicesid, $comkey, $state)    {        $postdata = array();        $postdata["commands"][0]["code"] = $comkey;        $postdata["commands"][0]["value"] = $state;        $postdata = json_encode($postdata);        $this->get_token();        $data = $this->queryheader_business();        $requestdata = $this->query_curl("POST", APIURL . "/v1.0/devices/" . $devicesid . "/commands", $data, $postdata);        return $requestdata;    }    private function access_token()    {        $data = $this->queryheader_token();        $requestdata = $this->query_curl("GET", APIURL . "/v1.0/token?grant_type=1", $data, "");        $arraydata = json_decode($requestdata, true);        if ($arraydata['success'] == "true") {            $this->access_token = $arraydata['result']['access_token'];            $this->refresh_token = $arraydata['result']['refresh_token'];            $this->expire_time = time() + $arraydata['result']['expire_time'];            $this->uid = $arraydata['result']['uid'];            $tokendata = array();            $tokendata['access_token'] = $this->access_token;            $tokendata['refresh_token'] = $this->refresh_token;            $tokendata['expire_time'] = $this->expire_time;            $tokendata['uid'] = $this->uid;            $tokendata = json_encode($tokendata);            $this->set_token($tokendata);            return true;        }        return false;    }    private function get_token()    {        $redis = new Redis();        // $redis->connect(redisarr, 6379);        // $redis->auth('demo');        $data =  $redis->get('token');        $arraydata = json_decode($data, true);        $this->access_token = $arraydata['access_token'];        $this->refresh_token = $arraydata['refresh_token'];        $this->expire_time = $arraydata['expire_time'];        $this->uid = $arraydata['uid'];        if ($this->expire_time  - time() < 3) {            $this->access_token();        }        // $redis->close();    }    private function set_token($data)    {        $redis = new Redis();        // $redis->connect(redisarr, 6379);        // $redis->auth('demo');        $redis->set('token', $data);        // $redis->close();    }    private function queryheader_business()    {        list($t1, $t2) = explode(' ', microtime());        $time = (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);        $Message = client_id . $this->access_token . $time;        $sha256data = hash_hmac('sha256', $Message, secret, false);        $sign = strtoupper($sha256data);        $headerdata = array(            'client_id:' . client_id,            'sign:' . $sign,            'sign_method:HMAC-SHA256',            't:' . $time,            'lang:ch',            'access_token:' . $this->access_token,            'Content-Type:application/json'        );        return $headerdata;    }    private function queryheader_token()    {        list($t1, $t2) = explode(' ', microtime());        $time = (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);        $Message = client_id . $time;        $sha256data = hash_hmac('sha256', $Message, secret, false);        $sign = strtoupper($sha256data);        $headerdata = array(            'client_id:' . client_id,            'sign:' . $sign,            't:' . $time,            'sign_method:HMAC-SHA256',            'lang:ch'        );        return $headerdata;    }    private function query_curl($typequery, $url, $headerdata = array(), $bodydata = array())    {        $curl = curl_init();        curl_setopt($curl, CURLOPT_URL, $url);        curl_setopt($curl, CURLOPT_HTTPHEADER, $headerdata);        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($curl, CURLOPT_HEADER, false);        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);        // curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);        if ($typequery == "POST") {            curl_setopt($curl, CURLOPT_POST, true);            curl_setopt($curl, CURLOPT_POSTFIELDS, $bodydata);        } else {            curl_setopt($curl, CURLOPT_POST, false);        }        $tmpInfo = curl_exec($curl);        curl_close($curl);        return $tmpInfo;    }}第 4 步:开发微信小程序
用户开柜存放
  • 实现原理:扫码存放-用户扫码-把用户ID和设备ID(扫码结果)-云端请求开锁-完成
  • 实现代码:


用户取出存放
  • 实现原理:用户点击取出存放-云端查询是否存在未取出的存放-如有请求开柜,若无反馈无存放。
  • 实现代码:


第 5 步:开发管理后台
智能暂存柜管理后台使用 ThinkPHP5 框架和 Xadmin 前端框架进行开发。
用户列表
  • 实现原理:用户授权小程序获取用户信息后,调用后端接口对用户的注册并写入数据库,用户列表只是遍历数据库表的数据。


实现代码:




存放记录
  • 实现原理:获取数据库设备存储记录表的数据并且遍历出来,而管理员开柜是通过传递 ID 给前端,当管理员按开柜的按钮即可把列表 ID 传后端,通过 ID 在数据库中查找设备 ID 和开柜号,并调用 SDK 控制设备开柜。


实现代码:


  • 设备列表实现原理:通过 SDK 获取设备列表,并传递到前端进行遍历。


  • 实现代码:


涂鸦物联网开发平台为开发者提供了便捷的 IoT 开发工具与服务,助力开发者更高效的完成设备接入,并为开发者提供物联网应用开发及场景服务能力。
看到这里你是否也很心动?不如亲手实践,自己手动一个校园暂存柜吧~
auth.tuya.com/?from=https%3A%2F%2Fiot.tuya.com%2F&_source=db5b2e380bb88adaccc9fbc259587499

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-10 21:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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