Сигнализация

Противоугонная сигнализация для смартфона

Как часто вы забывали, где-либо свой телефон и долго не могли найти? Если у вас это происходит периодически, то эта самоделка для вас. Конечно, можно позвонить на потерянный телефон с другого телефона, но это если он есть под рукой и если ваш телефон тоже в пределах доступности.

С этим гаджетом вы больше никогда не потеряете свой телефон. Когда вы находитесь слишком далеко от телефона, устройство начнет мигать и свистеть, а ваш телефон будет воспроизводить раздражающий звук или музыку ( в зависимости от настройки). Мастер назвал свое устройство «Don’t Lose Me» или «Не теряй меня».

Давайте посмотрим как это работает.

Инструменты и материалы:
-Ардуино Нано;
-Модуль HC05;
-Зуммер;
-Светодиод диаметром 5 мм;
-Кнопка;
-Тактильная кнопка;
-Пружины диаметром 0,5 мм;
-Медная проволока;
-Винты диаметром 3 мм;
-Нить PLA;
-3D-принтер;
-Паяльник;
-Компьютер;
-Клей;

Шаг первый: идея
Между телефоном и устройством «Не теряй меня» устанавливается соединение по Bluetooth. Телефон постоянно отправляет данные на Arduino. Когда соединение разрывается, это может означать 2 вещи: или пользователь находитесь слишком далеко от телефона или было принудительно прервано соединение (нажата красная кнопку). В обоих случаях результат одинаков. Arduino не получает данные и начинает мигать и свистеть, телефон, который работает в режиме передатчика, обнаруживает, что данные, которые он отправляет, не принимаются, поэтому он воспроизводит сигнал тревоги. Левая блок-схема соответствует коду Arduino, а правая — коду приложения.

Шаг второй: настройка HC05 и код Ардуино
Первое, что нужно сделать, это настроить HC-05. Загрузите код в Arduino Nano с подключенным модулем блютус (см. изображение схемы ниже). Важно, чтобы пока вы загружали код, вы нажимали кнопку на модуле.
Затем войдите в монитор последовательного порта и настройте HC05:
AT + NAME = Don’t Lose Me // Дайте вашему модулю имя
AT + ROLE = 0 // 1 = ведущий / 0 = ведомый
AT + PSWD = 1234 // пароль к вашему модулю
Код для модуля ниже.
arduinobtreset.ino

Затем нужно загрузить код для Ардуино.
arduino.ino

Шаг третий: приложение Android Studio
Для телефона на базе андроида мастер написал специальное приложение. На случай, если пользователи захотят внести какие-либо изменения, он предоставил код с описанием каждого фрагмента.
Если вы хотите запрограммировать его самостоятельно, у вас должно быть установлено фоновое изображение.
Отключить блютус:

 Показать / Скрыть текст<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;"><?xml version="1.0" encoding="utf-8"?><br><shape xmlns:android="http://schemas.android.com/apk/res/android"><br> <stroke<br> android:width="4dp"<br> android:color="#FFF" /><br> <corners android:radius="10dp" /><br><br><br> <solid android:color="#000" /><br></shape>

Включить блютус

 Показать / Скрыть текст<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;"><?xml version="1.0" encoding="utf-8"?><br><shape xmlns:android="http://schemas.android.com/apk/res/android"><br> <stroke<br> android:width="4dp"<br> android:color="#000" /><br> <corners android:radius="10dp" /><br><br><br> <solid android:color="#FFF" /><br></shape>

Подключено

 Показать / Скрыть текст<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;"><?xml version="1.0" encoding="utf-8"?><br><shape xmlns:android="http://schemas.android.com/apk/res/android"><br> <stroke<br> android:width="4dp"<br> android:color="#649D50 " /><br> <corners android:radius="10dp" /><br><br><br> <solid android:color="#18D708" /><br></shape>

