Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 114 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
114
Dung lượng
3,95 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP NĨN BẢOHIỂMPHÁTHIỆNNỒNGĐỘCỒNBẰNGSMARTPHONE Ngành: ĐIỆN – ĐIỆN TỬ Chuyên ngành: ĐIỆN CÔNG NGHIỆP Giảng viên hướng dẫn: ThS Nghiêm Hoàng Hải Sinh viên thực hiện: Phạm Xuân Bách MSSV: 1311020057 Trương Hoàng Thái Bảo MSSV: 1311020063 Lớp: 13DDC03 TP Hồ Chí Minh, 2017 LỜI CAM ĐOAN Chúng cam đoan Đồ án tốt nghiệp cơng trình nghiên cứu thân chúng tơi hướng dẫn Thạc sĩ Nghiêm Hoàng Hải Các kết công bố Đồ án tốt nghiệp “Nón bảohiểmphátnồngđộcồn Smartphone” trung thực khơng chép từ cơng trình khác Nhóm thực đề tài Phạm Xuân Bách – Trương Hoàng Thái Bảo iii LỜI CẢM ƠN Lời cảm ơn xin gửi tới thầy Nghiêm Hồng Hải, thầy bận cơng việc giảng dạy, thầy đồng ý hướng dẫn đồ án tốt nghiệp cho nhóm chúng tơi Trong q trình làm đồ án, thầy ln bảo, nhắc nhở để chúng tơi vượt qua khó khăn hồn thành đồ án tiến độ Bên cạnh đó, với lời nhận xét, góp ý thầy giúp chúng tơi có định hướng đắn thực đề tài Chúng xin bày tỏ lòng biết ơn sâu sắc tới q thầy khoa Cơ Điện-Điện Tử Quý thầy cô người dạy dỗ, truyền đạt cho từ kiến thức nhất, đồng thời thường xuyên giúp đỡ nhiệt tình chúng tơi có khó khăn vấn đề nghiên cứu đề tài, tạo điều kiện thuận lợi để chúng tơi có mơi trường, điều kiện nghiên cứu tốt Cuối cùng, chúng tơi khơng qn gửi lời cảm ơn sâu sắc tới gia đình, người thân bạn bè nguồn động viên to lớn hỗ trợ mặt tinh thần vật chất để chúng tơi có thêm động lực tự tin để hồn thành đồ án Nhóm thực đề tài Phạm Xuân Bách – Trương Hoàng Thái Bảo iv MỤC LỤC Trang PHIẾU GIAO ĐỀ TÀI i LỜI CAM ĐOAN iii LỜI CẢM ƠN iv MỤC LỤC v DANH MỤC CÁC TỪ VIẾT TẮT vii DANH MỤC HÌNH VẼ viii DANH MỤC BẢNG BIỂU xi LỜI MỞ ĐẦU xii CHƯƠNG TỔNG QUAN 1.1 ĐẶT VẤN ĐỀ 1.2 MỤC TIÊU 1.3 NỘI DUNG NGHIÊN CỨU 1.4 GIỚI HẠN 1.5 BỐ CỤC CHƯƠNG CƠ SỞ LÝ THUYẾT 2.1 CẢM BIẾN CỒN MQ3 2.1.1 Khái niệm cảm biến 2.1.2 Cảm biến MQ3 2.1.3 Cấu tạo cảm biến 2.1.4 Nguyên lý hoạt động 2.2 VI ĐIỀU KHIỂN ARDUINO NANO 2.2.1 Khái niệm vi điều khiển 2.2.2 Board vi điều khiển Arduino Nano 2.2.3 Bộ ADC Arduino Nano 2.2.4 Timer/Counter Arduino Nano 2.2.5 Giao tiếp UART Arduino Nano 2.3 GIỚI THIỆU VỀ BLUETOOTH 10 2.3.1 Khái niệm Bluetooth 10 2.3.2 Các đặc điểm Bluetooth 11 2.3.3 Ưu nhược điểm Bluetooth 12 2.3.4 Module Bluetooth HC-06 12 2.4 GIỚI THIỆU HỆ ĐIỀU HÀNH ANDROID 14 v 2.4.1 Android gì? 14 2.4.2 Ưu nhược điểm Android 15 2.4.3 Kiến trúc hệ điều hành Android 16 CHƯƠNG TÍNH TỐN VÀ THIẾT KẾ 21 3.1 GIỚI THIỆU 21 3.2 TÍNH TỐN VÀ THIẾT KẾ 21 3.2.1 Thiết kế sơ đồ khối hệ thống 21 3.2.2 Tính tốn thiết kế mạch 22 3.2.3 Sơ đồ nguyên lý toàn mạch 34 CHƯƠNG THI CÔNG HỆ THỐNG 35 4.1 GIỚI THIỆU 35 4.2 THI CÔNG HỆ THỐNG 35 4.2.1 Thi công bo mạch 35 4.2.2 Lắp ráp kiểm tra 36 4.3 ĐÓNG GĨI VÀ THI CƠNG MƠ HÌNH 36 4.3.1 Đóng gói điều khiển 36 4.3.2 Thi cơng mơ hình 38 4.4 LẬP TRÌNH HỆ THỐNG 39 4.4.1 Lưu đồ giải thuật 39 4.4.2 Phần mềm lập trình cho vi điều khiển 50 4.4.3 Phần mềm lập trình cho điện thoại 51 4.5 HƯỚNG DẪN SỬ DỤNG 57 CHƯƠNG KẾT QUẢ, NHẬN XÉT VÀ ĐÁNH GIÁ 66 5.1 KẾT QUẢ 66 5.2 NHẬN XÉT 67 5.3 ĐÁNH GIÁ 68 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 71 6.1 KẾT LUẬN 71 6.2 HƯỚNG PHÁT TRIỂN 72 TÀI LIỆU THAM KHẢO PHỤ LỤC vi DANH MỤC CÁC TỪ VIẾT TẮT RH: Relative Humidity RF: Radio Frequency NFC: Near Field Communication LoRa: Long Range TI: Texas Intruments IC: Integated Circuit I/O: Input/Output MCU: Micro Controller Unit UART: Universal Asynchronous Receiver-Transmitter PC: Personal Computer PDA: Personal Digital Assistant AT: Attention USB: Universal Serial Bus VM: Virtual Machine API: Application Programming Interface ID: Identification EN: Enable LCD: Liquid Crytal Dislay GLCD: Graphic Liquid Crytal Dislay Op-Amp: Operational Amplifier IDE: Integrated Development Environment RAM: Random Access Memory vii DANH MỤC HÌNH ẢNH Hình Trang Hình 2.1 Cảm biến MQ3 Hình 2.2 Sơ đồ chân cảm biến MQ3 Hình 2.3 Lõi nhơm chưa đun nóng Hình 2.4 Lõi nhơm sau đun nóng Hình 2.5 Hệ thống vi điều khiển Hình 2.6 Sơ đồ chức chân Arduino Nano Hình 2.7 Giao tiếp hệ thống dùng chuẩn UART Hình 2.8 Nguyên lý hoạt động chuẩn UART 10 Hình 2.9 Biểu tượng bluetooth 10 Hình 2.10 Ứng dụng Bluetooth điều khiển thiết bị ngoại vi 11 Hình 2.11 Module Bluetooth HC-06 13 Hình 2.12 Các phiên Android 15 Hình 2.13 Kiến trúc ngăn xếp hệ thống Android 17 Hình 3.1 Sơ đồ khối hệ thống 21 Hình 3.2 Ứng dụng mơ hình nónbảohiểm 22 Hình 3.3 Sơ đồ kết nối cảm biến với vi điều khiển 22 Hình 3.4 Module cảm biến MQ3 23 Hình 3.5 Sơ đồ nối dây module cảm biến MQ3 23 Hình 3.6 Biểu đồ đặc tuyến quan hệ điện trở cảm biến với nồngđộ số khí có khơng khí điều kiện chuẩn 25 Hình 3.7 Hai bảng liệu mẫu 27 Hình 3.8 Kết sau chạy mơ MATLAB 28 Hình 3.9 Sai số thu sau mô 29 Hình 3.10 Phương trình đường đặc tuyến thu 29 Hình 3.11 Sơ đồ nối dây vi điều khiển Broad Arduino Nano 30 Hình 3.12 Sơ đồ nối dây mạch nạp CH340 Arduino Nano 31 Hình 3.13 Sơ đồ nguyên lý khối Module Bluetooth 31 Hình 3.14 Module Bluetooth HC-06 thực tế 32 Hình 3.15 Led hai màu ba chân thực tế 32 Hình 3.16 Sơ đồ hai loại led hai màu 32 Hình 3.17 Sơ đồ kết nối led hai màu Cathode chung với MCU 33 Hình 3.18 Sạc dự phòng Romoss ACE 10 34 Hình 3.19 Sơ đồ nguyên lý toàn mạch 34 viii Hình 4.1 Sơ đồ mạch in khối xử lý trung tâm 35 Hình 4.2 Hình ảnh thực tế khối xử lý trung tâm 36 Hình 4.3 Vỏ mica khối xử lý trung tâm 37 Hình 4.4 Đóng gói khối xử lý trung tâm 37 Hình 4.5 Nónbảohiểm ¾ đầu 38 Hình 4.6 Lưu đồ chương trình 39 Hình 4.7 Lưu đồ chương trình ngắt báo tràn Timer1 42 Hình 4.8 Lưu đồ chương trình ngắt báo tràn Timer2 43 Hình 4.9 Lưu đồ chương trình đonồngđộcồn 44 Hình 4.10 Lưu đồ chương trình lập trình Android 45 Hình 4.11 Lưu đồ nút nhấn đăng ký 46 Hình 4.12 Lưu đồ nút nhấn đăng nhập 47 Hình 4.13 Lưu đồ xử lý liệu cảnh báo 48 Hình 4.14 Lưu đồ nút nhấn kết nối 49 Hình 4.15 Giao diện phần mềm Arduino IDE 50 Hình 4.16 Phần mềm Android Studio 52 Hình 4.17 Cấu trúc trang thiết kế giao diện Tab Design 52 Hình 4.18 Cấu trúc trang thiết kế giao diện Tab Text 54 Hình 4.19 Lựa chọn thiết bị cài đặt 54 Hình 4.20 Giao diện hình đăng nhập 56 Hình 4.21 Giao diện hình đăng ký 56 Hình 4.22 Giao diện hình hiển thị 57 Hình 4.23 Các bước cài đặt Ứng dụng điện thoại 58 Hình 4.24 Led báo khối trung tâm cảm biến sáng 58 Hình 4.25 Giao diện khởi động Ứng dụng 59 Hình 4.26 Lỗi đăng nhập khơng thành cơng 59 Hình 4.27 Giao diện trang đăng ký 60 Hình 4.28 Lỗi tạo tài khoản không thành công 60 Hình 4.29 Đăng ký tài khoản thành công 61 Hình 4.30 Giao diện đăng nhập thành cơng 61 Hình 4.31 Led báo mạch sẵn sàng hoạt động 62 Hình 4.32 Giao diện nồngđộcồn bình thường 62 Hình 4.33 Cảnh báonồngđộcồn vượt ngưỡng cho phép 63 Hình 4.34 Cảnh báonồngđộcồn vượt ngưỡng khẩn cấp 63 Hình 4.35 Led báo nhấp nháy màu đỏnónbảohiểm 64 Hình 4.36 Giao diện lịch sử nồngđộcồn 64 ix Hình 4.37 Giao diện kết thúc Ứng dụng 65 Hình 4.38 Thơng tin hướng dẫn sử dụng 65 Hình 5.1 Kết mơ hình sau thi công 66 Hình 5.2 Ứng dụng SmartPhone 66 Hình 5.3 Đường đặc tuyến từ datasheet nhà sản xuất 69 Hình 5.4 Kết sau mô 69 Hình 5.5 Sai số thu sau mô 70 x DANH MỤC BẢNG BIỂU Bảng Trang Bảng 2.1 Thông số kỹ thuật cảm biến MQ3 Bảng 3.1 Giá trị RS đo môi trường điều kiện phòng 26 Bảng 3.2 Liệt kê điện áp dòng linh kiện sử dụng mạch 33 Bảng 4.1 Bảng phân bố tài nguyên Project 52 xi PHỤ LỤC public static final String TABLE_NAME1 = "LichSu_table"; public static final String COL_1 = "ID"; public static final String COL_2 = "NAME"; public static final String COL_3 = "NONGDOCON"; public static final String COL_4 = "TIME"; public CoSoDuLieu(Context context) { super(context, DATABASE_NAME1, null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table " + TABLE_NAME1 +" (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT,NONGDOCON TEXT,TIME TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME1); onCreate(db); } public boolean insertData(String name,String nongdocon,String time) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(COL_2,name); contentValues.put(COL_3,nongdocon); contentValues.put(COL_4,time); long result = db.insert(TABLE_NAME1,null ,contentValues); if(result == -1) return false; else return true; } public Cursor getAllData() { SQLiteDatabase db = this.getWritableDatabase(); Cursor res = db.rawQuery("select * from "+TABLE_NAME1,null); return res; } public Integer deleteData (String id) { SQLiteDatabase db = this.getWritableDatabase(); return db.delete(TABLE_NAME1, "ID = ?",new String[] {id}); } } Code file activity_dislay.xml: /> PHỤ LỤC Code file Dislay.java: package com.example.phucho.myapplication; import android.Manifest; import android.app.AlertDialog; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Color; import android.media.MediaPlayer; import android.os.Message; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; import java.util.UUID; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; PHỤ LỤC import android.os.Build; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import java.util.Calendar; import android.widget.TextView; import android.widget.Toast; import android.os.Vibrator; import android.telephony.SmsManager; import android.widget.ToggleButton; import android.content.ActivityNotFoundException; import android.net.Uri; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.appindexing.Thing; import com.google.android.gms.common.api.GoogleApiClient; import static com.example.phucho.myapplication.R.*; public class Display extends AppCompatActivity { private static final String TAG = "bluetooth2"; ToggleButton btn_chophep; ImageView img_xemlichsu; TextView txt_canhbao, txt_nongdo, txt_status, txt_user; Handler h; boolean tt = false; boolean tt_mess = false,tt_call=false; final int RECIEVE_MESSAGE = 1; private BluetoothAdapter btAdapter = null; private BluetoothSocket btSocket = null; private StringBuilder sb = new StringBuilder(); private ConnectedThread mConnectedThread; CoSoDuLieu myDb; private static final UUID MY_UUID = UUID.fromString("00001101-00001000-8000-00805F9B34FB"); private static String address = "20:16:10:28:81:58"; String num; float AlcholValueActual; Vibrator v; private GoogleApiClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(layout.activity_display); myDb = new CoSoDuLieu(this); final String username = getIntent().getStringExtra("UserName"); num = getIntent().getStringExtra("NumberPhone"); txt_user = (TextView) findViewById(id.txt_user); final TextView txt_sdt = (TextView) findViewById(id.txt_sdt); txt_user.setText(username); txt_sdt.setText(num); PHỤ LỤC img_xemlichsu=(ImageView)findViewById(id.img_xemlichsu); btn_chophep = (ToggleButton) findViewById(id.btn_chophep); txt_status = (TextView) findViewById(id.txt_status); txt_nongdo = (TextView) findViewById(id.txt_nongdo); txt_canhbao = (TextView) findViewById(id.txt_canhbao); v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); final MediaPlayer nhac = MediaPlayer.create(Display.this, raw.translate); ImageView img_logout = (ImageView)findViewById(id.img_logout); h = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case RECIEVE_MESSAGE: byte[] readBuf = (byte[]) msg.obj; String strIncom = new String(readBuf, 0, msg.arg1); sb.append(strIncom); int endOfLineIndex = sb.indexOf("~"); if (endOfLineIndex > 0) { String sbprint = sb.substring(0, endOfLineIndex); if (sbprint.charAt(0) == '#') { txt_nongdo.setText(sbprint.substring(1, 6) + " mg/l"); AlcholValueActual = Float.parseFloat(sbprint.substring(1, 5)); if (AlcholValueActual < 0.25) { txt_canhbao.setText("Nồng độcồn thể bạn chưa vượt mức cho phép Bạn nên cân nhắc việc điều khiển phương tiện giao thông."); v.vibrate(0); txt_nongdo.setTextColor(Color.BLACK); tt_mess = false; tt_call= false; if (tt) { nhac.pause(); tt = false; } mConnectedThread.write("a"); } else if ((AlcholValueActual>=0.25)&& (AlcholValueActual= 10) { try { final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[]{UUID.class}); return (BluetoothSocket) m.invoke(device, MY_UUID); } catch (Exception e) { Log.e(TAG, "Could not create Insecure RFComm Connection", e); } } return device.createRfcommSocketToServiceRecord(MY_UUID); } @Override public void onResume() { super.onResume(); Log.d(TAG, " onResume - try connect "); BluetoothDevice device = btAdapter.getRemoteDevice(address); try { btSocket = createBluetoothSocket(device); PHỤ LỤC } catch (IOException e) { errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + "."); } Log.d(TAG, " Connecting "); try { btSocket.connect(); Log.d(TAG, " Connection ok "); } catch (IOException e) { try { btSocket.close(); } catch (IOException e2) { errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + "."); } } Log.d(TAG, " Create Socket "); mConnectedThread = new ConnectedThread(btSocket); mConnectedThread.start(); } @Override public void onPause() { super.onPause(); Log.d(TAG, " In onPause() "); try { btSocket.close(); } catch (IOException e2) { errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + "."); } } private void checkBTState() { if (btAdapter == null) { errorExit("Fatal Error", "Bluetooth not support"); } else { if (btAdapter.isEnabled()) { Log.d(TAG, " Bluetooth ON "); } else { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, 1); } } } private void errorExit(String title, String message) { Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show(); finish(); } public Action getIndexApiAction() { Thing object = new Thing.Builder() PHỤ LỤC setName("Display Page") // TODO: Define a title for the content shown // TODO: Make sure this auto-generated URL is correct .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) build(); return new Action.Builder(Action.TYPE_VIEW) setObject(object) setActionStatus(Action.STATUS_TYPE_COMPLETED) build(); } @Override public void onStart() { super.onStart(); client.connect(); AppIndex.AppIndexApi.start(client, getIndexApiAction()); } @Override public void onStop() { super.onStop(); AppIndex.AppIndexApi.end(client, getIndexApiAction()); client.disconnect(); } private class ConnectedThread extends Thread { private final InputStream mmInStream; private final OutputStream mmOutStream; public ConnectedThread(BluetoothSocket socket) { InputStream tmpIn = null; OutputStream tmpOut = null; try { tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); } catch (IOException e) { } mmInStream = tmpIn; mmOutStream = tmpOut; } public void run() { byte[] buffer = new byte[256]; int bytes; while (true) { try { bytes = mmInStream.read(buffer); h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget(); } catch (IOException e) { break; } } } public void write(String message) { Log.d(TAG, " Data to send: " + message + " "); PHỤ LỤC byte[] msgBuffer = message.getBytes(); try { mmOutStream.write(msgBuffer); } catch (IOException e) { Log.d(TAG, " Error data send: " + e.getMessage() + " "); } } } private void sendSMS(String phoneNumber, String message) { String SENT = "SMS_SENT"; String DELIVERED = "SMS_DELIVERED"; PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0); PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0); registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(Display.this, "Tin nhắn gửi thành công!", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(getBaseContext(), "Tin nhắn chưa gửi đi.", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NO_SERVICE: Toast.makeText(getBaseContext(), "Tin nhắn chưa gửi đi.", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(getBaseContext(), "Tin nhắn chưa gửi đi.", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_RADIO_OFF: Toast.makeText(getBaseContext(), "Tin nhắn chưa gửi đi.", Toast.LENGTH_SHORT).show(); break; } } }, new IntentFilter(SENT)); registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(getBaseContext(), "Tin nhắn gửi đến nơi thành công!", Toast.LENGTH_SHORT).show(); break; PHỤ LỤC case Activity.RESULT_CANCELED: Toast.makeText(getBaseContext(), "Tin nhắn chưa gửi đi.", Toast.LENGTH_SHORT).show(); break; } } }, new IntentFilter(DELIVERED)); SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); } private void call(String phoneNumber) { try { Intent it = new Intent(Intent.ACTION_CALL); it.setData(Uri.parse("tel:" + phoneNumber)); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling return; } startActivity(it); } catch (ActivityNotFoundException e) { } } private void AddData() { Calendar c = Calendar.getInstance(); String seconds = Integer.toString( c.get(Calendar.SECOND)); String minutes = Integer.toString(c.get(Calendar.MINUTE)); String hours = Integer.toString(c.get (Calendar.HOUR)); String mode = Integer.toString(c.get(Calendar.AM_PM)); String day = Integer.toString(c.get(Calendar.DAY_OF_MONTH)); String month =Integer.toString(c.get(Calendar.MONTH)); String year = Integer.toString(c.get(Calendar.YEAR)); if (mode.equals("1")) { hours = Integer.toString(12+Integer.parseInt(hours)); } String time = day + "/" + month + "/"+year+", "+hours+":"+minutes+":"+seconds; boolean isInserted = myDb.insertData( txt_user.getText().toString(), txt_nongdo.getText().toString(), time); if(isInserted == true) Toast.makeText(this,"Bạn có thêm kiện mới!",Toast.LENGTH_LONG).show(); } public void showMessage(String title,String Message){ final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(title); PHỤ LỤC builder.setMessage(Message); builder.setCancelable(false); builder.setPositiveButton("Đóng", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.setNegativeButton("Xóa lịch sử", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Cursor res = myDb.getAllData(); if(res.getCount() == 0) { // show message StringBuffer buffer = new StringBuffer(); buffer.append("Tên: "+txt_user.getText().toString()+"\n"); showMessage("LỊCH SỬ NỒNGĐỘCỒN [0]",buffer.toString()); return; } if (res.moveToFirst()) { { String a = res.getString(1); if (a.equals(txt_user.getText().toString())) { String id = res.getString(0); myDb.deleteData(id); } } while (res.moveToNext()); } } }); builder.show(); } public void logout() { mConnectedThread.write("C"); moveTaskToBack(true); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } } ... hình có khả phát nồng độ cồn thở người điều khiển phương tiện giao thông cảnh báo ý tưởng mang tính thực tiễn cần thiết Do đó, nhóm chọn thực đề tài: Nón bảo hiểm phát nồng độ cồn Smartphone ... đó, Bluetooth công nghệ phát triển từ lâu cải tiến để nâng cao tốc độ khả bảo mật.[4-5] CHƯƠNG TỔNG QUAN Do đó, chúng em định thực đề tài: Nón bảo hiểm phát nồng độ cồn Smartphone Đề tài ứng... mạch sẵn sàng hoạt động 62 Hình 4.32 Giao diện nồng độ cồn bình thường 62 Hình 4.33 Cảnh báo nồng độ cồn vượt ngưỡng cho phép 63 Hình 4.34 Cảnh báo nồng độ cồn vượt ngưỡng khẩn