Последовательный Bluetooth-терминал, как это работает

Обновлено: 21.11.2024

Иногда вы находите такой дешевый компьютерный компонент, который работает так хорошо, что удивляетесь, как вам удалось так долго обходиться без него. Модуль беспроводного последовательного порта JY-MCU Arduino Bluetooth — это то, что мне сейчас нужно.

Эта маленькая плата представляет собой недорогой ($8,50!) последовательный порт Bluetooth. Он доволен логическими уровнями Raspberry Pi 3,3 В и будет обмениваться данными со стандартной скоростью от 1200 до 1 382 400 бод. Он даже поставляется с изящным маленьким кабелем, который имеет правильную полярность для контактов GPIO Raspberry Pi. На самом деле он предназначен для последовательной связи на Arduino, но этим не ограничивается.

Эта плата позволяет вам подключаться к последовательной консоли вашего Raspberry Pi через Bluetooth. Таким образом, вы можете где-то спрятать свой Raspberry Pi, но при этом войти в систему, как если бы вы разговаривали с ним напрямую через последовательный кабель. В сочетании с беспроводным USB-адаптером (например, Belkin N150, которым я пользуюсь), вы получите беспроводное устройство, к которому всегда сможете подключиться, даже если сеть выйдет из строя.

  1. Если у вас есть последовательный преобразователь USB-TTL (например, FTDI Friend, FTDI Basic Breakout — 3,3 В или тот, который я использую, OSEPP FTDI), вы можете перенастроить модуль Bluetooth для работы со скоростью 115 200 бод, которая используется по умолчанию. скорость последовательного порта Raspberry Pi.
  2. Если у вас нет последовательного преобразователя, вам необходимо перенастроить последовательный терминал Raspberry Pi для работы со скоростью 9600 бод Bluetooth-адаптера JY-MCU по умолчанию.

Чтобы перенастроить модуль Bluetooth для работы со скоростью 115 200 бод

(Я выбрал этот вариант, так как он позволяет использовать модуль Bluetooth с Firmata и на Arduino.)

Обратите внимание, что TXD и RXD пересекаются. Блок Bluetooth работает от источника питания 3,6-6 В, но логика 3,3 В. Чтобы ввести AT-команды, запустите последовательный терминал (Hyperterm, minicom, screen...) на скорости 9600 бод, взаимодействующий с адаптером USB-Serial, и скопируйте и вставьте эти команды в:

Вам придется отключить терминал и снова подключиться со скоростью 115 200 бод, так как последняя команда просто сбрасывает скорость устройства Bluetooth. Возможно, вы захотите использовать другие настройки, кроме Bluey для имени и 4321 для PIN-кода.

Обновление: убедитесь, что файл /boot/cmdline.txt вашего Raspberry Pi содержит:

В противном случае вы не получите запрос на вход.

Теперь перейдите к разделу Использование устройства.

Чтобы перенастроить последовательный терминал Raspberry Pi для работы на скорости 9600 бод

Последовательные терминалы традиционно работали со скоростью 9600 бод, и в наши дни это кажется немного медленным. Но если у вас нет способа настроить устройство Bluetooth по-другому, 9600 — это то, с чем вы застряли. Вам нужно будет отредактировать /boot/cmdline.txt вашего Raspberry Pi, чтобы часть, которая ранее читалась:

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

Использование устройства

На Raspberry Pi подключите модуль беспроводного последовательного порта Bluetooth следующим образом:

(Несмотря на минимальное номинальное напряжение 3,6 В, я с удовольствием работаю от источника питания 3V3, контакт 1 GPIO. YMMV.)

ESP32 поставляется с Wi-Fi, Bluetooth Low Energy и Bluetooth Classic. В этом руководстве вы узнаете, как использовать ESP32 Bluetooth Classic с Arduino IDE для обмена данными между ESP32 и смартфоном Android.

Мы будем управлять выходом ESP32 и отправлять показания датчиков на смартфон Android с помощью Bluetooth Classic.

Примечание: этот проект только совместим со смартфонами Android.

Посмотрите видеоруководство

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

Классический Bluetooth с ESP32

На данный момент использовать Bluetooth Classic намного проще, чем Bluetooth Low Energy. Если вы уже запрограммировали Arduino с модулем Bluetooth, таким как HC-06, это очень похоже. Он использует стандартный последовательный протокол и функции.

В этом руководстве мы начнем с примера, который поставляется с Arduino IDE. Затем мы создадим простой проект для обмена данными между ESP32 и вашим Android-смартфоном.

Необходимые детали

