5 приложений для управления и настройки кнопок гарнитуры в Android

5 приложений для управления и настройки кнопок гарнитуры в Android Конструкторы

Основная активность, сопряжение arduino и android

Наследуем класс от AppCompatActivity и объявляем переменные:

public class MainActivity extends AppCompatActivity {
        private BluetoothAdapter bluetoothAdapter;
        private ListView listView;
        private ArrayList<String> pairedDeviceArrayList;
        private ArrayAdapter<String> pairedDeviceAdapter;
        public static BluetoothSocket clientSocket;
        private Button buttonStartControl;
}

Метод onCreate() опишу построчно:

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState); //обязательная строчка
     //прикрепляем ранее созданную разметку
     setContentView(R.layout.activity_main); 
     //цепляем кнопку из разметки          
     Button buttonStartFind = (Button) findViewById(R.id.button_start_find); 
     //цепляем layout, в котором будут отображаться найденные устройства
     listView = (ListView) findViewById(R.id.list_device); 
      
     //устанавливаем действие на клик                                                                           
     buttonStartFind.setOnClickListener(new View.OnClickListener() { 
                                                                                                    
         @Override
         public void onClick(View v) {
             //если разрешения получены (функция ниже)
             if(permissionGranted()) { 
               //адаптер для управления блютузом
                bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
                if(bluetoothEnabled()) { //если блютуз включен (функция ниже)
                    findArduino(); //начать поиск устройства (функция ниже)
                  }
              }
         }
    });

     //цепляем кнопку для перехода к управлению
     buttonStartControl = (Button) findViewById(R.id.button_start_control); 
     buttonStartControl.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
                //объект для запуска новых активностей
                Intent intent = new Intent(); 
                //связываем с активностью управления
                intent.setClass(getApplicationContext(), ActivityControl.class);
                //закрыть эту активность, открыть экран управления
                startActivity(intent); 
         }
     });

 }

Нижеприведенные функции проверяют, получено ли разрешение на использование блютуза (без разрешение пользователя мы не сможем передавать данные) и включен ли блютуз:

🎄 3. что означают индикаторы и какие бывают?

Индикатор должен быть на наушниках. А чаще всего их несколько. У всех моделей логика, цвета и количество индикаторов разное. Можно выделить основные моменты:

  • Индикатор питания. Это тот, что загорается при включении. Иногда он продолжает гореть, иногда тухнет через пару секунд. Меняет цвет, когда наушники ставятся на зарядку. Либо начинает мигать. По цветам обычно: красный – пора заряжать или идёт зарядка, зелёный – заряда достаточно и окончание зарядки. Их бывает несколько, например, 4 штуки, каждый «отвечает» за 25% заряда батареи.
  • Индикатор соединения. Бывает совмещён с первым. Обычно синего или белого цвета. Наушники мигают – это, чаще всего, про этот индикатор. Мигает он тогда, когда наушники переведены в режим сопряжения, но не подключены к источнику. Когда подключены – либо горит ровно, либо тухнет.

⚙️ 4. управление наушниками и приложения

Схема управления наушниками очень сильно отличается от модели к модели. Оно может быть сенсорным, может быть и кнопочным. Иногда бывают переключатели и колёсики (для громкости, в основном). У дорогих моделей есть и умные функции, типа паузы при снятии наушников.

  • Для управления воспроизведением обычно выделено три кнопки. Стартпауза (она же может быть кнопкой питания) и кнопки управления громкостью. Переключение треков – либо двойноетройное нажатие на стартпаузу, либо удержание кнопок громкости.
  • На дополнительные функции обычно выделены отдельные кнопки. Например, управление шумоподавлением: включеновыключено – одна кнопка, а переключение режимов – другая. Либо та же.
  • Сенсорное управление. Обычно имеется одна или две сенсорных панели. Одно или два (это лучше, меньше ложных срабатываний) нажатия – стартпауза. Двойноетройное касание – следующийпредыдущий трек. Удержание – изменение громкости (на правом громче, на левом – тише, например). Либо могут быть жесты: свайп вперёдназад – переключение треков, вверхвниз – громкость.
  • Фирменные приложения для наушников. У многих моделей от крупных производителей такие есть. В них обычно можно найти дополнительные настройки, возможность кастомизировать управление и не только.

Конечно, более подробно по своей модели лучше посмотреть в мануале. Кроме того, у многих TWS наушников, например, нет управления громкостью или нельзя перейти на предыдущий трек. А у Huawei FreeBuds Pro, например, управление построено не на касаниях, а на «сжатиях» сенсора. Вслед за AirPods Pro.

Контроллер кнопки гарнитуры

Контроллер кнопки гарнитуры – это простое и удобное в использовании приложение, которое предоставляет множество вариантов настройки кнопок гарнитуры и хорошо работает с одной или тремя кнопками гарнитуры. Приложение может работать в фоновом режиме, не потребляя много циклов ЦП.

