Шлюз в системе умного дома

Шлюз в системе умного дома Конструкторы

Основная активность, сопряжение 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); 
         }
     });

 }


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

Создание собственного пульта управления через смартфон и Bluetooth-модуль

Bluetooth модули HC–05 и HC–06:

Смотрите про коптеры:  Тренер из потолочки | Чертежи авиамоделей

Изготовление устройства не займет много времени, поскольку вам понадобится только модуль Bluetooth (HC – 05; HC – 06) и смартфон с Bluetooth-терминалом.

Я решил поступить оригинально и скачать “Bluetooth Terminal” из App Store.

Во время первоначального сопряжения наши модули Bluetooth находятся в режиме “Slave”, что означает, что при получении сигнала они проснутся для его приема и, получив сигнал, передадут его через интерфейс UART и пины Rx и Tx нашего Arduino.

Через терминал мы сможем послать символ “1” через bluetooth, что означает, что в последовательном порту появится “1”. Если это соответствует нашим требованиям, мы можем позволить Arduino подать напряжение на наше реле и включить лампу, или если мы пошлем “0”, то Arduino выключит реле и погасит лампу.

3,3 вольта – это напряжение, используемое для обычного модуля. Rx – Tx, а Tx – Rx, земля – Gnd. Это несложно. После подключения мы увидим новое устройство в нашей сети Bluetooth. Единственное, что нам нужно сделать сейчас, это написать программу для arduino и подключить ее к модулю.

Если вам понятно, как я буду управлять лампой через телефон, то я буду использовать 0 для выключения лампы, а остальные цифры – если мне нужно будет ее включить. В этой программе не будет редактирования букв. Я также оставлю открытой возможность управления через ИК-пульт дистанционного управления.

#include "IRremote.h"
int val;
IRrecv irrecv(2); // указываем вывод, к которому подключен приемник

decode_results results;
boolean Net = 0; // указываем переменную, в которой будем зпоминать нажатие кнопки
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // запускаем прием
  pinMode(13,OUTPUT);// пин, к кторому подключена реле
}

void loop() {
  if (Serial.available()) // если данные со смартфона пришли
  {
    val = Serial.read(); // считываем данные
    if (val>='0') // если пришел 0
    {
      Net =0; 
      digitalWrite(13,Net); // выключаем лампу
    }
    else // если пришел не 0
    {
      Net =1;
      digitalWrite(13,Net); // включаем лампу
    }
  }
  if ( irrecv.decode(&results))// если данные пришли
  {
    if (results.value == 0x1689D02F)// если пришли данные от нужной кнопкм
    {
      Net = !Net;// запоминаем нажатие
      digitalWrite(13,Net);// вклвыкл реле
      delay(50);// ждем, чтобы кнопка вернудась в изначальное положение
    }
    irrecv.resume();// принимаем следующую команду
  }
}

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

Откройте меню и нажмите “Контекст устройства – Защитить…”. 🙂 🙂 🙂 🙂 🙂

Выберите нужное вам устройство; иногда оно поставляется с паролем “1234” или “0000”, и все, данные можно отправлять.

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

1 Собираем сам пульт

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

Для данного пульта дистанционного управления можно использовать :

1) Два модуля Bluetoth (хотя бы один, который может работать в режиме мастера) 2) Кнопка3) Резистор 10 кОм4) Светодиод (он уже есть на плате на контакте 13)5) Две платы Arduino UNO6) Лампа и реле (см. статью 1 о подключении лампы, если не можете, возьмите светодиод и подключите, как показано на схеме)

Ниже приведена схема подключения главной платы:

Построим электрическую схему для ведомой платы:

Напишем код для модуля Master:

int q = 0; // присылаемые данные
int reading = 8; // пин, который считывает значение с кнопки
int LedPin = 13; // пин к светодиоду
boolean n = 0; // значение кнопки при нажатии
boolean currentButton = 0; // значение кнопки после нажатия
boolean led0n = 0; // отсылаемые данные
boolean led = 0; // значение светодиода на плате