Чтобы следовать этому руководству, вам понадобятся следующие компоненты:

    (читать Лучшие платы для разработки ESP32)
  • Смартфон Android с Bluetooth

Приложение Bluetooth-терминала

Чтобы продолжить работу с этим учебным пособием, на вашем смартфоне должно быть установлено приложение Bluetooth Terminal.

Мы рекомендуем использовать Android-приложение Serial Bluetooth Terminal, доступное в Play Маркете.

Последовательный Bluetooth

Мы будем программировать ESP32 с помощью Arduino IDE, поэтому перед продолжением убедитесь, что у вас установлено дополнение ESP32:

Откройте IDE Arduino и выберите «Файл» > «Примеры» > BluetoothSerial > SerialtoSerialBT.

Должен загрузиться следующий код.

Как работает код

Этот код устанавливает двустороннюю последовательную связь Bluetooth между двумя устройствами.

Код начинается с включения библиотеки BluetoothSerial.

Следующие три строки проверяют, правильно ли включен Bluetooth.

Затем создайте экземпляр BluetoothSerial с именем SerialBT :

настройка()

В setup() инициализируйте последовательную связь со скоростью 115 200 бод.

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

В цикле() отправляйте и получайте данные через Bluetooth Serial.

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

SerialBT.write() отправляет данные, используя последовательный порт Bluetooth.

Serial.read() возвращает данные, полученные через последовательный порт.

Следующий оператор if проверяет, есть ли байты, доступные для чтения в последовательном порту Bluetooth. Если они есть, мы запишем эти байты в Serial Monitor.

На демонстрации будет легче понять, как именно работает этот скетч.

Тестирование кода

Загрузите предыдущий код в ESP32. Убедитесь, что вы выбрали правильную плату и COM-порт.

После загрузки кода откройте Serial Monitor со скоростью 115 200 бод. Нажмите кнопку включения ESP32.

Через несколько секунд вы должны получить сообщение: "Устройство запущено, теперь вы можете подключить его к Bluetooth!".

Подойдите к своему смартфону и откройте приложение "Последовательный Bluetooth-терминал". Убедитесь, что на вашем смартфоне включен Bluetooth.

Чтобы подключиться к ESP32 в первый раз, необходимо выполнить сопряжение нового устройства.
Перейдите в раздел "Устройства".

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

Затем вернитесь к последовательному терминалу Bluetooth. Нажмите значок вверху, чтобы подключиться к ESP32. Вы должны получить сообщение «Подключено».

После этого введите что-нибудь в приложении Serial Bluetooth Terminal. Например, «Здравствуйте».

Вы должны немедленно получить это сообщение в последовательном мониторе Arduino IDE.

Вы также можете обмениваться данными между серийным монитором и смартфоном. Введите что-нибудь в верхней строке Serial Monitor и нажмите кнопку «Отправить».

Вы должны немедленно получить это сообщение в приложении Serial Bluetooth Terminal.

Обмен данными с помощью Bluetooth Serial

Теперь, когда вы знаете, как обмениваться данными с помощью Bluetooth Serial, вы можете изменить предыдущий эскиз, чтобы сделать что-то полезное. Например, управляйте выходами ESP32 при получении определенного сообщения или отправляйте данные на свой смартфон, например показания датчиков.

Проект, который мы создадим, отправляет показания температуры каждые 10 секунд на ваш смартфон. Мы будем использовать датчик температуры DS18B20.

Через приложение для Android мы будем отправлять сообщения для управления выводом ESP32. Когда ESP32 получит сообщение led_on, мы включим GPIO, когда он получит сообщение led_off, мы выключим GPIO.

Схема

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

Подключите светодиод к GPIO25 и подключите контакт данных DS18B20 к GPIO32.

Для работы с датчиком температуры DS18B20 необходимо установить библиотеку One Wire от Paul Stoffregen и библиотеку Dallas Temperature. Следуйте следующим инструкциям, чтобы установить эти библиотеки, если вы еще этого не сделали.

Библиотека One Wire

    . У вас должна быть ZIP-папка в папке «Загрузки».
  1. Разархивируйте папку .zip, и вы должны получить папку OneWire-master
  2. Переименуйте папку с OneWire-master на OneWire.
  3. Переместите папку OneWire в папку установочных библиотек Arduino IDE
  4. Наконец, повторно откройте среду разработки Arduino.