Отказано

 Показать / Скрыть текст<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;"><?xml version="1.0" encoding="utf-8"?><br><shape xmlns:android="http://schemas.android.com/apk/res/android"><br> <stroke<br> android:width="4dp"<br> android:color="#9F6C6C" /><br> <corners android:radius="10dp" /><br><br><br> <solid android:color="#EC1313"<br> /><br></shape>

Посмотреть список

 Показать / Скрыть текст<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;"><?xml version="1.0" encoding="utf-8"?><br><shape xmlns:android="http://schemas.android.com/apk/res/android"><br> <stroke<br> android:width="1dp"<br> android:color="#000" /><br> <corners android:radius="10dp" /><br><br> <solid android:color="#FFF" /><br></shape>

Стоп

 Показать / Скрыть текст<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;"><?xml version="1.0" encoding="utf-8"?><br><shape xmlns:android="http://schemas.android.com/apk/res/android"><br> <stroke<br> android:width="5dp"<br> android:color="#C11814" /><br> <corners android:radius="100dp" /><br><br> <padding<br> android:bottom="20dp"<br> android:left="20dp"<br> android:right="20dp"<br> android:top="20dp" /><br><br> <solid android:color="#ECEA0A" /><br></shape>

Приветствие

 Показать / Скрыть текст<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;"><?xml version="1.0" encoding="utf-8"?><br><shape xmlns:android="http://schemas.android.com/apk/res/android"><br> <stroke<br> android:width="4dp"<br> android:color="#58A8A1" /><br> <corners android:radius="10dp" /><br><br><br> <solid android:color="#1180C2"<br> /><br></shape>

Основной часть

 Показать / Скрыть текст<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;"><?xml version="1.0" encoding="utf-8"?><br><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"<br> xmlns:app="http://schemas.android.com/apk/res-auto"<br> xmlns:tools="http://schemas.android.com/tools"<br> android:layout_width="wrap_content"<br> android:layout_height="wrap_content"<br> android:orientation="vertical"<br> tools:context=".MainActivity"<br> android:background="#CC85D5FB"<br> ><br><br> <ListView<br> android:id="@android:id/list"<br> android:layout_width="match_parent"<br> android:layout_height="164dp"<br> android:layout_above="@+id/restart"<br> android:layout_below="@+id/text"<br> android:layout_marginTop="30dp"<br> android:layout_marginBottom="14dp"<br> android:gravity="center"<br> android:layout_margin="10dp"<br> android:background="@drawable/listview"<br> android:divider="@android:color/black"<br> android:dividerHeight="1dp"<br> android:fontFamily="casual"<br> /><br><br> <TextView<br> android:id="@+id/text"<br> android:layout_width="match_parent"<br> android:layout_height="83dp"<br> android:layout_below="@+id/btsituation"<br> android:layout_alignParentEnd="true"<br> android:layout_marginLeft="10dp"<br> android:layout_marginTop="10dp"<br> android:layout_marginRight="10dp"<br> android:layout_marginBottom="20dp"<br> android:background="@drawable/welcome"<br> android:fontFamily="casual"<br> android:gravity="center"<br> android:textColor="#FFF"<br> android:text="WELCOME"<br> android:textSize="50dp"<br> android:textStyle="bold" /><br><br> <Button<br> android:id="@+id/restart"<br> android:layout_width="match_parent"<br> android:layout_height="184dp"<br> android:layout_above="@+id/author"<br> android:layout_marginTop="15dp"<br> android:layout_marginBottom="20dp"<br> android:layout_marginLeft="10dp"<br> android:layout_marginRight="10dp"<br> android:gravity="center"<br> android:text="STOP"<br> android:textSize="100dp"<br> android:fontFamily="casual"<br> android:textStyle="bold"<br> android:textColor="#FD3710"<br> android:background="@drawable/stop"<br> /><br><br> <TextView<br> android:id="@+id/title"<br> android:layout_width="match_parent"<br> android:layout_height="wrap_content"<br> android:layout_marginTop="0dp"<br> android:layout_marginBottom="5dp"<br> android:gravity="center"<br> android:textSize="15dp"<br> android:fontFamily="casual"<br> android:textStyle="bold"<br> android:text="DO NOT LOSE YOUR PHONE"<br> android:background="#FFF"<br> android:alpha="0.5"<br> android:textColor="#0A3988"<br> /><br><br> <TextView<br> android:id="@+id/btsituation"<br> android:layout_width="wrap_content"<br> android:layout_height="65dp"<br> android:layout_below="@+id/title"<br> android:layout_alignParentStart="true"<br> android:layout_alignParentEnd="true"<br> android:layout_marginStart="74dp"<br> android:layout_marginTop="13dp"<br> android:layout_marginEnd="74dp"<br> android:layout_marginBottom="10dp"<br> android:background="@drawable/bt_enable"<br> android:fontFamily="casual"<br> android:gravity="center"<br> android:text="BT ENABLE"<br> android:textColor="#000"<br> android:textSize="35dp"<br> android:textStyle="bold" /><br><br> <TextView<br> android:id="@+id/author"<br> android:layout_width="match_parent"<br> android:layout_height="30dp"<br> android:layout_alignParentBottom="true"<br> android:layout_marginTop="8dp"<br> android:layout_marginBottom="0dp"<br> android:gravity="center"<br> android:fontFamily="casual"<br> android:textStyle="bold"<br> android:text="ANONIMO CON HACHE"<br> android:background="#FFF"<br> android:textColor="#0A3988"<br> android:alpha="0.5"/><br></RelativeLayout>