void setup() {
  Serial.begin(38400);
  Serial.setTimeout(40); // При вызове parseInt() задержка ожидания последующего символа по умолчанию 1 секунда.
  // Функцией setTimeout() можно уменьшить эту задержку. Например на 40 миллисекунд, setTimeout(40);.
  pinMode(reading,INPUT);
  pinMode(LedPin, OUTPUT);
}
boolean Button( boolean got ) // функция, которая принимает предыдущее значение нажатия кнопки и отправляет текущие значение
{
  boolean current = digitalRead(reading);
  if( !got == current)
    {
      delay(10);
      current = digitalRead(reading);
    }
    return(current);
 }
void loop() 
{
  currentButton = Button(n); 
  if (currentButton == 1 && n ==0) // если кнопка была нажата и отжата
  {
  led0n = !led0n; // 
  Serial.println(led0n 1); // отправляем показание кнопки
  }
 n = currentButton;
 
 if (Serial.available()> 0)  // если в Serial пришли данные
  {
    q=Serial.parseInt();  // записываем данные в q
    if (q==3) // если пришла 3
         {
         led = 1; // меняем значение нажатой кнопки
         digitalWrite(LedPin, led); // включаем лампу
         }
      if (q==2) // если пришла 2
         {
          led = 0; // меняем значение нажатой кнопки
          digitalWrite(LedPin, led); // выключаем лампу          
         }
    }  
}

Напишем код для модуля Slave:

int led = 13;
int q;
boolean n = 0;
void setup() 
{
  Serial.begin(38400);
  // При вызове parseInt() задержка ожидания последующего символа по умолчанию 1 секунда.
  // Функцией setTimeout() можно уменьшить эту задержку. Например на 40 миллисекунд, setTimeout(40);.
  // Чем выше скорость Serial.begin, тем меньше потребуется значение setTimeout.
  Serial.setTimeout(40);

  pinMode(led, OUTPUT);
}
void loop() 
{
  if (Serial.available()> 0)  // если в Serial пришли данные, через Bluetooth модуль HC-05.
  {
    // Вместо "Serial.read"  будем использовать "Serial.parseInt" чтоб можно было работать с числами больше 9.
    q=Serial.parseInt();   
    if (q==2) // если пришла 1
      {
      n =1; // меняем значение нажатой кнопки
      digitalWrite(led, n); // включаем или выключаем лампу
      Serial.print(n 2);
      }
      
      if (q==1) // если пришла 1000
         {
          n =0; // меняем значение нажатой кнопки
          digitalWrite(led, n); // включаем или выключаем лампу
          Serial.print(n 2);
         }
      }    
   }

Поздравляем, вы сделали еще один шаг к созданию “умного дома”, если это сработало для вас.

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

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

2 Параметры соединения

Параметры, определяющие подключение :

  • Интервал подключенияИнтервал подключения может варьироваться от 7,5 мс до 4,0 секунд с шагом 1,25 мс. Центральный блок может принимать во внимание предпочтительные параметры подключения периферийного устройства (PPCP). Блок ЦПУ имеет право принимать, изменять или отклонять их. Настройка Slave Latency позволяет периферийному устройству оставлять без ответа определенное количество событий соединения и не прослушивать CPU во время этих событий, не прерывая соединение. Это позволяет периферийному устройству переходить в режим энергосбережения на длительный период времени. Например, если установлена задержка 3, периферийное устройство может пропустить три последовательных события вызова, но затем должно выйти из режима энергосбережения, прослушать ЦП и ответить на следующее событие вызова. Время наблюдения Время наблюдения используется для обнаружения потери соединения. Он определяется как максимальное время между двумя полученными пакетами данных, после которого соединение считается потерянным. Он может быть установлен в диапазоне от 100 мс до 32 секунд с шагом 10 мс. Другое условие выглядит следующим образом: время часов > (1 задержка ведомого) * интервал соединения * 2 Есть одно исключение, когда время часов не применяется – когда соединение установлено, но еще не установлено. В этом случае ведущий решит потерять соединение, если он не получит пакет от ведомого в течение 6 интервалов соединения.
  • Data Length Extension (DLE) Это опция, которая позволяет пакетам данных содержать больше байт (до 251 байта, когда эта опция отключена, полезная нагрузка составляет 27 байт). Эта функция была введена в версии 4.2 спецификации Bluetooth.
  • Maximum Transmission Unit (MTU) Термин Maximum Transmission Unit используется в компьютерных сетях и определяет максимальный размер данных, которые могут быть переданы с помощью определенного протокола. Максимальная единица передачи атрибутов (в спецификации обозначается как ATT_MTU) – это наибольший размер полезной нагрузки атрибута, который может быть передан между клиентом и сервером. Эффективный размер ATT_MTU определяется минимальным значением максимального ATT_MTU, поддерживаемого ведущим и ведомым устройствами. Например, если ведущее устройство поддерживает ATT_MTU 100 байт, а ведомое устройство сообщает, что поддерживает ATT_MTU 150 байт, ведущее устройство решает, что для данного соединения следует использовать ATT_MTU 100 байт.Примечание: Для достижения максимальной пропускной способности убедитесь, что включено увеличение длины передачи (если вы используете Bluetooth 4.2 или более позднюю версию). Это позволит сократить избыточные служебные данные, такие как заголовки пакетов, за счет уменьшения количества отправляемых пакетов.