Библиотека температуры Далласа

    . У вас должна быть ZIP-папка в папке «Загрузки».
  1. Разархивируйте папку .zip, и вы должны получить папку Arduino-Temperature-Control-Library-master
  2. Переименуйте папку с Arduino-Temperature-Control-Library-master в DallasTemperature.
  3. Переместите папку DallasTemperature в папку установочных библиотек Arduino IDE
  4. Наконец, повторно откройте среду разработки Arduino.

После сборки схемы и установки необходимых библиотек скопируйте следующий скетч в вашу Arduino IDE.

Как работает код

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

Начните с включения необходимых библиотек. Библиотека BluetoothSerial для Bluetooth и OneWire и DallasTemperature для датчика температуры DS18B20.

Создайте экземпляр BluetoothSerial с именем SerialBT .

Создайте переменную с именем ledPin для хранения GPIO, которым вы хотите управлять. В этом случае к GPIO25 подключен светодиод.

Определите вывод датчика DS18B20 и создайте объекты, чтобы заставить его работать. Датчик температуры подключен к GPIO32.

Создайте пустую строку с именем message для хранения полученных сообщений.

Создайте символьную переменную с именем incomingChar, чтобы сохранять символы, поступающие через Bluetooth Serial.

Переменная TemperatureString содержит данные о температуре, которые необходимо отправить по Bluetooth.

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

настройка()

В setup() установите ledPin в качестве выхода.

Инициализируйте ESP32 как Bluetooth-устройство с именем «ESP32».

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

Следующий фрагмент кода проверяет, прошло ли 10 секунд с момента последнего чтения. Если пришло время отправить новое значение, мы получаем последнюю температуру и сохраняем ее в градусах Цельсия и Фаренгейта в переменной TemperatureString.

Затем, чтобы отправить строку TemperatureString через Bluetooth, используйте SerialBT.println() .

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

Итак, мы проверяем, есть ли данные в последовательном порту Bluetooth.

Если есть, мы сохраним символы в переменной incomingChar.

Если incomingChar отличается от \n , мы соединим этот символ char с нашим сообщением.

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

После этого у нас есть два оператора if для проверки содержимого сообщения. Если отображается сообщение led_on , светодиод загорается.

Если отображается сообщение led_off , светодиод выключается.

Тестирование проекта

Загрузите предыдущий скетч на плату ESP32. Затем откройте Serial Monitor и нажмите кнопку ESP32 Enable. Когда вы получите следующее сообщение, вы можете перейти к своему смартфону и подключиться к ESP32.

Затем вы можете написать сообщения "led_on" и "led_off" для управления светодиодом.

В приложении есть несколько кнопок, с помощью которых вы можете сохранять сообщения по умолчанию. Например, вы можете связать M1 с сообщением «led_on», а M2 — с сообщением «led_off».

Теперь вы можете управлять GPIO ESP32.

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

Подведение итогов

Подводя итог, можно сказать, что ESP32 поддерживает BLE и Bluetooth Classic. Использовать Bluetooth Classic так же просто, как использовать последовательную связь и ее функции.

Если вы хотите узнать, как использовать BLE с ESP32, вы можете прочитать наше руководство:

Мы надеемся, что это руководство оказалось для вас полезным. Чтобы узнать больше о проектах с ESP32, вы можете посмотреть подборку наших проектов: 20+ проектов и руководств по ESP32.

Это руководство является предварительным просмотром курса «Изучение ESP32 с Arduino IDE». Если вам нравится этот проект, обязательно загляните на страницу курса ESP32, где мы рассмотрим эту и многие другие темы, связанные с ESP32.

В этом руководстве мы узнаем о функции Bluetooth в ESP32. ESP32 поддерживает как классический Bluetooth v4.2, так и стандарты Bluetooth с низким энергопотреблением (BLE). Давайте сосредоточимся на классическом Bluetooth в этом руководстве по ESP32 Bluetooth. Мы узнаем немного об архитектуре Bluetooth в ESP32, о том, как настраивать, настраивать и запускать связь Bluetooth, а также о нескольких простых проектах, связанных с передачей данных между ESP32 и смартфоном через связь Bluetooth.[Проекты ESP32 для начинающих]

Краткое примечание о ESP32 Bluetooth

Bluetooth – это отличная технология беспроводной связи, которая пользуется популярностью уже несколько лет. Bluetooth работает в нелицензируемом диапазоне частот ISM (промышленный, научный и медицинский) 2,4 ГГц. Это технология беспроводной связи малого радиуса действия с радиусом действия до 100 м.

ESP32 SoC интегрирует как контроллер связи Bluetooth (или диспетчер связи), так и модуль основной полосы частот. Физически для правильной связи Bluetooth требуется только внешняя антенна.

