|
file:///C:\Users\GUOQIN~1.QIN\AppData\Local\Temp\ksohtml\wps28E1.tmp.png(寶盒鎮樓o(∩_∩)o ) ============================華麗的分割線============================= 創意來源: “哎呀,忘了”!隨著生活節奏的加快,年齡的增長,人們的總容易忘記一些事情,比如忘記吃藥。尤其是家中的老人,由于身體問題,可能需要長期服藥治療,但年歲大了總容易忘這忘那的。但在科技快速發展的今天,這些都不是問題,我們設計并開發了一款名為“健康衛士”的智能藥盒,可以聯網監測用戶的服藥情況,提示用戶服藥,并且根據用戶設定自動提取所需藥物。 哎呀!!!!!!!忘記了我是來參賽的,說下這次大賽要求達成情況.
比賽要求達成情況!。。。。。。。。。。。。。。。。。。。。。。。。。。!
各個分值項的詳解。。。。。。。。。。。。。。。。。。。。。。。。。。。。!
一,需求提煉數據點以及產品定義 二 設別端實現配置入網 文字描述。。。。。。。。 三 實現demoapp和設備的控制(其實我們自己開發了個app(后面介紹)) 視頻演示。。。。。。。。 四 實時時鐘 因為這個功能我們用了pcf8563芯片 這樣就實現了實時時鐘(而且斷網后不影響) 五 報警功能 手機遠程提醒(后面介紹) 語音提醒(后面介紹) 六 可產品化程度 先說一下這次的成本,因為我們這次是做的模型 ,什么都在探索,步進電機就換了兩次(每次都是力不夠(力量和空間)),總體來說這次花費還是不很多500 元左右,如果投入市場成本也就是200元左右。另外我們設計的非常人性化, 一次設定,很長時間不用管(它是自動篩選藥品哦),即使是掉電也不用怕哦,有記憶功能 斷網更不要怕 自動重新連接 另外本地運行(語音還是照樣提醒哦) 七硬件系統
硬件系統主要是pcb 走線布局 +stm32(C語言 功能實現)+wifi(esp8266)+機智云平臺
在下先放個功能圖給大家嘗嘗鮮!!!。。。。。。。。。。。!
八軟件系統 軟件部分主要是用機智云的sdk,集成了機智云的sdk,開發起來還是很好入門的,向我這種小白在學了兩個星期后就基本入門了,加上自己的做做UI,就可以了。代碼很簡單 貼出來了在后面(開源了)(好戲在后面。。。。。。。。。。。。。。)
九 發揮項 1 語音播報 通過wt588d, 進行語音提醒 ,感情切(也可以自己錄音哦) 2 斷電后數據不丟 通過數據保存(一次設定,全程無憂)。(再也不用擔心重復設定了) 3 自動化分揀藥品種類 每天還在想那個藥品吃多少嗎(你就out 啦 ,全新智能藥盒, 再也不用煩惱了 ) 4 斷網后自動連接 斷網后重新設置 不用 (網絡連接失敗后(有網絡后)會重新連接的) ================================================================== 我是分割線============================================================================= ---------------------------上面主要講了寫大賽要求相關的東西。。。說了這么多我們還沒有知道過程呢。。。好吧 馬上來-------------------------------------------------------------------- 我們這個智能藥盒是我們團隊兩個月多月的時間從無到有的一個搞機械 組裝,一個搞app ,一個搞電路寫程序,接下來就有我詳細介紹我們的這個作品 總體結構: 電氣部分:通過重新設計板子設計基于機智云平臺的設備,設計集成了若干模塊,主要包括eeprom,時鐘模塊、運動驅動模塊、語 音提醒模塊、傳感器模塊(溫濕度、霍爾、光耦)、網絡模塊。 藥盒模型:重點解決自動提取藥物部分的模型(轉盤式雙層篩板) 云:使用機智云平臺,獨立搭建數據點。 APP:與機智云平臺和MCU通訊,從而進行對智能藥盒的管理控制;遠程 監控;遠程提醒,遠程溫濕度查看。
材料清單: 下面我就以時間軸方式介紹一下電氣部分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};
[color=rgb(0, 0, 0) !important]復制代碼
[color=rgb(0, 0, 0) !important]復制代碼
原理圖:: 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>
[color=rgb(0, 0, 0) !important]復制代碼

二、預約時間- <blockquote>class Button12 implements OnClickListener
[color=rgb(0, 0, 0) !important]復制代碼
三、溫濕度查看
- /**
- *溫濕度查看
- */
- 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;
[color=rgb(0, 0, 0) !important]復制代碼
四、儲存數據與讀取數據
[color=rgb(0, 0, 0) !important]復制代碼
五、服藥日志記錄 - /*<span style="font-size: 14px; line-height: 1.5;">*服藥日志</span>
[color=rgb(0, 0, 0) !important]復制代碼
|
|
| [tr][/tr]
| 點評回復 編輯 [url=]使用道具[/url] [url=]舉報[/url]
| | |

積分725
| 沙發
發表于 2016-7-5 17:22:58 | 只看該作者
| | [tr][/tr]
| 管理回復 編輯 [url=]使用道具[/url]
| | |

積分331
| 板凳
樓主| 發表于 昨天 14:14 | 只看該作者
【STM 32】之智能藥盒本帖最后由 郭慶帥 于 2016-8-22 18:43 編輯
健康衛士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();
- }
- }
- });
- }
[color=rgb(0, 0, 0) !important]復制代碼
二、預約時間- <blockquote>class Button12 implements OnClickListener
[color=rgb(0, 0, 0) !important]復制代碼
三、溫濕度查看
- /**
- *溫濕度查看
- */
- 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;
[color=rgb(0, 0, 0) !important]復制代碼
四、儲存數據與讀取數據
[color=rgb(0, 0, 0) !important]復制代碼
五、服藥日志記錄 - /*<span style="font-size: 14px; line-height: 1.5;">*服藥日志</span>
[color=rgb(0, 0, 0) !important]復制代碼
[color=rgb(0, 0, 0) !important]
|
|
|
|