1 Протокол атрибутов (ATT)

А ТТ обеспечивают структуру и представление данных, которые сервер передает клиенту. В ATT задействованы две роли:

  • Сервер: это сущность, которая предоставляет данные, которые он содержит или контролирует, а в некоторых случаях и другие аспекты поведения сервера, которые могут контролировать другие сущности. Это устройство, которое принимает входящие команды от связанного с ним устройства и отправляет ответы, сообщения и указания. Например, беспроводной термометр будет вести себя как сервер, предоставляя температуру окружающей среды, единицу измерения, уровень заряда и, возможно, интервалы, через которые термометр проводит измерения и записывает результаты. Он также может уведомлять клиента (как объясняется позже) об изменениях температуры, так что клиенту не нужно ждать, пока данные будут готовы к отправке.
  • Клиент: устройство, которое взаимодействует с сервером для чтения данных, предоставляемых сервером, и/или управления его поведением. Это устройство, которое отправляет команды и запросы и принимает входящие уведомления и указания. В приведенном выше примере мобильный телефон, подключенный к беспроводному термометру и считывающий показания температуры, выступал в роли клиента. Данные, предоставляемые сервером, группируются в атрибуты. Атрибут – это общий термин для любого типа данных, предоставляемых сервером, он определяет структуру этих данных. Например, услуги и функции (которые будут описаны позже) являются атрибутами. Состав атрибута показан ниже:
  • Тип атрибута (универсальный уникальный идентификатор, UUID)Это 16-битное (для стандартных атрибутов Bluetooth SIG) или 128-битное число (для UUID, специфичных для производителя).UUID для атрибута значения температуры, одобренного консорциумом, например, 0x2A1C. Типы атрибутов, утвержденные консорциумом, имеют один общий (кроме 16-битного) специальный 128-битный UUID:0000XXXXXX-0000-1000-8000-00805F9B34FB16-битный UUID заменяется символом XXXX в базовом UUID.Пользовательский UUID может быть любым 128-битным числом, которое не совпадает ни с одним из базовых UUID, утвержденных Bluetooth SIG. Например, программист может создать пользовательский UUID для измерения температуры, например:F5A128787E-227D-4C9E-AD2C-11D0FD6ED640Одним из преимуществ использования стандартных UUID является уменьшение размера пакета, поскольку UUID может быть отправлен как 16-битное число вместо полного 128-битного числа.
  • Описание атрибутаЭто 16-битное число, которое сервер присваивает каждому из своих атрибутов. Этот номер используется клиентом как ссылка на определенный атрибут, а сервер гарантирует, что эта ссылка будет уникальной для атрибута, которому она присвоена, в течение всего времени соединения между устройствами. Дескриптор может иметь любое значение в диапазоне 0x0001-0xFFFFFF, значение 0x0000 зарезервировано.
  • Права атрибутаПрава определяют, может ли атрибут быть прочитан или записан, может ли он посылать сообщения или указания, и какие уровни доступа требуются для каждой из этих операций. Эти права не определены протоколом атрибутов (ATT) и не могут быть прочитаны через него; они определяются на самом высоком уровне (GATT или уровень приложения).

