HUSKYLENS:AI无人售药机2.0

2020-04-021.2万
精华项目
AI 快速预览详细 收起
本文介绍了如何使用掌控板和HUSKYLENS摄像头实现AI无人售药机。项目包括药品选择、人脸支付及出货功能。通过MQTT协议将数据发送到EasyIoT平台,下位机Arduino接收数据并控制药品出货。适合初学者学习物联网和人工智能技术。
project-image

步骤1 前言

之前在第二轮做了一个无人售卖机,上位机用的是电脑做的人脸支付功能。有了二哈(HUSKYLENS)之后,我的售卖机终于和放飞自我。摆脱了电脑的束缚,想怎么识别就怎么识别!本项目总体流程是:掌控板做上位机:药品的选择与人脸支付。通过mqtt协议发送到easyiot物联网平台!下位机arduino通过obloq物联网模块接收到的数据,做相应药品的出货。

project-image

材料清单

  • 掌控板 X1 链接
  • 百灵鸽拓展板 X2 链接
  • HUSKYLENS AI人工摄像头 X3 链接
  • 3M椴木板 X4

步骤2 设计流程

1,用laserbox制作上位机盒子模型

project-image
project-image

步骤3 硬件连接

project-image

步骤4 硬件组装

project-image
project-image
project-image

步骤5 程序设计

上位机程序设计

代码
/*!
 * MindPlus
 * mpython
 *
 */
#include <MPython.h>
#include <DFRobot_Iot.h>
#include <DFRobot_HuskyLens.h>

// 动态变量
volatile float mind_n_DangQianSuoZaiXuanXiang, mind_n_QueRenXuanZhongXuanXiang;
// 函数声明
void DF_TianChongJuXing(float mind_n_TianChongXuanXiang);
void DF_PanDuanXuanXiang(float mind_n_p0, float mind_n_p1);
// 静态常量
const String topics[5] = {"225lgQXWR","","","",""};
// 创建对象
DFRobot_Iot       myIot;
DFRobot_HuskyLens huskylens;


// 主程序开始
void setup() {
	mPython.begin();
	myIot.wifiConnect("Erised_Teach", "erised88");
	while (!myIot.wifiStatus()) {yield();}
	myIot.init("iot.dfrobot.com.cn","6fqog7JZR","","efqoRn1WRz",topics,1883);
	myIot.connect();
	while (!myIot.connected()) {yield();}
	mind_n_DangQianSuoZaiXuanXiang = 1;
	mind_n_QueRenXuanZhongXuanXiang = 0;
	huskylens.beginI2CUntilSuccess();
	huskylens.writeAlgorithm(ALGORITHM_FACE_RECOGNITION);
}
void loop() {
	display.fillScreen(0);
	while (!(mind_n_QueRenXuanZhongXuanXiang>0)) {
		DF_PanDuanXuanXiang((analogRead(P0)), (analogRead(P1)));
		DF_TianChongJuXing(mind_n_DangQianSuoZaiXuanXiang);
		yield();
	}
	display.fillScreen(0);
	display.setCursor(20, 15);
	display.print("开始人脸支付");
	display.setCursor(20, 30);
	display.print("请对准摄像头");
	while (!(mind_n_QueRenXuanZhongXuanXiang==0)) {
		huskylens.request();
		if (huskylens.isLearned(1)) {
			if (huskylens.isAppear(1,HUSKYLENSResultBlock)) {
				myIot.publish(topic_0, mind_n_QueRenXuanZhongXuanXiang);
				mind_n_QueRenXuanZhongXuanXiang = 0;
				display.fillScreen(0);
				display.setCursor(42, 22);
				display.print("支付成功");
				delay(1000);
			}
		}
		yield();
	}
}