Вы можете настроить определенные приложения для запуска этого приложения для управления мультимедиа с помощью кнопок гарнитуры. Вы можете создавать собственные профили или использовать конфигурацию по умолчанию, управлять музыкальными приложениями, настраивать функции вызовов, изменять поведение подключаемых модулей гарнитуры, устанавливать ограничение на громкость звука, запускать приложения, использовать голосовые команды и многое другое. просто нажмите и удерживайте комбинации кнопок.

Разработчик: Кристоф Кобер

Доступность: пробная и платная в Google Play

Определите события-функции обратного вызова

Второй шаг – это определение нашего интерфейса, который будет содержать события, соответствующие действиям, которые мы определили в первом шаге. Итак, давайте продолжим и определим IBluetoothSDKListener как:

interface IBluetoothSDKListener {
    /**
     * from action BluetoothUtils.ACTION_DISCOVERY_STARTED
     */
    fun onDiscoveryStarted()

    /**
     * from action BluetoothUtils.ACTION_DISCOVERY_STOPPED
     */
    fun onDiscoveryStopped()

    /**
     * from action BluetoothUtils.ACTION_DEVICE_FOUND
     */
    fun onDeviceDiscovered(device: BluetoothDevice?)

    /**
     * from action BluetoothUtils.ACTION_DEVICE_CONNECTED
     */
    fun onDeviceConnected(device: BluetoothDevice?)

    /**
     * from action BluetoothUtils.ACTION_MESSAGE_RECEIVED
     */
    fun onMessageReceived(device: BluetoothDevice?, message: String?)

    /**
     * from action BluetoothUtils.ACTION_MESSAGE_SENT
     */
    fun onMessageSent(device: BluetoothDevice?)

    /**
     * from action BluetoothUtils.ACTION_CONNECTION_ERROR
     */
    fun onError(message: String?)

    /**
     * from action BluetoothUtils.ACTION_DEVICE_DISCONNECTED
     */
    fun onDeviceDisconnected()
}

Этот интерфейс будет позже реализован в нашей активности, или фрагменте, который будет выполнять некоторые действия при появлении события. Например, когда устройство подключается, срабатывает функция onDeviceDiscovered, и затем вы можете перейти к выполнению определенных операций, например, как мы увидим в следующих шагах, отправить сообщение по bluetooth на только что подключенное устройство через наш BluetoothSDKService.

Определение BroadcastReceiver

Следующим шагом будет определение нашего BroadcastReceiver, задачей которого будет фильтрация намерений с нашими действиями, определенными до получения LocalBroadcastManager, для запуска функций обратного вызова, определенных в предыдущем разделе. Поэтому мы используем BluetoothSDKListenerHelper как:

class BluetoothSDKListenerHelper {
    companion object {

        private var mBluetoothSDKBroadcastReceiver: BluetoothSDKBroadcastReceiver? = null

        class BluetoothSDKBroadcastReceiver : BroadcastReceiver() {
            private var mGlobalListener: IBluetoothSDKListener? = null

            public fun setBluetoothSDKListener(listener: IBluetoothSDKListener) {
                mGlobalListener = listener
            }

            public fun removeBluetoothSDKListener(listener: IBluetoothSDKListener): Boolean {
                if (mGlobalListener == listener) {
                    mGlobalListener = null
                }

                return mGlobalListener == null
            }

            override fun onReceive(context: Context?, intent: Intent?) {
                val device =
                    intent!!.getParcelableExtra<BluetoothDevice>(BluetoothUtils.EXTRA_DEVICE)
                val message = intent.getStringExtra(BluetoothUtils.EXTRA_MESSAGE)

                when (intent.action) {
                    BluetoothUtils.ACTION_DEVICE_FOUND -> {
                        mGlobalListener!!.onDeviceDiscovered(device)
                    }
                    BluetoothUtils.ACTION_DISCOVERY_STARTED -> {
                        mGlobalListener!!.onDiscoveryStarted()
                    }
                    BluetoothUtils.ACTION_DISCOVERY_STOPPED -> {
                        mGlobalListener!!.onDiscoveryStopped()
                    }
                    BluetoothUtils.ACTION_DEVICE_CONNECTED -> {
                        mGlobalListener!!.onDeviceConnected(device)
                    }
                    BluetoothUtils.ACTION_MESSAGE_RECEIVED -> {
                        mGlobalListener!!.onMessageReceived(device, message)
                    }
                    BluetoothUtils.ACTION_MESSAGE_SENT -> {
                        mGlobalListener!!.onMessageSent(device)
                    }
                    BluetoothUtils.ACTION_CONNECTION_ERROR -> {
                        mGlobalListener!!.onError(message)
                    }
                    BluetoothUtils.ACTION_DEVICE_DISCONNECTED -> {
                        mGlobalListener!!.onDeviceDisconnected()
                    }
                }
            }
        }

        public fun registerBluetoothSDKListener(
            context: Context?,
            listener: IBluetoothSDKListener
        ) {
            if (mBluetoothSDKBroadcastReceiver == null) {
                mBluetoothSDKBroadcastReceiver = BluetoothSDKBroadcastReceiver()

                val intentFilter = IntentFilter().also {
                    it.addAction(BluetoothUtils.ACTION_DEVICE_FOUND)
                    it.addAction(BluetoothUtils.ACTION_DISCOVERY_STARTED)
                    it.addAction(BluetoothUtils.ACTION_DISCOVERY_STOPPED)
                    it.addAction(BluetoothUtils.ACTION_DEVICE_CONNECTED)
                    it.addAction(BluetoothUtils.ACTION_MESSAGE_RECEIVED)
                    it.addAction(BluetoothUtils.ACTION_MESSAGE_SENT)
                    it.addAction(BluetoothUtils.ACTION_CONNECTION_ERROR)
                    it.addAction(BluetoothUtils.ACTION_DEVICE_DISCONNECTED)
                }


                LocalBroadcastManager.getInstance(context!!).registerReceiver(
                    mBluetoothSDKBroadcastReceiver!!, intentFilter
                )
            }

            mBluetoothSDKBroadcastReceiver!!.setBluetoothSDKListener(listener)
        }

        public fun unregisterBluetoothSDKListener(
            context: Context?,
            listener: IBluetoothSDKListener
        ) {

            if (mBluetoothSDKBroadcastReceiver != null) {
                val empty = mBluetoothSDKBroadcastReceiver!!.removeBluetoothSDKListener(listener)


                if (empty) {
                    LocalBroadcastManager.getInstance(context!!)
                        .unregisterReceiver(mBluetoothSDKBroadcastReceiver!!)
                    mBluetoothSDKBroadcastReceiver = null
                }
            }
        }
    }
}