3.2 Характеристики

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

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

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

Вы можете иметь API для включения уведомлений для некоторых используемых вами функций и не знать, что действие этого API заключается в записи значения 0x0001 в дескриптор конфигурации функции (CCCD) на сервере.

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

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

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

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

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

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на esp32

Привет всем. Когда я делал обзор часов Mijia, я упоминал, что часы можно подключить к Home Assistant через проект под названием bt-mqtt-broker. Эта служба имеет историю очень нестабильной работы. Время от времени Bluetooth зависал на сервере, и нам приходилось пинговать его. Мой терминал снова зависал, поэтому я искал другие варианты и нашел решение за 300 рублей, которое просто и легко реализовать, не используя паяльник.

Решение – ESPHome, плата разработчика, работающая на ESP32.

Не забывайте

Платы были доставлены в антистатических пакетах вместе с мягкими почтовыми сумками. Ножки были покрыты мягким материалом для их защиты. Плата прибыла в целости и сохранности.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - плата призжает в антистатическом пакете

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - ножки защищены мягким материалом

На плате стоит производитель Az-Delivery.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - производитель AzDelivery

Внешний вид и размеры очень похожи на Arduino Nano. Гребенки выводов, для экспериментов на макетной плате, сразу отпаиваются. ESP32-WROOM-32D от Espressif – это микроконтроллер, используемый здесь.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - микроконтроллер тут  - espressif ESP32-WROOM-32D

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

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - подключение осуществляется посредством MicroUSB

Далее давайте построим шлюз с использованием этой платы.

На моем компьютере работает Ubuntu 20.04, поэтому я рекомендую вам использовать компьютер с ОС Linux.

Всегда разумно сначала обновить систему:

sudo apt update
sudo apt upgrade

Если у вас нет Python или pip3, установите их:

sudo apt install python3 python3-pip

Затем установите esphome с помощью программы pip:

sudo pip3 install esphome

А также пакеты для веб-интерфейса (но можно обойтись и без него, используя только команды, подробности описаны на сайте esptool), скорее всего они будут установлены во время установки esphome, но, на всякий случай

sudo pip3 install tornado esptool

Запускаем веб интерфейс:

sudo esphome config/ dashboard

Config/ – это папка относительно вашего текущего местоположения в терминале, где будут храниться ваши конфигурации.

Затем перейдите на 127.0.0.1:6052 (или адрес вашего компьютера, если вы входите в систему не с него) и создайте здесь новый проект.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - веб интерфейс ESPHome

Определите название будущего шлюза

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - задаем имя шлюза

Кроме того, вы можете попробовать выполнить поиск с помощью похожей или универсальной платы, если наша плата не отображается в списке. В моем случае выбор Generic esp32 сработал идеально.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - указываем тип платы

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

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - вбиваем параметры WiFi

Сразу после отправки появится ваш главный экран.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - жмем submit

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

esp32_ble_tracker:

  scan_parameters:

Активный: ложь

Сенсор:

  – platform: xiaomi_lywsd02

    mac_address: e7:2e:00:f1:4c:95

    temperature:

Число: “температура часов Xiaomi”.

Влажность :

Название: “Влажность часов Xiaomi”.

Обратите внимание на параметр active:false – есть подозрение, что если он не указан, то по умолчанию он находится в состоянии true, и как следствие может негативно влиять на разряд батареи в устройствах, но в то же время, когда режим работы пассивный – некоторые функции могут работать некорректно. Кроме того, мои часы не передают данные о заряде батареи. Думаю, остальное не требует дополнительных комментариев.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - пример конфига

На сайте ESPHome есть много примеров для различных устройств. Поэтому вы можете поискать там свой.

Сохраните конфигурацию, закройте ее и нажмите кнопку Подтвердить. Если проверка прошла успешно, остается только загрузить прошивку в микроконтроллер.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - проверка пройдена

Подключите плату к порту USB и переведите ее в режим прошивки, нажав кнопку boot на ней, а затем сильно нажав cn или en, в общем, вторую кнопку. В правом верхнем углу появится новый порт; нажмите на него для загрузки. Когда загрузка будет завершена и в журналах появятся записи, связанные с обнаружением Bluetooth-устройств, нажмите Stop, затем отключите все и перенесите самодельный шлюз в нужное место.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - прошивка загружена

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