// 自定义函数
void DF_TianChongJuXing(float mind_n_TianChongXuanXiang) {
	if ((mind_n_DangQianSuoZaiXuanXiang==1)) {
		display.setCursor(94, 10);
		display.print("药品1");
		display.setCursor(100, 25);
		display.print("5元");
		display.rect(0, 0, 86, 64, false);
		display.rect(2, 2, 40, 29, true);
		display.setCursor(5, 8);
		display.print("药品1");
		display.rect(44, 2, 40, 29, false);
		display.setCursor(49, 8);
		display.print("药品2");
		display.rect(2, 32, 40, 29, false);
		display.setCursor(5, 37);
		display.print("药品3");
		display.rect(44, 32, 40, 29, false);
		display.setCursor(49, 37);
		display.print("药品4");
	}
	if ((mind_n_DangQianSuoZaiXuanXiang==2)) {
		display.setCursor(94, 10);
		display.print("药品2");
		display.setCursor(100, 25);
		display.print("10元");
		display.rect(0, 0, 86, 64, false);
		display.rect(2, 2, 40, 29, false);
		display.setCursor(5, 8);
		display.print("药品1");
		display.rect(44, 2, 40, 29, true);
		display.setCursor(49, 8);
		display.print("药品2");
		display.rect(2, 32, 40, 29, false);
		display.setCursor(5, 37);
		display.print("药品3");
		display.rect(44, 32, 40, 29, false);
		display.setCursor(49, 37);
		display.print("药品4");
	}
	if ((mind_n_DangQianSuoZaiXuanXiang==3)) {
		display.setCursor(94, 10);
		display.print("药品3");
		display.setCursor(100, 25);
		display.print("15元");
		display.rect(0, 0, 86, 64, false);
		display.rect(2, 2, 40, 29, false);
		display.setCursor(5, 8);
		display.print("药品1");
		display.rect(44, 2, 40, 29, false);
		display.setCursor(49, 8);
		display.print("药品2");
		display.rect(2, 32, 40, 29, true);
		display.setCursor(5, 37);
		display.print("药品3");
		display.rect(44, 32, 40, 29, false);
		display.setCursor(49, 37);
		display.print("药品4");
	}
	if ((mind_n_DangQianSuoZaiXuanXiang==4)) {
		display.setCursor(94, 10);
		display.print("药品4");
		display.setCursor(100, 25);
		display.print("20元");
		display.rect(0, 0, 86, 64, false);
		display.rect(2, 2, 40, 29, false);
		display.setCursor(5, 8);
		display.print("药品1");
		display.rect(44, 2, 40, 29, false);
		display.setCursor(49, 8);
		display.print("药品2");
		display.rect(2, 32, 40, 29, false);
		display.setCursor(5, 37);
		display.print("药品3");
		display.rect(44, 32, 40, 29, true);
		display.setCursor(49, 37);
		display.print("药品4");
	}
}
void DF_PanDuanXuanXiang(float mind_n_p0, float mind_n_p1) {
	if (((mind_n_p0>0) && (mind_n_p0<1800))) {
		if ((mind_n_DangQianSuoZaiXuanXiang==2)) {
			display.fillScreen(0);
			mind_n_DangQianSuoZaiXuanXiang = 1;
		}
		else {
			if ((mind_n_DangQianSuoZaiXuanXiang==4)) {
				display.fillScreen(0);
				mind_n_DangQianSuoZaiXuanXiang = 3;
			}
		}
	}
	else {
		if (((mind_n_p0>2000) && (mind_n_p0<4100))) {
			if ((mind_n_DangQianSuoZaiXuanXiang==1)) {
				display.fillScreen(0);
				mind_n_DangQianSuoZaiXuanXiang = 2;
			}
			else {
				if ((mind_n_DangQianSuoZaiXuanXiang==3)) {
					display.fillScreen(0);
					mind_n_DangQianSuoZaiXuanXiang = 4;
				}
			}
		}
		if (((mind_n_p1>0) && (mind_n_p1<1900))) {
			if ((mind_n_DangQianSuoZaiXuanXiang==1)) {
				display.fillScreen(0);
				mind_n_DangQianSuoZaiXuanXiang = 3;
			}
			if ((mind_n_DangQianSuoZaiXuanXiang==2)) {
				display.fillScreen(0);
				mind_n_DangQianSuoZaiXuanXiang = 4;
			}
		}
		if (((mind_n_p1>2000) && (mind_n_p1<4100))) {
			if ((mind_n_DangQianSuoZaiXuanXiang==3)) {
				display.fillScreen(0);
				mind_n_DangQianSuoZaiXuanXiang = 1;
			}
			if ((mind_n_DangQianSuoZaiXuanXiang==4)) {
				display.fillScreen(0);
				mind_n_DangQianSuoZaiXuanXiang = 2;
			}
		}
	}
	if (((analogRead(P2))==0)) {
		mind_n_QueRenXuanZhongXuanXiang = mind_n_DangQianSuoZaiXuanXiang;
	}
}