Поскольку и Wi-Fi, и Bluetooth работают на одной и той же частоте ISM 2,4 ГГц, Wi-Fi Radio и Bluetooth Radio используют одну и ту же антенну в ESP32. Если вы посмотрите на распиновку SoC ESP32, то увидите только один контакт для подключения к антенне (LNA_IN).

ESP32 поддерживает как классический Bluetooth (Classic BT), так и Bluetooth с низким энергопотреблением (BLE), которые можно настроить с помощью стека Bluetooth BLUEDROID. ESP32 Bluetooth поддерживает три типа интерфейса хост-контроллера (HCI): интерфейсы UART, SPI и VHCI (виртуальный HCI) (одновременно может использоваться только один, а UART используется по умолчанию).

Начало работы с ESP32 Classic Bluetooth

Классический Bluetooth, также известный как Bluetooth Base Rate/Enhanced Data Rate, представляет собой оригинальную топологию сети "точка-точка", предназначенную для беспроводной связи "один-к-одному" между ведущим и ведомым устройствами. Несмотря на то, что несколько ведомых устройств могут быть подключены к одному ведущему устройству, только одно ведомое устройство может активно обмениваться данными с ведущим устройством. Наши Bluetooth-клавиатуры и мыши работают с классической технологией Bluetooth. Другим простым примером является передача файлов между двумя устройствами (например, двумя мобильными телефонами или ноутбуком и мобильным телефоном) по Bluetooth, основанная на классической функциональности Bluetooth.

С другой стороны, BLE или Bluetooth с низким энергопотреблением, как следует из названия, предназначены для работы с низким энергопотреблением и разрабатываются с приложениями IoT в качестве основной цели. Спецификация Bluetooth 4.0 добавила функциональность BLE и в основном используется в устройствах с батарейным питанием, таких как часы, аудиоустройства, трекеры здоровья, фитнес-мониторы и маяки данных.

Давайте сделаем еще одно руководство по ESP32 BLE и пока сосредоточимся на ESP32 Classic Bluetooth.

Стек BLUEDROID Bluetooth взаимодействует с контроллером Bluetooth через VHCI (интерфейс виртуального хост-контроллера) и в то же время предоставляет API для пользовательского приложения.

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

Ниже приведен список классических профилей и протоколов Bluetooth, поддерживаемых стеком Bluetooth BLUEDROID ESP32.

Классические профили Bluetooth

Классические протоколы Bluetooth

Связь между процессором ESP32 и контроллером Bluetooth основана на последовательном интерфейсе. Давайте узнаем больше о ESP32 Bluetooth, используя библиотеку BluetoothSerial для классического Bluetooth.

Классическая последовательная связь ESP32 Bluetooth

Если вы когда-либо работали с Arduino и любым устройством Bluetooth, таким как HC-05, то вы, возможно, помните, что Arduino UNO и HC-05 обмениваются данными через последовательную связь. ESP32, который уже имеет контроллер Bluetooth, также имеет аналогичную связь между основным процессором Xtensa и контроллером Bluetooth.

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

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

  • начать()
  • доступно()
  • написать()
  • прочитать()

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

Я перепробовал много последовательных приложений Bluetooth для Android, но в итоге остановился на Serial Bluetooth Terminal от Кая Морича. Вы можете скачать его по этой ссылке (или из Play Store).

Во-первых, давайте посмотрим на код, и в процессе мы сможем понять, как он работает. Код очень простой. Создайте объект класса «BluetoothSerial» и начните связь с помощью функции «begin()».

Вы можете передать имя Bluetooth-устройства ESP32 в качестве аргумента функции begin(). Если вы оставите это поле пустым, то будет использоваться имя по умолчанию, т. е. ESP32. Также инициализируйте обычную последовательную связь со скоростью 115 200 бод.

Затем в циклической функции прочитайте данные из BluetoothSerial и распечатайте их на Serial Monitor, а затем прочитайте данные из Serial Monitor и запишите их в BluetoothSerial.

Когда мы записываем данные в BluetoothSerial, приложение Bluetooth Terminal на телефоне получает данные и распечатывает их в приложении. Когда вы вводите данные в приложение и отправляете их по Bluetooth, BluetoothSerial считывает эти данные и печатает их на Serial Monitor.

Загрузка кода и тестирование

После загрузки кода в ESP32, если вы откроете последовательный монитор Arduino IDE, вы увидите, что ESP32 печатает некоторую информацию о Bluetooth. Кроме того, он отображает сообщение «готово».