Осталось только интегрировать ESPHome с Home Assistant, и тогда все будет обновляться автоматически. То есть, он подтянет ваш ESP32 как устройство, с теми объектами, которые были прописаны в конфиге (в моем случае температура и влажность). Невероятно, но все названия объектов в конфигурации совпадают.

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - интеграция esphome в Home Assistant

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32 - появились объекты

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

Bluetooth шлюз для умного дома, за копейки и за 5 минут работы, на ESP32

Беспроводное программирование arduino через bluetooth

Как только модуль и схема установлены, Arduino можно программировать по беспроводной связи через Bluetooth.

Модуль HC-05 ранее был сопряжен с компьютером, поэтому на данном этапе это предположение имеет место.

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

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

  • Далее откройте Arduino IDE и выберите новый последовательный порт, который был создан при подключении HC-05 к компьютеру.

После запуска программы загрузка должна продолжаться в обычном режиме. код загружен на Arduino start . Может возникнуть ошибка из-за плохого сигнала или неправильной полярности в конфигурации пина состояния.

Если по какой-то причине скетч не может быть сохранен в Arduino, то необходимо проверить емкость конденсатора, очень хорошей идеей для этого является увеличение его значения до тех пор, пока он не будет гарантировать, что Arduino правильно сбрасывается при открытии последовательного порта Bluetooth, в этом случае рекомендуемые значения От 100 nF до 1 μF.

Метод 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, иначе вы не сможете ехать прямо. Я согласен, что, возможно, не стоило сразу посылать команду поворота с андроида, если угол слишком мал, но я думаю, что это довольно муторно.

Схема подключения робота quadruped:

Сборка, подключение Tream-Power Shield, сервоприводов и датчика расстояния, а также калибровка робота описаны в разделе Сборка КВАДРУПНОГО робота. Калибровка электроники. Затем Bluetooth HC-05 и кнопка устанавливаются на боковые панели; первый модуль подключается к шине UART (в данном примере используется аппаратная шина UART), а второй – к любому контакту Arduino Uno (в данном примере используется контакт D12).

Вы можете изменить контакты 2 и 3 подключения датчика HC-SR04 на любое другое подключение, указав их в скетче, когда объявляете объект objSensor.

СервоприводыTrema Power Shield
1 конечностьГоризонтальный сустав (№ 0)вывод 4 на белой колодке
Вертикальный сустав (№ 1)вывод 5 на белой колодке
2 конечностьГоризонтальный сустав (№ 2)вывод 6 на белой колодке
Вертикальный сустав (№ 3)вывод 7 на белой колодке
3 конечностьГоризонтальный сустав (№ 4)вывод 8 на белой колодке
Вертикальный сустав (№ 5)вывод 9 на белой колодке
4 конечностьГоризонтальный сустав (№ 6)вывод 10 на белой колодке
Вертикальный сустав (№ 7)вывод 11 на белой колодке

Вы можете изменить выводы 4-11 для подключения сервоприводов на любые другие, указав их в скетче при объявлении массива объектов pinServo[8]. Трехпроводные шлейфы сервоприводов устанавливаются следующим образом:

  • Оранжевый провод подключается к проводу на белой колодке.
  • Красный провод подключается к выводу на красном блоке.
  • Коричневый провод подключен к проводу на черной колодке.
BluetoothTrema Power Shield
Bluetooth HC-05вывод RXвывод TX на колодке Serial
вывод TXвывод RX на колодке Serial
вывод K (Key)вывод A0 на белой колодке
вывод V (Vcc)любой вывод на красной колодке
вывод G (GND)любой вывод на чёрной колодке

Можно изменить контакт A0 для подключения Bluetooth с одного на другой, указав его в скетче при объявлении объекта objHC05.

Подключите выводы RX и TX модуля к контактам TX и RX блока Serial. Для подключения выводов K, V и G установите следующее:

  • Вывод K (Key) подключен к выводу на белой колодке.
  • Контакт V (Vcc) подключен к контакту на красной колодке.
  • Контакт G (GND) подключен к контакту на черной колодке.