Код Андроида

 Показать / Скрыть текст<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;"><?xml version="1.0" encoding="utf-8"?><br><manifest xmlns:android="http://schemas.android.com/apk/res/android"<br> package="com.anonimoconhache.dontloseme"><br><uses-permission android:name="android.permission.BLUETOOTH"/><br> <application<br> android:allowBackup="true"<br> android:icon="@mipmap/ic_launcher"<br> android:label="@string/app_name"<br> android:roundIcon="@mipmap/ic_launcher_round"<br> android:supportsRtl="true"<br> android:theme="@style/AppTheme"><br> <activity android:name=".MainActivity"><br> <intent-filter><br> <action android:name="android.intent.action.MAIN" /><br><br> <category android:name="android.intent.category.LAUNCHER" /><br> </intent-filter><br> </activity><br><br> <service android:name=".audio" /><br> </application><br><br></manifest>

Основная часть

 Показать / Скрыть текст <pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Courier New';font-size:9,0pt;">package com.anonimoconhache.dontloseme;<br><br>import android.annotation.SuppressLint;<br>import android.app.AlarmManager;<br>import android.app.ListActivity;<br><br>import android.app.PendingIntent;<br>import android.bluetooth.BluetoothAdapter;<br>import android.bluetooth.BluetoothDevice;<br>import android.bluetooth.BluetoothSocket;<br><br>import android.content.Context;<br>import android.content.Intent;<br>import android.view.View;<br>import android.graphics.Color;<br>import android.media.MediaPlayer;<br>import android.nfc.Tag;<br>import android.os.AsyncTask;<br>import android.os.Bundle;<br><br>import android.util.Log;<br>import android.view.View;<br>import android.widget.ArrayAdapter;<br>import android.widget.Button;<br><br>import android.widget.ListView;<br>import android.widget.Switch;<br>import android.widget.TextView;<br>import android.widget.Toast;<br><br>import androidx.annotation.NonNull;<br>import androidx.annotation.Nullable;<br><br>import java.io.IOException;<br>import java.io.OutputStream;<br>import java.util.ArrayList;<br><br>import java.util.Set;<br>import java.util.UUID;<br><br>public class MainActivity extends ListActivity{<br> private ArrayAdapter<String> mArrayAdapter;<br> private BluetoothAdapter mBluetoothAdapter;<br> private BluetoothSocket btSocket;<br> private ArrayList<BluetoothDevice> btDeviceArray = new ArrayList<BluetoothDevice>();<br> private ConnectAsyncTask connectAsyncTask;<br> private BluetoothAdapter mBTAdapter;<br> private Context thiscontext=this;<br> private MediaPlayer mediaPlayer;<br> private Button restar;<br><br> static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");<br><br> TextView text, btsituation, title;<br> Intent HabilitarBT;<br> int requestCodeBT;<br> int stop; // variable<br> int music;// variable<br> int musicon;<br><br> @Override<br> protected void onActivityResult(int requestCode, int resultCode, Intent data) { // IF : PEDIR PERMISO DE BT<br> if(requestCode==requestCodeBT){<br> if(resultCode==RESULT_OK){ //SI SE ACEPTA BT<br> Toast.makeText(thiscontext, "BT habilitado", Toast.LENGTH_SHORT).show();<br> reset();<br> }<br> else{ // SI NO SE ACEPTA BT<br> Toast.makeText(this, "Habilita bluetooth para abrir la app", Toast.LENGTH_SHORT).show();<br> finish();<br> }<br> }<br> }<br><br> @Override<br> protected void onCreate(final Bundle savedInstanceState) {<br> super.onCreate(savedInstanceState);<br> setContentView(R.layout.activity_main);<br><br> mBTAdapter = BluetoothAdapter.getDefaultAdapter();<br> mArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);<br> setListAdapter(mArrayAdapter);<br> connectAsyncTask = new ConnectAsyncTask();<br> mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();<br> requestCodeBT=1;<br> music=0;<br> stop=0;<br> musicon=0;<br><br> text = (TextView)findViewById(R.id.text);<br> restar = (Button)findViewById(R.id.restart);<br> btsituation= (TextView) findViewById(R.id.btsituation);<br> title=(TextView)findViewById(R.id.title);<br><br> bluetoothrequest();<br> play();<br><br> sto();<br><br> Set<BluetoothDevice> pariedDevices = mBluetoothAdapter.getBondedDevices();<br> if (pariedDevices.size() > 0) { // SI SE ENCUENTRAN DISPOSITIVOS BT<br> for (BluetoothDevice device : pariedDevices) {<br> mArrayAdapter.add(device.getName() + "n" + device.getAddress());<br> btDeviceArray.add(device);<br> }<br> }<br> }<br> private void sto() { // SI SE PULSA STOP<br> restar.setOnClickListener(new View.OnClickListener() { //SI PULSO STOP<br> @Override<br> public void onClick(View view) { //SI PULSAN STOP<br> if(stop==1) {<br> mediaPlayer.stop();<br> finish();<br> startActivity(getIntent());<br> }<br> else if (stop==0){<br> Toast.makeText(thiscontext, "No music on", Toast.LENGTH_SHORT).show();<br><br> }<br> }<br> });<br> }<br><br> public void stomusic(){<br> mediaPlayer.stop();<br> }<br><br> private void bluetoothrequest() {<br> if (mBluetoothAdapter == null) { //SI NO HAY ADAPTADOR BT<br> Toast.makeText(this, "Tu dispositivo no acepta bluetooth", Toast.LENGTH_SHORT).show();<br> btsituation.setText("Tu dispositivo no acepta bluetooth");<br> btsituation.setTextColor(Color.RED);<br> finish();<br> } else {<br> if (!mBluetoothAdapter.isEnabled()) { //SI NO ESTA BT HABILITADO<br> HabilitarBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);<br> startActivityForResult(HabilitarBT, requestCodeBT);<br> btsituation.setText("BT DISABLE");<br> btsituation.setTextColor(Color.BLACK);<br> btsituation.setBackgroundResource(R.drawable.bt_enable);<br> } else { // SI SE ACEPTA<br> btsituation.setText("BT ENABLE");<br> btsituation.setTextColor(Color.WHITE);<br> btsituation.setBackgroundResource(R.drawable.bt_disable);<br> }<br> }<br> }<br><br> @Override<br> protected void onListItemClick(ListView l, View v, int position, long id) { // SI SE CLICA EN ALGUN ELEMENTO DE LA LISTA<br> if(music==0){<br> if(mBluetoothAdapter.isEnabled()){ //SI ESTÁ ACTIVADO BT<br> BluetoothDevice device = btDeviceArray.get(position);<br> connectAsyncTask.execute(device);<br> }<br> else {<br> bluetoothrequest();<br> }<br> }<br> else if(music==1){ // SI NO ESTÁ ACTIVADO BT<br> Toast.makeText(this, "Pulsa STOP", Toast.LENGTH_SHORT).show();<br> }<br> }<br><br> private class ConnectAsyncTask extends AsyncTask<BluetoothDevice, Integer, BluetoothSocket>{ // CONECTARSE BT<br> private BluetoothSocket mmSocket;<br> private BluetoothDevice mmDevice;<br> @SuppressLint("WrongThread")<br> @Override<br> protected BluetoothSocket doInBackground(BluetoothDevice… device) {<br> mmDevice = device[0];<br> try {<br> String mmUUID = "00001101-0000-1000-8000-00805F9B34FB";<br> mmSocket = mmDevice.createInsecureRfcommSocketToServiceRecord(UUID.fromString(mmUUID));<br> try {<br> mmSocket.connect();<br> text.setText("CONECTED");<br> text.setTextColor(Color.parseColor("#FFFFFF"));<br> text.setBackgroundResource(R.drawable.conected);<br> stomusic();<br> }<br> catch (Exception e){ }<br> }<br> catch (Exception e) {}<br> return mmSocket;<br> }<br><br> @Override<br> protected void onPostExecute(BluetoothSocket result) {<br> btSocket = result;<br> OutputStream mmOutStream = null;<br> try {<br> if (btSocket.isConnected()) { //MIENTRAS ESTE CONECTADO A ALGUN DISPOSITIVO BT<br> while (btSocket.isConnected()) {<br> mmOutStream = btSocket.getOutputStream();<br> mmOutStream.write(new String("1").getBytes()); //MANDAR DATO<br> music();<br> }<br> }<br> }<br> catch (IOException e) { // CUANDO NO ESTE CONECTADO A UN DISPOSITIVO BT<br> Toast.makeText(getBaseContext(), "Do not lose me", Toast.LENGTH_LONG).show();<br> text.setText("DISCONECTED");<br> text.setTextColor(Color.parseColor("#FFFFFF"));<br> text.setBackgroundResource(R.drawable.disconected);<br> play();<br><br> }<br> }<br> }<br><br> private void reset() {<br> stomusic();<br> finish();<br> startActivity(getIntent());<br><br> }<br> public void play(){ // SONIDO EN LOOP<br> mediaPlayer= MediaPlayer.create(this, R.raw.song);<br> mediaPlayer.setLooping(true);<br> mediaPlayer.start();<br> }<br> public void musicasonando(){<br> musicon=1;<br><br> }<br>public void music(){<br> music=1;<br> stop=1;<br><br>}<br>}<br>
Don’t Lose Me app.apk

Шаг четвертый: мелодия
Для установки музыки нужно аудиофайлы в формате mp3 поместить в папку, как на фото. Ниже можно скачать звук будильника.
alarm.mp3

Шаг пятый: 3D-печать
Первый корпус, напечатанный мастером, был не совсем удачным. Корпус состоял из двух частей и батарейный отсек постоянно отваливался.

Тогда мастер разработал новый корпус. Скачать файл для печати можно ниже.
stl.rar

Шаг шестой: сборка
Теперь нужно все собрать и смонтировать согласно схемы.

Сборку он производит навесным монтажом ,используя сам корпус в качестве основы или платы.

Все готово. Конечно, устройство получилось немного громоздким, но это означает только, что есть куда развиваться. Например, можно спроектировать устройство с использованием SMD-компонентов.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Кнопка «Наверх»

Яндекс.Метрика
Закрыть
Закрыть