下位机程序设计

代码
/*!
 * MindPlus
 * uno
 *
 */
#include <UNO_Obloq.h>
#include <SoftwareSerial.h>

// 动态变量
String mind_s_value;
// 静态常量
const String topics[5] = {"gsjELPXWR","","","",""};
// 创建对象
UNO_Obloq      olq;
SoftwareSerial softSerial(2, 3);


// 主程序开始
void setup() {
	softSerial.begin(9600);
  olq.startConnect(&softSerial, "Erised_Teach", "erised88", "kkuQ6XoZR", "zzXweuTZRz", topics, "iot.dfrobot.com.cn", 1883);
}
void loop() {
	if ((olq.available(olq.topic_0))) {
		mind_s_value = olq.getMessage(olq.topic_0);
		if ((mind_s_value=="1")) {
			digitalWrite(4, HIGH);
			analogWrite(5, 200);
			delay(1000);
			digitalWrite(4, HIGH);
			analogWrite(5, 0);
		}
		if ((mind_s_value=="2")) {
			digitalWrite(7, HIGH);
			analogWrite(6, 200);
			delay(1000);
			digitalWrite(7, HIGH);
			analogWrite(6, 0);
		}
		if ((mind_s_value=="3")) {
			digitalWrite(8, HIGH);
			analogWrite(9, 200);
			delay(1000);
			digitalWrite(8, HIGH);
			analogWrite(9, 0);
		}
		if ((mind_s_value=="4")) {
			digitalWrite(10, HIGH);
			analogWrite(11, 200);
			delay(1000);
			digitalWrite(10, HIGH);
			analogWrite(11, 0);
		}
	}
}

步骤6 视频演示

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

所需材料/产品

加载全部

    掌控板2.0 编程入门学习主控板 - Python、图形化编程开发板

    掌控板2.0 编程入门学习主控板 - Python、图形化编程开发板

    掌控板2.0 编程入门学习主控板 - Python、图形化编程开发板

    Gravity: 二哈识图(HuskyLens)AI 视觉传感器 - 蘑菇云科创教育

    Gravity: 二哈识图(HuskyLens)AI 视觉传感器 - 蘑菇云科创教育

    Gravity: 二哈识图(HuskyLens)AI 视觉传感器 - 蘑菇云科创教育

相关推荐

评论(4)
懒妮
创意加分
寸进
好有创意👍
橙子昂
厉害
庞老师12
你好,可以加一下联系方式吗?想向您咨询一下。原来的联系方式加不上了
- 没有更多了 -

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

相关推荐

所需材料/产品

掌控板2.0 编程入门学习主控板 - Python、图形化编程开发板

掌控板2.0 编程入门学习主控板 - Python、图形化编程开发板

掌控板2.0 编程入门学习主控板 - Python、图形化编程开发板

Gravity: 二哈识图(HuskyLens)AI 视觉传感器 - 蘑菇云科创教育

Gravity: 二哈识图(HuskyLens)AI 视觉传感器 - 蘑菇云科创教育

Gravity: 二哈识图(HuskyLens)AI 视觉传感器 - 蘑菇云科创教育