В действии или фрагменте мы реализуем наш IBluetoothSDKListener, который мы зарегистрируем через две функции registerBluetoothSDKListner() и unregisterBluetoothSDKListner(). Например:

Смотрите про коптеры:  Трасса с радиоуправляемыми машинами серии Mini-Z (Вариант ОПТИМАЛЬНЫЙ) • Идеи для корпоратива, организация мероприятий и тимбилдингов. Аренда аттракционов

Гарнитура Droid

Headset Droid – еще одно приложение контроллера, которое настраивает способ использования кнопок на вашей гарнитуре. Приложение может работать в фоновом режиме, потребляя минимальную мощность. Вы можете настроить комбинации щелчков, действия кнопок для управления музыкой, например, управление громкостью, ускоренная перемотка вперед, пропуск, следующая песня, предыдущая песня, запуск приложения, скажем, время, вы можете ограничить уровни громкости, управлять громкостью вверх и вниз и другие функции телефона, такие как вызов повторный набор, удержание, ответ или отклонение вызовов.

Разработчик: ТВК Девелопмент

Доступность: пробная и платная в Google Play

СМОТРИ ТАКЖЕ: 5 музыкальных плееров в Android с iPhone Style CoverFlow

Определите сервис Bluetooth

А теперь самая сложная часть – Bluetooth Service. Мы собираемся определить класс, расширяющий Service, в котором мы определим функции, позволяющие привязывать Service и управлять потоками Bluetooth-соединения:

class BluetoothSDKService : Service() {

    // Service Binder
    private val binder = LocalBinder()

    // Bluetooth stuff
    private lateinit var bluetoothAdapter: BluetoothAdapter
    private lateinit var pairedDevices: MutableSet<BluetoothDevice>
    private var connectedDevice: BluetoothDevice? = null
    private val MY_UUID = "..."
    private val RESULT_INTENT = 15

    // Bluetooth connections
    private var connectThread: ConnectThread? = null
    private var connectedThread: ConnectedThread? = null
    private var mAcceptThread: AcceptThread? = null

    // Invoked only first time
    override fun onCreate() {
        super.onCreate()
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
    }

    // Invoked every service star
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return START_STICKY
    }

    /**
     * Class used for the client Binder.
     */
    inner class LocalBinder : Binder() {
        /*
        Function that can be called from Activity or Fragment
        */
    }


    /**
     * Broadcast Receiver for catching ACTION_FOUND aka new device discovered
     */
    private val discoveryBroadcastReceiver = object : BroadcastReceiver() {

        override fun onReceive(context: Context, intent: Intent) {
            /*
              Our broadcast receiver for manage Bluetooth actions
            */
        }
    }

    private inner class AcceptThread : Thread() {
      // Body
    }

    private inner class ConnectThread(device: BluetoothDevice) : Thread() {
      // Body
    }

    @Synchronized
    private fun startConnectedThread(
        bluetoothSocket: BluetoothSocket?,
    ) {
        connectedThread = ConnectedThread(bluetoothSocket!!)
        connectedThread!!.start()
    }

    private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {
      // Body
    }


    override fun onDestroy() {
        super.onDestroy()
        try {
            unregisterReceiver(discoveryBroadcastReceiver)
        } catch (e: Exception) {
            // already unregistered
        }
    }

    override fun onBind(intent: Intent?): IBinder? {
        return binder
    }

    private fun pushBroadcastMessage(action: String, device: BluetoothDevice?, message: String?) {
        val intent = Intent(action)
        if (device != null) {
            intent.putExtra(BluetoothUtils.EXTRA_DEVICE, device)
        }
        if (message != null) {
            intent.putExtra(BluetoothUtils.EXTRA_MESSAGE, message)
        }
        LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)
    }

}

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