Теперь включите Bluetooth на своем смартфоне и найдите устройства Bluetooth. Вы должны увидеть список «Сопряженные устройства» и «Доступные устройства», а из доступных устройств выберите «ESP32».

Ваш мобильный спросит, хотите ли вы выполнить сопряжение с «ESP32», и вы выберете «да» (или «ОК»). Пароля нет. Теперь откройте на своем телефоне приложение Serial Bluetooth Terminal и нажмите на три горизонтальные полосы в левом верхнем углу экрана.

Перейдите на вкладку "Устройства" и выберите ESP32 из списка.

Теперь нажмите значок ссылки вверху, чтобы подключиться к Bluetooth-устройству ESP32. Приложение будет отображать статус «Подключение к ESP32…» при установлении подключения, а если подключение выполнено успешно, оно будет отображать «Подключено».

Ниже находится поле для ввода данных для передачи по Bluetooth. Введите что-нибудь и нажмите кнопку «Отправить». Отправленные данные возвращаются обратно в приложение. Эти данные отправляются в ESP32 через Bluetooth и принимаются функцией BluetoothSerial read().

Поскольку мы передаем эту информацию на последовательный порт, вы можете видеть данные, напечатанные на последовательном мониторе.

Аналогичным образом вы можете отправлять данные с ESP32 на мобильный телефон. Просто введите некоторые данные в последовательный монитор и нажмите «Отправить». Эти данные передаются по Bluetooth на мобильный телефон с помощью функции BluetoothSerial write().

Приложение последовательного терминала Bluetooth прочитает эти данные и распечатает их в приложении.

Светодиод, управляемый Bluetooth с помощью ESP32

Используя приведенное выше приложение, мы можем немного изменить код и реализовать светодиод, управляемый Bluetooth, с помощью ESP32. Цель этого проекта — увидеть, насколько легко управлять контактами GPIO ESP32, отправляя и интерпретируя данные по Bluetooth.

Для простоты давайте передадим «1» и «0» из приложения для мобильного телефона с помощью макроклавиш. Я присвоил «1» для M1 и «0» для M2. Вы можете сравнить полученные данные с символами «1» и «0» или их десятичным эквивалентом в ASCII, т. е. 49 и 48.

При получении «1» светодиод, подключенный к GPIO 2, загорится, а если получен «0», светодиод выключится.

Очевидно, что светодиод — это просто отображение того, что вывод GPIO включен и выключен. Вы можете улучшить это приложение, превратив его в управляемое через Bluetooth реле с помощью ESP32.

Заключение

Полное руководство для начинающих по Bluetooth-коммуникациям ESP32. Вы узнали некоторые важные основы связи Bluetooth в ESP32 SoC, как настроить классический Bluetooth в ESP32, передавать данные со смартфона на ESP32 с помощью Bluetooth и проект расширения под названием Bluetooth Controlled LED с использованием ESP32 (который можно легко изменить для управления реле). ).

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

Через некоторое время я нашел эти три:

"Последовательный Bluetooth-терминал" – это ориентированное на линию терминал/консольное приложение для микроконтроллеров, Arduino и других устройств с последовательным/UART-интерфейсом, подключенных с помощью преобразователя Bluetooth к последовательному порту к вашему устройству Android. Это приложение поддерживает различные версии Bluetooth: Bluetooth Classic Bluetoo…

"Последовательный USB-терминал" — это ориентированное на линию терминал/консольное приложение для микроконтроллеров, Arduino и других устройств с последовательным/UART-интерфейсом, подключенных к вашему устройству Android с помощью преобразователя USB-последовательный порт. Это приложение поддерживает преобразователи USB в последовательный порт на базе FTDI FT232, FT2232, . - Плодовитый…

"Последовательный USB-терминал" — это ориентированное на линию терминал/консольное приложение для микроконтроллеров, Arduino и других устройств с последовательным/UART-интерфейсом, подключенных к вашему устройству Android с помощью преобразователя USB-последовательный порт. Это приложение поддерживает преобразователи USB в последовательный порт на базе FTDI FT232, FT2232, . - Плодовитый…

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

Где ты - дроссельная заслонка

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

Интересно, какой

Ты много работаешь или почти не работаешь? – Аноним, 2022 г.

Общественное мнение во всей его красе.

Должен сказать, что настроения широкой публики в Китае безумны и временами выходят из-под контроля. Китай, в отличие от США, не славится свободой слова. Тем не менее, свобода все еще существует, пока их, конечно, не снесут. И с этой свободой мы также

Читайте также: