创意来源:
“哎呀,忘了”!随着生活节奏的加快,年龄的增长,人们的总容易忘记一些事情,比如忘记吃药。尤其是家中的老人,由于身体问题,可能需要长期服药治疗,但年岁大了总容易忘这忘那的。但在科技快速发展的今天,这些都不是问题,我们设计并开发了一款名为“健康卫士”的智能药盒,可以联网监测用户的服药情况,提示用户服药,并且根据用户设定自动提取所需药物。
哎呀!!!!!!!忘记了我是来参赛的,说下这次大赛要求达成情况.
比赛要求达成情况!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
各个分值项的详解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
一,需求提炼数据点以及产品定义
二 设别端实现配置入网
文字描述。。。。。。。。
三 实现demoapp和设备的控制(其实我们自己开发了个app(后面介绍))
视频演示。。。。。。。。
四 实时时钟
因为这个功能我们用了pcf8563芯片 这样就实现了实时时钟(而且断网后不影响)
五 报警功能
手机远程提醒(后面介绍) 语音提醒(后面介绍)
六 可产品化程度
先说一下这次的成本,因为我们这次是做的模型 ,什么都在探索,步进电机就换了两次(每次都是力不够(力量和空间)),总体来说这次花费还是不很多500 元左右,如果投入市场成本也就是200元左右。另外我们设计的非常人性化,
一次设定,很长时间不用管(它是自动筛选药品哦),即使是掉电也不用怕哦,有记忆功能
断网更不要怕 自动重新连接 另外本地运行(语音还是照样提醒哦)
七硬件系统
硬件系统主要是pcb 走线布局 +stm32(C语言 功能实现)+wifi(esp8266)+机智云平台
在下先放个功能图给大家尝尝鲜!!!!!!!!!!!!!!!!
八软件系统
软件部分主要是用机智云的sdk,集成了机智云的sdk,开发起来还是很好入门的,向我这种小白在学了两个星期后就基本入门了,加上自己的做做UI,就可以了。代码很简单 贴出来了在后面(开源了)(好戏在后面。。。。。。。。。。。。。。)
九 发挥项
1 语音播报
通过wt588d, 进行语音提醒 ,感情切(也可以自己录音哦)
2 断电后数据不丢
通过数据保存(一次设定,全程无忧)。(再也不用担心重复设定了)
3 自动化分拣药品种类
每天还在想那个药品吃多少吗(你就out 啦 ,全新智能药盒, 再也不用烦恼了 )
4 断网后自动连接
断网后重新设置 不用 (网络连接失败后(有网络后)会重新连接的)
==================================================================
我是分割线=============================================================================
---------------------------上面主要讲了写大赛要求相关的东西。。。说了这么多我们还没有知道过程呢。。。好吧 马上来--------------------------------------------------------------------
我们这个智能药盒是我们团队两个月多月的时间从无到有的一个搞机械 组装,一个搞app ,一个搞电路写程序,接下来就有我详细介绍我们的这个作品
总体结构:
电气部分:通过重新设计板子设计基于机智云平台的设备,设计集成了若干模块,主要包括eeprom,时钟模块、运动驱动模块、语 音提醒模块、传感器模块(温湿度、霍尔、光耦)、网络模块。
药盒模型:重点解决自动提取药物部分的模型(转盘式双层筛板)
云:使用机智云平台,独立搭建数据点。
APP:与机智云平台和MCU通讯,从而进行对智能药盒的管理控制;远程 监控;远程提醒,远程温湿度查看。
材料清单:
pcb板(定制)
|
步进电机;驱动
|
震动电机
|
Risym槽型光耦模块
|
温湿度模块
|
语音模块
|
汉高百得PL70
|
圆管
|
esp8266 模块
|
电池
|
轴
|
轴承
|
亚克力(定制)
|
同步轮
|
同步带
|
pcf8563模块
|
下面我就以时间轴方式介绍一下电气部分7月一号:开贴报名
7月1-5号:寻找小伙伴
7月5-10号: 确定主题(开始建立数据点)7月11-20号:对机智云的协议分析(包括大段字节 ,数据的标志位的理解)
7月21-30号:对本地时钟和传输的数据进行写入
8月1-10号: 对机智云的硬件充分理解画出原理图和pcb板
8月11-17号:终于等到了pcb(对电路板的焊接 和调试 )
8月17-20号:对原理图和pcb 图进行修改 从而实现功能
注:(程序一直穿插其中)
下面以此介绍程序的实现,电路的实现,pcb注意的事再次之前先发下我的文件夹(每天都在记录 哦)
机智云程序
网络获取时间:
-
uint8_t getTime[9]={0xFF,0xFF,0x00,0x05,0x17,0x78,0x00,0x00,0x94};
复制代码
-
<blockquote>/**
复制代码
原理图:: pcb图 来个3d吧
大家会疑问,为什么要做成是这样的 答案是省钱,又做了个wifi 转接板 现实图这样的
裁剪之后是这样的(焊接的照片 传不上去 正在联系机智云。。。稍后奉上)
健康卫士APP一、控制页面
-
<font size="1">//控制页面
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.gokit_control);
-
tabHost = (TabHost) findViewById(android.R.id.tabhost);
-
tabHost.setup();
-
tabHost.addTab(tabHost.newTabSpec("one_drug").setIndicator("第一种药").setContent(R.id.one_drug));
-
tabHost.addTab(tabHost.newTabSpec("two_drug").setIndicator("第二种药").setContent(R.id.two_drug));
-
tabHost.addTab(tabHost.newTabSpec("three_drug").setIndicator("第三种药").setContent(R.id.three_drug));
-
tabHost.addTab(tabHost.newTabSpec("four_drug").setIndicator("第四种药").setContent(R.id.four_drug));
-
-
initViews(); //初始化控件
-
initEvents(); //初始化**
-
-
deviceStatu = new HashMap<String, Object>();
-
controlDevice = (ControlDevice) getIntent().getSerializableExtra("device");
-
WApplication.mControlDevice=controlDevice;
-
xpgWifiDevice = BaseActivity.findDeviceByMac(controlDevice.getMac(), controlDevice.getDid());
-
if (xpgWifiDevice != null) {
-
xpgWifiDevice.setListener(deviceListener);
-
}
-
actionBar.setTitle(controlDevice.getName());
-
}
-
-
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
-
-
public static String bytesToHex(byte[] bytes) {
-
char[] hexChars = new char[bytes.length * 3];
-
for (int j = 0; j < bytes.length; j++) {
-
int v = bytes[j] & 0xFF;
-
hexChars[j * 3] = hexArray[v >>> 4];
-
hexChars[j * 3 + 1] = hexArray[v & 0x0F];
-
hexChars[j * 3 + 2] = ' ';
-
}
-
return new String(hexChars);
-
}
-
-
-
-
/**
-
* 初始化控件.
-
*/
-
private void initViews() {
-
mybutton = (Button) findViewById(R.id.mybutton);
-
-
editTextA = (EditText) findViewById(R.id.editTextA);
-
editTextB = (EditText) findViewById(R.id.editTextB);
-
editTextC = (EditText) findViewById(R.id.editTextC);
-
editTextD = (EditText) findViewById(R.id.editTextD);
-
editTextE = (EditText) findViewById(R.id.editTextE);
-
editTextF = (EditText) findViewById(R.id.editTextF);
-
editTextG = (EditText) findViewById(R.id.editTextG);
-
editTextH = (EditText) findViewById(R.id.editTextH);
-
-
vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
-
swInfrared = (Switch) findViewById(R.id.sw_infrared1);
-
-
-
Map<String, String> map = FileActivity.ShowData3();
-
if(map != null)
-
{
-
editTextA.setText(map.get("Aname"));
-
editTextB.setText(map.get("Age"));
-
editTextC.setText(map.get("Bname"));
-
editTextD.setText(map.get("Bge"));
-
editTextE.setText(map.get("Cname"));
-
editTextF.setText(map.get("Cge"));
-
editTextG.setText(map.get("Dname"));
-
editTextH.setText(map.get("Dge"));
-
}
-
-
}
-
-
/**
-
* 初始化**.
-
*/
-
private void initEvents() {
-
/**打开预约时间页面*/
-
mybutton.setOnClickListener(new OnClickListener() {
-
@Override
-
public void onClick(View v) {
-
// TODO Auto-generated method stub
-
String unt1 = editTextB.getText().toString().trim();
-
String unt2 = editTextD.getText().toString().trim();
-
String unt3 = editTextF.getText().toString().trim();
-
String unt4 = editTextH.getText().toString().trim();
-
Intent intent = new Intent();
-
-
//储存药品名字合个数
-
if(TextUtils.isEmpty(editTextC.getText().toString()) && TextUtils.isEmpty(editTextE.getText().toString()) && TextUtils.isEmpty(editTextG.getText().toString()))
-
{
-
FileActivity.DataLog3(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()), "", 0, "",0,"",0);
-
}
-
else if(editTextE.getText().toString() == null && editTextG.getText().toString() == null)
-
{
-
FileActivity.DataLog3(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()),editTextC.getText().toString(),Integer.parseInt(editTextD.getText().toString()) , "",0,"",0);
-
}
-
else if(editTextG.getText().toString() == null)
-
{
-
FileActivity.DataLog3(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()),editTextC.getText().toString(),Integer.parseInt(editTextD.getText().toString()) , editTextE.getText().toString(),Integer.parseInt(editTextF.getText().toString()),"",0);
-
}
-
else
-
{
-
FileActivity.DataLog3(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()), editTextC.getText().toString(),Integer.parseInt(editTextD.getText().toString()), editTextE.getText().toString(),Integer.parseInt(editTextF.getText().toString()), editTextG.getText().toString(),Integer.parseInt(editTextH.getText().toString()));
-
}
-
-
if(TextUtils.isEmpty(unt1))
-
{
-
intent.putExtra("one1","0");
-
}
-
else
-
{
-
intent.putExtra("one1",unt1);
-
}
-
if(TextUtils.isEmpty(unt2))
-
{
-
intent.putExtra("one2","0");
-
}
-
else
-
{
-
intent.putExtra("one2",unt2);
-
}
-
if(TextUtils.isEmpty(unt3))
-
{
-
intent.putExtra("one3","0");
-
}
-
else
-
{
-
intent.putExtra("one3",unt3);
-
}
-
if(TextUtils.isEmpty(unt4))
-
{
-
intent.putExtra("one4","0");
-
}
-
else
-
{
-
intent.putExtra("one4",unt4);
-
}
-
intent.setClass(GokitControlActivity1.this, Time_Activity.class);
-
startActivity(intent);
-
}
-
});
-
swInfrared.setOnCheckedChangeListener(new OnCheckedChangeListener() {
-
-
@Override
-
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-
try {
-
if(isChecked == true)
-
{
-
vibrator.vibrate(new long[]{1000,3000,1000,3000},0); //手机震动提示
-
-
new AlertDialog.Builder(GokitControlActivity1.this).setTitle("警告")//设置对话框标题
-
.setMessage("为了您的健康!\n请按时吃药!")//设置显示的内容
-
.setNegativeButton("确定",new DialogInterface.OnClickListener() {//添加返回按钮
-
-
@Override
-
public void onClick(DialogInterface dialog, int which) {//响应事件
-
-
// TODO Auto-generated method stub
-
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd HH:mm");
-
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
-
String str = formatter.format(curDate);
-
if(editTextA.getText().toString() != null)
-
{
-
FileActivity.DataLog2(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()),str);
-
-
}
-
if(editTextC.getText().toString() != null)
-
{
-
FileActivity.DataLog2(editTextC.getText().toString(),Integer.parseInt(editTextD.getText().toString()),str);
-
}
-
if(editTextE.getText().toString() != null)
-
{
-
FileActivity.DataLog2(editTextE.getText().toString(),Integer.parseInt(editTextF.getText().toString()),str);
-
}
-
if(editTextG.getText().toString() != null)
-
{
-
FileActivity.DataLog2(editTextG.getText().toString(),Integer.parseInt(editTextH.getText().toString()),str);
-
}
-
vibrator.cancel();
-
Log.i("123"," 请保存数据!");
-
-
}
-
-
}).show();//在按键响应事件中显示此对话框
-
}
-
else
-
{
-
vibrator.cancel();
-
}
-
Log.v("123", ""+isChecked);
-
-
sendJson(KEY_INFRARED, isChecked);
-
} catch (JSONException e) {
-
e.printStackTrace();
-
}
-
}
-
});
-
}</font>
复制代码
二、预约时间
-
<blockquote>class Button12 implements OnClickListener
复制代码
三、温湿度查看
-
/**
-
*温湿度查看
-
*/
-
case R.id.action_device_status:
-
new Ale.Builder(GokitControlActivity1.this).setTitle("温湿度查看")//设置对话框标题
-
-
.setMessage("环境湿度 "+ s +"\n" + "环境温度 " + w)//设置显示的内容
-
.setNegativeButton("确定",new DialogInterface.OnClickListener() {//添加返回按钮
-
@Override
-
-
public void onClick(DialogInterface dialog, int which) {//响应事件
-
-
// TODO Auto-generated method stub
-
-
Log.i("alertdialog"," 请保存数据!");
-
-
}
-
-
}).show();//在按键响应事件中显示此对话框
-
break;
复制代码
四、储存数据与读取数据
-
/**
复制代码
五、服药日志记录
-
/*<span style="font-size: 14px; line-height: 1.5;">*服药日志</span>
复制代码
|