Как вы видите, в LocalBinder можно определить функции, которые будут видны действиям после привязки к ним. Например, мы можем определить функции для операций обнаружения, отправки сообщения или соединения, которые затем будут выполняться операции внутри сервиса.


    /**
     * Class used for the client Binder.
     */
    inner class LocalBinder : Binder() {
         /**
         * Enable the discovery, registering a broadcastreceiver {@link discoveryBroadcastReceiver}
         * The discovery filter by LABELER_SERVER_TOKEN_NAME
         */
        public fun startDiscovery(context: Context) {
            val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
            filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED)
            registerReceiver(discoveryBroadcastReceiver, filter)
            bluetoothAdapter.startDiscovery()
            pushBroadcastMessage(BluetoothUtils.ACTION_DISCOVERY_STARTED, null, null)
        }
        
        
        /**
         * stop discovery
         */
        public fun stopDiscovery() {
            bluetoothAdapter.cancelDiscovery()
            pushBroadcastMessage(BluetoothUtils.ACTION_DISCOVERY_STOPPED, null, null)
        }
        
        // other stuff

    }

Затем в потоках, управляющих сокетами, вы можете использовать функцию pushBroadcastMessage() для генерации событий и добавления информационного наполнения, такого как удаленное устройство и сообщение. Например:

private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {

        private val mmInStream: InputStream = mmSocket.inputStream
        private val mmOutStream: OutputStream = mmSocket.outputStream
        private val mmBuffer: ByteArray = ByteArray(1024) // mmBuffer store for the stream

        override fun run() {
            var numBytes: Int // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs.
            while (true) {
                // Read from the InputStream.
                numBytes = try {
                    mmInStream.read(mmBuffer)
                } catch (e: IOException) {
                    pushBroadcastMessage(
                        BluetoothUtils.ACTION_CONNECTION_ERROR,
                        null,
                        "Input stream was disconnected"
                    )
                    break
                }

                val message = String(mmBuffer, 0, numBytes)

                // Send to broadcast the message
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_MESSAGE_RECEIVED,
                    mmSocket.remoteDevice,
                    message
                )
            }
        }

        // Call this from the main activity to send data to the remote device.
        fun write(bytes: ByteArray) {
            try {
                mmOutStream.write(bytes)

                // Send to broadcast the message
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_MESSAGE_SENT,
                    mmSocket.remoteDevice,
                    null
                )
            } catch (e: IOException) {
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_CONNECTION_ERROR,
                    null,
                    "Error occurred when sending data"
                )
                return
            }
        }

        // Call this method from the main activity to shut down the connection.
        fun cancel() {
            try {
                mmSocket.close()
            } catch (e: IOException) {
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_CONNECTION_ERROR,
                    null,
                    "Could not close the connect socket"
                )
            }
        }
    }

Мы закончили!

Podroid

Podroid — это приложение разработанно Кенву Ли. У него есть уникальная особенность — способность подстраивать интерфейс под себя. Podroid обеспечит вас функцией остановки воспроизведения при вытаскивании AirPods из ушей. Однако вместе с тем разработчик предупреждает, что это повлечёт за собой высокое потребление заряда батареи. Установка большей задержки может увеличить срок жизни наушников.

Podroid показывает уровень заряда батареи Airpod через уведомления и строке состояния. Заметьте, что для нормальной работы Podroid требует разрешения на доступ к уведомлениям. Это позволит приложению читать все уведомления, приходящие на ваш телефон.

Как и Assistant Trigger, Podroid позволяет настраивать касания на усмотрение пользователя. При двойном нажатии на иконку шестерёнки вы перейдете в настройки, в которых сможете все настроить под себя.

Используйте свой android как bluetooth-геймпад для другого – my road

Пару недель назад мы рассмотрели Tablet Remote — приложение для Android, которое позволяет пользователям удаленно управлять одним устройством Android другим через Bluetooth. Теперь, хотя указанное приложение можно использовать, например, для удаленного управления воспроизведением мультимедиа на другом телефоне или планшете Android, подключенном к вашему телевизору через HDMI, Контроллер BT позволяет точно так же играть в игры-эмуляторы. Приложение превращает ваше Android-устройство в Bluetooth-геймпад, позволяя удаленно управлять играми-эмуляторами, запущенными на другом устройстве (хосте). Как и Tablet Remote, контроллер BT также должен быть установлен и запущен на обоих устройствах — хосте и контроллере — которые сопряжены друг с другом через Bluetooth. На данный момент приложение работает только с несколькими игровыми эмуляторами и поддерживает управление одним устройством Android с другим только через соединение Bluetooth.