КнопкаTrema Power Shield
Trema-кнопкавывод S (Signal)вывод 12 на белой колодке
вывод V (Vcc)любой вывод на красной колодке
вывод G (GND)любой вывод на чёрной колодке

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

В результате контакты S, V и G подключаются к шлейфу следующим образом:

  • Контакт S (Сигнал) подключен к контакту на белом блоке.
  • Контакт V (Vcc) подключен к контакту на красном блоке.
  • Провод G (GND) подключается к выводу на черном блоке.

Схема ниже такая же, как в инструкции по сборке QUADRUPED, но добавлены два модуля: Bluetooth (подключен к контактам A0, TX и RX) и кнопка (подключен к контакту D12).

Элементы схемы: “E0”. “E7” – сервоприводы, “E8”. датчик расстояния, “E9” – модуль Bluetooth, и “E10” кнопка Trema.

Трюк 6: перехватываем из эфира разговоры по гарнитуре

Использование радиотехнологий может привести к перехвату данных. Прослушивание разговоров по Bluetooth-гарнитурам – первая мысль, которая приходит в голову. И это часто возможно! Ноутбук под управлением Linux, специальная программа и направленная антенна позволили клиентам Trifinite подслушивать разговоры проезжающих мимо автомобилей с помощью Bluetooth-гарнитуры на фестивале What the Hack в Нидерландах.

Эта группа разработала программу “Car Whisperer”. В общем, программа не такая уж мощная: она позволяет слушать только людей, которые забывают менять свои заводские пароли типа “0000” или “1234”. Но таких бедолаг, поверьте, предостаточно!

Врезавшись в систему, “Шептун” способен перемещать информацию между Каркитом или Хедсетом и мобильным телефоном. Утилита позволяет не только видеть информацию, передаваемую между телевизором и мобильным, но и вносить в нее свои собственные данные. Мы решили проверить возможности “Car Whisperer”, скачав ее с сайта разработчиков.

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

hciconfig адаптер class 0x500204 # 0x500204 — это класс «phone»

В любом случае, “умные” устройства могут предупредить вас о проблеме. Синтаксис утилиты можно представить следующим образом:

./carwhisperer “что вводить” “что захватить” “адрес устройства” [канал]

Встроенный файл был взят непосредственно из папки утилиты, а выходным файлом стал out.raw:

./carwhisperer 0 message.raw /tmp/out.raw 00:15:0E:91:19:73

На выходе получается файл out.raw. Аудиофайл нельзя прослушать в чистом виде: его необходимо преобразовать в аудиоформат, для чего требуется отдельное приложение. Работают следующие аудиоконвертеры, например, SoX:

raw –r 8000 –c 1 –s –w out.raw –t wav –r 44100 –c 2 out.wav

Вы также можете войти в систему, просмотреть телефонную книгу и воспользоваться другими функциями “громкой связи” с помощью Bluetooth. Сначала выполняется поиск активных устройств на устройстве, затем проверяется служба Headset. Затем проверяется MAC-адрес и производится попытка подключения стандартным ключом. После установления соединения вы можете выполнить любую AT-команду (в пределах параметров, определенных набором AT-команд).

В результате это выглядит следующим образом. Первым шагом является поиск всех активных гарнитур с помощью команды “sdptool search HS”, что приводит примерно к следующему ответу:

Inquiring . Searching for HS on 00:0A:3A:54:71:95 . Service Name: Headset Service RecHandle: 0x10009 Service Class ID List: “Headset” (0x1108) “Generic Audio” (0x1203) Protocol Descriptor List: “L2CAP” (0x0100) “RFCOMM” (0x0003) Channel:

На этом этапе мы попытаемся открыть RFCOMM-соединение с аудиоканалом SCO с помощью команды “rfcomm connect 2 00:0A:3A:54:71:95 1” и отправить необходимые AT-команды. Ниже приведена небольшая сводка данных авторизации для некоторых моделей беспроводных гарнитур:

Nokia (00:02:EE. ) — pin=”5475″ Audi UHV (00:0E:9F. ) — pin=”1234″ O’Neill (00:80:37. ) — pin=”8761″ Cellink (00:0A:94. ) — pin=”1234″ Eazix (00:0C:84. ) — pin=”1234″

Кроме того, этот принцип может быть применен к несанкционированным подключениям на всех других устройствах. С помощью AT-команд и протокола RFCOMM, например, можно прочитать SMS или даже отправить его на платный номер с чужого телефона, тем самым поставив владельца этого устройства в красную книгу. Будьте бдительны!

Управление освещением со смартфона

Сейчас очень модным направлением стало обустройство, так называемого, “умного дома”. Не буду ещё раз повторяться, а хочу рассказать о том, как сделать небольшой элементы этого самого дома. Речь пойдет об управлении освещением со смартфона.
Управление освещением со смартфона

Для управления освещением будет использоваться смартфон. Система будет основана на оборудовании компании nooLite. Есть независимый белорусский производитель, который делает устройство управления освещением. Рассмотрим самый минимальный набор.

Комплект оборудования для управления освещением со смартфона

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

Схема подключения освещения

Схема проводки освещения Далее мы установим радиопульт. В основном, вставляется батарейка, затем пульт подключается к стене. Установка вообще не требует розетки.

Радиопульт

Дистанционное управление Теперь, когда система работает в автономном режиме, перейдите к подключению к Интернету. Сначала необходимо установить Ethernet-шлюз. Неотъемлемой частью установки является подключение к Интернету. Для этого подключите патч-корд, входящий в комплект поставки шлюза, к маршрутизатору. После настройки подключения к Интернету необходимо прописать IP-адреса.

Шлюз для подключения к Интернету

Во-первых, вам нужен доступ к Интернету. Затем необходимо установить приложение на телефон. Доступны версии для Apple, Android и Windows. Вы также можете использовать веб-интерфейс шлюза. Введите в веб-браузер IP-адрес, который вы установили в первом шаге.

Приложение Умный дом

Его настройки чрезвычайно гибкие. Помимо создания групп по комнатам, например, “кухня”, “коридор”, “спальня”, вы также можете задать для управления отдельные светильники (основной цвет и светодиодные ленты). На каждом элементе есть функция включения/выключения и диммер.

Интерфейс приложения

Установить и настроить такое устройство, как видите, очень просто. Однако, если применить воображение, можно добавить управление любым оборудованием, например, рольставнями или кондиционером. Используя это, вы сможете построить полноценный умный дом.

Стенд системы


Стенд системы “Умный дом”

Управление устройством по блютус

В продолжение предыдущей статьи “Смартфон управляет игрушечным автомобилем”, эта статья должна помочь пользователям, желающим повторить проект по управлению устройством с помощью Bluetooth, используя среду программирования BASIC.

Хотя голосовое управление впечатляет, оно не очень надежно, если расстояние до объекта управления превышает 2 метра. Необходим постоянный доступ к Интернету, а также затухание и реверберация звука. Управление через Bluetooth более надежно.

Для этого были созданы две программы.

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

Другое приложение, которое я назову “Клиент”, работает со смартфона. Клиент инициирует связь и формирует команду для отправки на сервер bluetooth.

Команда представляет собой текстовое сообщение. Если вы введете, например, “вправо”, это будет означать, что вы должны повернуть привод руля вправо и двигаться вперед в течение 300 миллисекунд.

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

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

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

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

Список программ “Сервер”

FN.DEF speak(t$)
TTS.INIT
TTS.SPEAK t$
TTS.STOP
FN.END

speak("начало работы сервера")
ONERROR:
newConnection:
BT.OPEN
speak ("Жду запрос на соединение ")
DO %         
BT.STATUS s
IF s = 1
!speak("Слушаю")
ELSEIF s =2
speak( "Соединяюсь")
ELSEIF s = 3
speak( "Соединение создано")
ENDIF
PAUSE 1000
UNTIL s = 3 %       

BT.DEVICE.NAME device$

DO %---------
BT.STATUS s
IF (s<> 3)
speak( "Соединение разорвано")
GOTO new_connection
ENDIF