BT Controller можно использовать для управления различными эмуляторами для игр Mame, Playstation, CPS2 и N64. Список всех поддерживаемых эмуляторов можно найти на странице приложения в Android Market (ссылка в конце).

Вот все шаги настройки, которые необходимо выполнить, чтобы настроить приложение на контроллере и хост-устройствах.

  • Как упоминалось ранее, сначала необходимо убедиться, что BT Controller установлен и работает на обоих устройствах.

BT-контроллер-Android-Home

  • При появлении запроса активируйте Bluetooth на обоих устройствах.
  • Сделайте Bluetooth обнаруживаемым на ваших устройствах из приложения, нажав на Видимый кнопка.
  • Затем коснитесь Соединять и выберите устройство, с которым вы хотите выполнить сопряжение.
  • В появившемся запросе выберите, хотите ли вы установить устройство в качестве Контроллер или Хозяин.

BT-контроллер-Android-подключение-выбор

  • Предполагая, что вы выбрали одно устройство в качестве контроллера, другому автоматически назначается роль хоста.
  • В то время как экран устройства-контроллера автоматически превращается в виртуальный геймпад, на экране хост-устройства отображается небольшое окно предварительного просмотра в правом верхнем углу экрана. Нажав на это окно, вы попадете в Язык и настройки ввода. Убедитесь, что вы выбрали и включили BTController в качестве метода ввода по умолчанию на главном устройстве. Как только это будет сделано, в вышеупомянутом окне предварительного просмотра должна отображаться любая клавиша, нажатая на устройстве контроллера.
Смотрите про коптеры:  Купить влагозащищенную радиоуправляемую машину | Водонепроницаемые машинки для грязи
5 приложений для управления и настройки кнопок гарнитуры в Android
Устройство Контроллера
  • Вам необходимо вручную сопоставить все клавиши на геймпаде контроллера устройства с элементами управления на эмуляторе, запущенном на главном устройстве.
  • После того, как вы закончите с настройкой ключей, загрузите игровое ПЗУ в эмулятор, чтобы начать использовать свой контроллер для игры.
BT-контроллер-Android-хост
Хост-устройство

Экран настроек приложения (Меню> Настройки) позволяет включать / отключать вибрацию (тактильную / тактильную обратную связь) при нажатии клавиш на геймпаде.

Мы успешно протестировали приложение с HTC Desire в качестве контроллера и HTC Desire HD с N64oid в качестве хост-устройства.

В Android Market доступно несколько вариантов BT Controller. Один бесплатный, но содержит рекламу, а другой — без рекламы и стоит немногим более 1 доллара.

Скачать BT Controller Ad с поддержкой для Android (Бесплатно)

Скачать BT Controller Ad Free для Android (Оплаченный)

Какие правила безопасности важно соблюдать?

Эксплуатация беспроводных наушников дается намного легче, чем в случае с проводными, но и тут стоит придерживаться нескольких правил:

  • если наушники используются в общественных местах и на улице — стоит выбирать модели с неполным шумоподавлением, чтобы слышать, что происходит вокруг. В случае с применением вакуумных устройств, которые обеспечивают высокую звукоизоляцию, рекомендуется прослушивать аудио на неполной громкости;
  • наушники, как и смартфон, желательно регулярно обрабатывать антисептиком;
  • во время прослушивания под дождем и снегопадом девайс стоит прятать под головным убором для того, чтобы избежать попадания влаги;
  • как правило, при низких температурах воздуха батарея гарнитуры садится быстрее, поэтому зимой перед выходом на улицу стоит позаботиться о полном заряде;
  • чтобы беспроводное устройство не выпало из ушей в самый неподходящий момент, рекомендуется правильно подбирать по размеру индивидуальные силиконовые накладки.

Как заряжать беспроводные наушники

Если наушники работают от батареек, севшие элементы питания нужно просто заменить. Но большинство моделей требуют зарядки аккумулятора. Есть три основных способа, как заражать беспроводные наушники.

  • Зарядка осуществляется через кабель. Чаще всего беспроводные наушники заряжаются с помощью кабеля с разъёмом мини-USB, USB Type-C, E-type и так далее, которые поставляются в комплекте.
  • Наушники заряжаются через кейс. Сам процесс зарядки происходит аналогично первому способу, только заряжаешь ты не сами наушники напрямую, а чехол от них. Когда индикатор на корпусе чехла погаснет или изменит цвет, это означает, что гаджет полностью заряжен. О видах сигналов, которые подаёт световой индикатор, вы можете прочесть в руководстве по эксплуатации устройства. Технология заряда от специального футляра с аккумулятором используется в наушниках AirPods от компании Apple и их аналогах. 
  • С помощью беспроводного зарядного устройства. Процесс зарядки тоже может быть беспроводным! Сегодня в продаже можно найти зарядные устройства, которые не нужно подключать к сети. Такие аксессуары помогают заряжать не только наушники, но у другие гаджеты.

Метод loop() и дополнительные функции


В постоянно повторяющемся методе loop() происходит считывание данных. Сначала рассмотрим основной алгоритм, а потом функции, задействованные в нем.


void loop() {
  //если хоть несчитанные байты
  if(BTSerial.available() > 0) {
     //считываем последний несчитанный байт
     char a = BTSerial.read();
     
    if (a == '@') {
      //если он равен @ (случайно выбранный мною символ)
      //обнуляем переменную val
      val = "";
      //указываем, что сейчас считаем скорость
      readSpeed = true;

    } else if (readSpeed) {
      //если пора считывать скорость и байт не равен решетке
      //добавляем байт к val
      if(a == '#') {
        //если байт равен решетке, данные о скорости кончились
        //выводим в монитор порта для отладки
        Serial.println(val);
        //указываем, что скорость больше не считываем
        readSpeed = false;
        //передаем полученную скорость в функцию езды 
        go(val.toInt());
        //обнуляем val
        val = "";
        //выходим из цикла, чтобы считать следующий байт
        return;
      }
      val =a;
    } else if (a == '*') {
      //начинаем считывать угол поворота
      readAngle = true; 
    } else if (readAngle) {
      //если решетка, то заканчиваем считывать угол
      //пока не решетка, добавляем значение к val
      if(a == '#') {
       Serial.println(val);
       Serial.println("-----");
        readAngle = false;
        //передаем значение в функцию поворота
        turn(val.toInt());
        val= "";
        return;
      }
      val =a;
    }
    //получаем время последнего приема данных
    lastTakeInformation = millis();
  } else {
     //если несчитанных байтов нет, и их не было больше 150 миллисекунд 
     //глушим двигатели
     if(millis() - lastTakeInformation > 150) {
     lastTakeInformation = 0;
     analogWrite(angleSpeed, 0);
     analogWrite(speedRight, 0);
     analogWrite(speedLeft, 0);
     }
     
  }
}

Получаем результат: с телефона отправляем байты в стиле “@скорость#угол#” (например, типичная команда “@200#60#”. Данный цикл повторяется каждый 100 миллисекунд, так как на андроиде мы установили именно этот промежуток отправки команд. Короче делать нет смысла, так как они начнут становится в очередь, а если сделать длиннее, то колеса начнут двигаться рывками.

Все задержки через команду delay(), которые вы увидите далее, подобраны не через физико-математические вычисления, а опытным путем. Благодаря всем выставленным задрежам, машинка едет плавно, и у всех команд есть время на отработку (токи успевают пробежаться).

В цикле используются две побочные функции, они принимают полученные данные и заставляют машинку ехать и крутится.

void go(int mySpeed) {
  //если скорость больше 0
  if(mySpeed > 0) {
  //едем вперед
  digitalWrite(dirRight, HIGH);
  analogWrite(speedRight, mySpeed);
  digitalWrite(dirLeft, HIGH);
  analogWrite(speedLeft, mySpeed);
  } else {
    //а если меньше 0, то назад
    digitalWrite(dirRight, LOW);
    analogWrite(speedRight, abs(mySpeed)   30);
    digitalWrite(dirLeft, LOW);
     analogWrite(speedLeft, abs(mySpeed)   30);
  }
  delay(10);
 
}

void turn(int angle) {
  //подаем ток на плюс определителя угла
  digitalWrite(pinAngleStop, HIGH);
  //даем задержку, чтобы ток успел установиться
  delay(5);
  
  //если угол 150 и больше, поворачиваем вправо 
  //если 30 и меньше, то влево 
  //промежуток от 31 до 149 оставляем для движения прямо
  if(angle > 149) {
        //если замкнут белый, но разомкнуты  черный и красный
        //значит достигнуто крайнее положение, дальше крутить нельзя
        //выходим из функции через return 
        if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinRed) == LOW) {
          return;
        }
        //если проверка на максимальный угол пройдена
        //крутим колеса
        digitalWrite(angleDirection, HIGH);
        analogWrite(angleSpeed, speedTurn);
  } else if (angle < 31) { 
        if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) {
          return;
        }
        digitalWrite(angleDirection, LOW);
        analogWrite(angleSpeed, speedTurn);
  }
  //убираем питание 
  digitalWrite(pinAngleStop, LOW);
  delay(5);
}

Поворачивать, когда андроид отправляет данные о том, что пользователь зажал угол 60, 90, 120, не стоит, иначе не сможете ехать прямо. Да, возможно сразу не стоило отправлять с андроида команду на поворот, если угол слишком мал, но это как-то коряво на мой взгляд.

Мышь и ввод