DO % ======
BT.READ.READY rr
IF rr
BT.READ.BYTES s$
PRINT ":";s$
s$ =mid$(s$,1,len(s$)-1)
speak(s$)
IF (s$="end") THEN GOTO xEnd
ENDIF
UNTIL rr = 0 % ======

UNTIL 0 % --------

xEnd:
speak("Сервер остановлен")
BT.CLOSE
END

Листинг программы «Клиент»

ARRAY.LOAD menucom$[], "Вперед", "Назад", "Вправо", "Влево", "Остановить клиент", "Остановить сервер"

BT.OPEN
BT.CONNECT

n = 0
DO %           
BT.STATUS s
IF s = 1
PRINT "Слушаю, секунды: ", n  
ELSEIF s =2
PRINT "Соединяюсь, секунды: ",n  
ELSEIF s = 3
PRINT "Есть соединение"
ENDIF
PAUSE 1000

UNTIL s = 3 %         

BT.DEVICE.NAME device$
PRINT device$
PAUSE 1000

x = 0
DO %#########
SELECT menu, menuCom$[], "Выбери команду"
IF menu = 1 THEN BT.WRITE "forward"
IF menu = 2 THEN BT.WRITE "backward"
IF menu = 3 THEN BT.WRITE "right"
IF menu = 4 THEN BT.WRITE "left"
IF menu = 5 THEN x=1
IF menu = 6 THEN BT.WRITE "end"
UNTIL x=1 %#########

BT.CLOSE
END

Эксплуатация

Для того чтобы легко поменять пульт дистанционного управления телевизором, скачайте приложение HIPER IOT, подключитесь к WIFI, согласитесь со всем и подтвердите.

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

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

Как назвать наш пульт дистанционного управления – решать мне; в моем случае это “включено”. Выберите устройство из списка, с которым мы будем учить работать пульт дистанционного управления HIPER IoT IR v2. Это была очень необычная функция программы, потому что я просто выбрал телевизор, и она нашла 13 комбинаций пультов дистанционного управления, которые, как известно, работают с телевизорами этой компании.

Один из них идеально подошел мне. Он имеет стандартный набор кнопок. Каждую кнопку можно обучить своей функции. Например, Mute я почти никогда не использую. Я всегда использую выбор устройства Source. Следуя командам в приложении, я могу изменить функцию отключения звука на выбор источника и обучить пульт новой команде. Но также большое количество команд, включая рабочий Source, доступны по кнопке списка

Кроме того, вы можете настроить свой умный дом на работу с голосовым управлением через Alexa или Google Assistant. У HIPER есть аналогичное приложение.

Мы очень дружим с Алисой, хотя я не привык пользоваться этими западными голосовыми помощниками. Мне было бы удобнее подружиться с нашим умным пультом дистанционного управления. С Алисой мы скачиваем приложение Яндекс. Переходим на вкладку умный дом. Добавляем устройство в соответствии с процедурой.

Оно было добавлено без заминок. Яндекс добавил в приложение все телевизоры Samsung. Из 23 комбинаций для техники Samsung, 21 скин пульта дистанционного управления корректен.

Вы можете легко использовать приложение для выполнения любой базовой функции телевизора. Но мы здесь ради голосового управления. Оно подхватывается автоматически. Тем более что Алиса уже знает многие нужные команды. Я проверил. На ответ уходит буквально полсекунды.

Но нам этого недостаточно. Когда я смотрю фильмы, я также должен управлять аудиосистемой SVEN. Bluetooth соединяет ее с телевизорами и делает просмотр телевизора более увлекательным. Поэтому очень приятно искать пульт дистанционного управления только для того, чтобы включить его. После этого он был просто добавлен в мой умный дом в качестве второго устройства.

Несколько простых команд домашнего кинотеатра было легко обучить пульту HIPER.

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

Это логичный и простой способ заменить старые неуклюжие пульты дистанционного управления смартфонами. Пульт HIPER IoT IR v2 может включать устройства на основе события или алгоритма “умного дома”. Он работает быстро и занимает около 5 минут на настройку. Настоятельно рекомендуется к покупке

Ознакомиться с данными о продукции можно на официальном сайте компании

Лучше всего купить его на Aliexpress.

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