Первым в меню находится пункт «Basic Input». Зайдя в него, можно выполнять следующие функции.

  1. Использовать дисплей смартфона в качестве тачпада.

    Тачпад

  2. Вызвать стандартную клавиатуру Android для текстового ввода на ПК.

    Режим Touch Pad

    Клавиатура

Набор текста

Голосовой набор с Bluetooth на Android включается автоматически вместе с «голосовыми командами через Bluetooth», но для уверенности можете проверить это через меню настроек.

  1. Перейдите в «Настройки».

    Настройки

  2. Выберите «Язык и клавиатура».

    Язык и клавиатура

  3. Убедитесь, что стоит галочка напротив «Голосовой ввод». Нажмите на иконку -шестеренку.
  4. Должен быть активирован последний пункт в списке.

    Гарнитура Bluetooth

Для активации ввода по голосу при наборе текста над клавиатурой тапните по пиктограмме в виде микрофона.

После того как появится новое всплывающее окно, начинайте произносить команду.

Смотрите про коптеры:  Из чего состоит квадрокоптер? Устройство дрона: обзор для новичков

Наушники с nfc-чипом

Этот вид Bluetooth-гарнитуры отличается от ранее приведенных примеров, так как позволяет подключаться значительно быстрее, используя встроенный NFC-чип. Единственным условием для работы подобных наушников выступает наличие соответствующего чипа не только в гарнитуре, но и на Android-устройстве.

  1. Первым делом включите наушники при помощи соответствующей кнопки, расположенной на корпусе. Обычно процедура включения функции NFC указана в стандартной инструкции производителя.
  2. Пример Bluetooth-наушников с NFC-чипом

  3. На телефоне откройте системное приложение «Настройки» и в разделе «Беспроводные сети» включите функцию «NFC». Ее расположение, равно как и в случае с Bluetooth, может отличаться на разных смартфонах.

    Подробнее: Как включить NFC на Android

  4. Включение функции NFC в Настройках на Android

  5. Следующим и последним шагом поднесите телефон к наушникам и подтвердите подключение на экране. Разновидность запроса напрямую зависит от производителя гарнитуры и Android-устройства.

Подобная гарнитура имеют высокую цену и встречается крайне редко, поэтому акцентировать внимание на инструкции стоит только при наличии подобных наушников.

Подключение bluetooth-модуля к arduino

Так теперь нам нужно подключить нашу Arduino с Bluetooth. Если на Arduino нет вывода с 3.3В , а только 5В то нужен будет поставить стабилизатор чтобы снизить питание. Назначение выводов HC-05 легко найти в интернете. Для использования рекомендуем вам сделать плату с выведенными линиями питания, Rx и Tx. Подключение к Arduino необходимо производить в следующем порядке:

  • вывод Arduino 3.3В или (5В через стабилизатор!) — к 12 пину модуля Bluetooth
  • вывод Arduino GND — к 13 пину модуля Bluetooth
  • вывод Arduino TX — к 2 пину модуля RX Bluetooth
  • вывод Arduino RX — к 1 пину модуля TX Bluetooth

После подключения необходимо проверить работоспособность Bluetooth модуля. Подключим Светодиод к 12 выводу Arduino и загрузим на плату следующий скетч:

char incomingByte;  // входящие данные
int  LED = 12;      // LED подключен к 12 пину

void setup() {
  Serial.begin(9600); // инициализация порта
  pinMode(LED, OUTPUT); //Устанавливаем 12 вывод как выход
  Serial.println("Press 1 to LED ON or 0 to LED OFF...");
}

void loop() {
  if (Serial.available() > 0) {  //если пришли данные
    incomingByte = Serial.read(); // считываем байт
    if(incomingByte == '0') 
    {
       digitalWrite(LED, LOW);  // если 1, то выключаем LED
       Serial.println("LED OFF. Press 1 to LED ON!");  // и выводим обратно сообщение
    }
    if(incomingByte == '1') {
       digitalWrite(LED, HIGH); // если 0, то включаем LED
       Serial.println("LED ON. Press 0 to LED OFF!");
    }
  }
}

Теперь скачиваем из Play Market программу Bluetooth-терминал и устанавливаем его. Включаем нашу Arduino. В приложении Нажимаем кнопку меню->Connect a device-Secure.Тем самым ваше устройство начнём искать Bluetooth поблизости. Наш модуль должен называться HC-05.

Вам потребуется выписать его MAC-адрес, так он понадобится в дальнейшем. Как только он обнаружит устройство HC-05 выберите его. Пароль, если потребуется: 1234 (это стандартный код). После того как вы подключились к нему у вас должно вывести сообщение которое пришло в Bluetooth терминал от Arduino:

“Press 1 to LED ON or 0 to LED OFF..” Далее введите 1 и нажмите отправить. Тем самым вы посылаете цифру 1 через Bluetooth на Arduino. Как только он примет цифру 1 должен загореться светодиод подключенный к 12 выводу Arduino. После введите цифру 0 и светодиод должен погаснуть. Если всё получилось переходим дальше.

Пошаговая инструкция

Шаг 1. Зарядите беспроводные наушники. Если используются TWS наушники, которые укомплектованы зарядным кейсом, проверьте, что он заряжен. Обычно, об этом свидетельствует соответствующий светодиодный индикатор.

Шаг 2. Перед подключением достаньте наушники из кейса. Для полноразмерных или внутриканальных наушников этот шаг можно пропустить.

Шаг 3. Переведите устройство в режим поиска, чтобы смартфон смог его найти. Например, для подключения беспроводных Redmi AirDots нужно удерживать кнопки на обоих наушниках до полного отключения (вы услышите звуковой сигнал).

Обратите внимание! О том, как перевести вашу модель беспроводных наушников в режим поиска, можно узнать из инструкции или на сайте производителя.

Шаг 4. Откройте настройки «Bluetooth» на смартфоне, удерживая палец на соответствующем значке в шторке уведомлений.

Шаг 5. Активируйте переключатель рядом с пунктом «Включить Bluetooth».

Шаг 6. В разделе «Доступные устройства» появятся ваши беспроводные наушники. Нажмите по ним для начала сопряжения.

Обратите внимание! Левый наушник автоматически синхронизирует звук с правым наушником. Поэтому, если телефон обнаружил оба наушника, подключение все равно выполняется к правому, поскольку он является основным.

Шаг 7. Поставьте отметку «Разрешить доступ к контактам и журналу звонков» (позволит принимать входящие вызовы) и нажмите «Принять».

Шаг 8. Наушники отобразятся в разделе «Сопряженные устройства». Здесь же будет показан заряд аккумулятора и текущее состояние, например, активно и подключено.

Шаг 9. Для того, чтобы открыть дополнительные настройки, выберите сопряженное устройство из списка. Отобразится меню, в котором можно настроить нужно ли использовать наушники для звонков и воспроизведения музыки. Здесь же устройство можно отключить.

Приложение #13: philips headphones

В число возможностей этой программы для наушников входят:

  • Функция Active Noise Cancellation, позволяющая тонко регулировать громкость внешних звуков.
  • Эта программа для беспроводных наушников на Андроид и iOS позволяет пользоваться голосовыми помощниками Google и Apple.
  • При помощи приложения можно контролировать заряд аккумулятора в каждом из наушников.
  • При наличии соответствующего датчика имеется возможность следить за частотой пульса.
  • Вы можете пользоваться готовыми пресетами и создавать новые — например, для игры или прослушивания музыки в любом плеере.
  • Имеется несколько предустановок эквалайзера с возможностью создания собственных предварительных настроек.
  • В этом приложении для наушников есть собственный, довольно неплохой встроенный аудиопроигрыватель.
  • Вы можете пользоваться понятными пошаговыми инструкциями по настройке качества звука, вызову голосового помощника, выбору параметров приложения.
  • Рассматриваемая нами программа для настройки беспроводных наушников регулярно обновляется.

Создание приложения

Выбираем File->New->Project.
Window
Так как мы создаём приложение для android, выбираем Android-> Android Application Project, и нажимаем Next
Window2
Так как мы создаём приложение для android, выбираем Android-> Android Application Project, и нажимаем Next
5 приложений для управления и настройки кнопок гарнитуры в Android

Следующее диалоговое окно:
Window3
Application Name -> пишем имя приложение,
Project Name -> пишем имя проекта,
Package Name -> Ни чего не пишем он создается автоматически!
Minimum Required SDK -> это минимальные требование указываем нашу версию Android у меня 4.1 её я и выбираю.
Target SDK -> выбираем вашу версию Android
Compile with -> выбираем вашу версию Android
Theme: для начала я бы советовал выбрать None.
Нажимаем Next.
В следующем окне ничего менять не нужно. Просто жмем Next.
Window4
Application Name -> пишем имя приложение,
Project Name -> пишем имя проекта,
Package Name -> Ни чего не пишем он создается автоматически!
Minimum Required SDK -> это минимальные требование указываем нашу версию Android у меня 4.1 её я и выбираю.
Target SDK -> выбираем вашу версию Android
Compile with -> выбираем вашу версию Android
Theme: для начала я бы советовал выбрать None.
Нажимаем Next.
В следующем окне ничего менять не нужно. Просто жмем Next.
5 приложений для управления и настройки кнопок гарнитуры в Android

Далее нам предлагают создать свою иконку для приложения, можете изменить стандартный ярлык загрузив свою картинку, я же для начала предлагаю просто нажать Next.
Window5
В следующем необходимо выбрать пункт меню Blank Activity и нажимать Next.
Window6
В следующем необходимо выбрать пункт меню Blank Activity и нажимать Next.
5 приложений для управления и настройки кнопок гарнитуры в Android

Жмем Finish и через несколько секунд открывается главное окно нашей программы. Выбираем вкладку Activity_main.xml и видим наш редактор:
Window7

Оцените статью
Радиокоптер.ру
Добавить комментарий

Adblock
detector