#36. GSM-модуль SIM800L. AT команды и отправка СМС

#36. GSM-модуль SIM800L. AT команды и отправка СМС Конструкторы

↑ передача пакета данных

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

struct TxPacket
{
	uint8_t StartByte;
	uint8_t Rc5System;
	uint8_t Rc5Command;
	uint8_t StopByte;
} TxPacket;

Где, есть стартовый и стоповый байт и информационная часть. Мы уже инициализировали приемник USART.Для инициирования передачи пакета — вызываем функцию

void send_packet()
{
	// Запись стартового байта в регистр UDR
	UDR = START_BYTE;
}

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

Далее, когда передатчик USART отправит весь байт из регистра UDR — будет вызван обработчик прерывания по передаче.

ISR(USART_TXC_vect)
{
	unsigned char *Pointer = (unsigned char *)&(TxPacket);

	static unsigned char TxIndex = 1;

	if ( TxIndex < sizeof(TxPacket) )
	{
		UDR = *(Pointer   TxIndex);
		TxIndex  ;
	}
	else TxIndex = 1;
}

В обработчике я объявляю переменную указателя и присваиваю её адрес структуры TxPacket. Далее объявляется статическая переменная — индекс передаваемого байта, которой при объявлении присвоено значение 1. Начинаем с одного потому, что первый байт из структуры мы уже отправили.

Условие

if ( TxIndex < sizeof(TxPacket) )

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

UDR = *(Pointer   TxIndex);

инкрементируем TxIndex. Когда USART передаст очередной байт, то мы снова попадём в обработчик, но будет передан уже следующий байт из структуры и так будут переданы все байты структуры. Когда TxIndex будет больше чем размер структуры — условие будет не верно и мы попадем в 

else TxIndex = 1;

Где будет проинициализирован TxIndex, но в регистр UDR уже ничего не записывается, соответственно обработчик больше не будет вызван до следующего инициирования передачи пакета. Таким образом, процесс передачи полностью автоматический, и даже, если мы изменим структуру пакета, то обработчик переписывать не придётся.

В рамках описания программы МК осталось рассказать про реализацию управления драйверами. Драйвер управляется тремя сигналами: A1 (B1), A2 (B2) и PWMA (PWMB). A1 и A2 предназначены для включения/выключения драйвера и для изменения полярности выхода. На вход PWMA подается ШИМ сигнал с МК — можно управлять скоростью вращения. Для ШИМ сигнала я задействовал два аппаратных ШИМа таймера 1.

#define _WGM13 0
#define _WGM12 1
#define _WGM11 0
#define _WGM10 1

// Timer 1 init
TCCR1A = ( 1 << COM1A1 ) | ( 0 << COM1A0 ) | ( 1 << COM1B1 ) |
 ( 0 << COM1B0 ) | ( _WGM11 << WGM11 ) | ( _WGM10 << WGM10 );
TCCR1B = ( 0 << CS12 ) | ( 0 << CS11 ) | ( 1 << CS10 ) |
			 ( _WGM13 << WGM13 ) | ( _WGM12 << WGM12 );

	TCNT1 =0x0000;
	OCR1A = 0;
	OCR1B = 0;

Во-первых, это пошло от программы под Андроид. Дело в том что в Java нет без знаковых типов и я уже наступал на эти грабли. И для передачи числа от 0 до 255 мне пришлось бы как то извернуться. Я решил пойти более простым путем — отсылаю знаковое 16-бит число. При этом, 16 бит знакового типа это от -32786 до 32768, нам хватит.

Во-вторых, так на мой взгляд более прозрачно — скорость вращения и направления описывается всего одной переменной.

И в-третьих, как не крути, для наших целей меньше чем в три байта не уложиться. Пожертвуем еще одним байтом, зато всё становится понятно, положительное значение ШИМ — прямое вращение, отрицательное значение — обратное вращение.

Для управления приводами я написал функцию drive (int leftPWM, int rightPWM);.

void drive(int leftPWM, int rightPWM)
{
	// Движение ВПЕРЁД левое колесо
	if ( leftPWM > 0 ){
		ClearBit( A2_PORT, A2_PIN );
		SetBit( A1_PORT, A1_PIN );
	}
	// Движение НАЗАД левое колесо
	if ( leftPWM < 0 ){
		ClearBit( A1_PORT, A1_PIN );
		SetBit( A2_PORT, A2_PIN );
	}
	// Движение ВПЕРЁД правое колесо
	if ( rightPWM > 0 ){
		ClearBit( B2_PORT, B2_PIN );
		SetBit( B1_PORT, B1_PIN );
	}
	// Движение НАЗАД правое колесо
	if ( rightPWM < 0 ){
		ClearBit( B1_PORT, B1_PIN );
		SetBit( B2_PORT, B2_PIN );
	}
	// Остановка
	if ( leftPWM == 0 ){
		ClearBit( A1_PORT, A1_PIN );
		ClearBit( A2_PORT, A2_PIN );
	}
	// Остановка
	if ( rightPWM == 0 ){
		ClearBit( B1_PORT, B1_PIN );
		ClearBit( B2_PORT, B2_PIN );
	}

	set_PWM( (uint8_t)(abs(leftPWM)), (uint8_t)(abs(rightPWM)) );
}

В соответствии со значением ШИМ, осуществляется управление сигналами A1 (B1), A2 (B2) и устанавливается значение ШИМ вызовом функции
set_PWM (leftPWM, rightPWM)

Уфф, выдохся… Подытожим: приняли пакет, разобрали, передали значение ШИМ в функцию drive.

Gsm модем sim800l v2.0 первый взгляд

«Мне надо дистанционно открывать дверь. Вернее, отключать магнит, который держит дверь…» Вот такая неожиданная просьба, причем речь изначально шла о gsm модеме, не то чтобы я знал все подробности, но на вопрос как сделать простейший выключатель решил ответить обзором. Буквально 5-7 строчек кода и все дела.

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

Чем примечательна именно данная версия модема:

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

2. Отличная внешняя антенна

3. Маленькие размеры 40х28 мм

4. Отверстия под крепление!!! Не всегда и не везде их делают

5. Антенну будет очень удобно крепить в корпус, судите сами, разъем крепим на корпусе, на него навинчиваем антенну, не обязательно штатную, и проводом подключаем модем.

#36. GSM-модуль SIM800L. AT команды и отправка СМС

По конструктиву все, дальше я это чудо загуглил на предмет кто-что с ним делал и скачал библиотеку SIM908IDE100, которая мне понравилась, но справедливости ради должен отметить, что она единственная которую я смотрел.
Подключение:
5В модуля на 5В ардуино
GND на GND
TXD на 2 вывод ардуино
RXD на 3 вывод ардуино
VDD не задействован
RST не задействован

После подключения библиотеки открыл пример:
#36. GSM-модуль SIM800L. AT команды и отправка СМС
Собрал все воедино и прошил
#36. GSM-модуль SIM800L. AT команды и отправка СМС
Вот пара моментов, на которые можно обратить внимание:
gsm.readSMS(smsbuffer, 160, n, 20)
smsbuffer — массив символов формата char с смс сообщением
n — номер телефона
соответственно, чтобы не выводить свой номер телефона в терминал я закомментировал строку // Serial.println(n);
Если модем поймал сеть, то светодиодный индикатор на модеме мигает примерно раз в 3 секунды, на после прошивки в терминале вы увидите надпись status=READY
Далее я отправил на номер сим карты в модеме (кстати не забудьте ее поставить!) смс с текстом «Hello»
#36. GSM-модуль SIM800L. AT команды и отправка СМС
Попробовал раскомментировать следующие строки, вбил свой номер и отправил смс уже себе на телефон
#36. GSM-модуль SIM800L. AT команды и отправка СМС
Одним словом все работает замечательно, теперь к открытию двери путем отправки смс. Собственно ничего сложного, для проверки будем использовать светодиод на 13 контакте ардуино (будем им мигать через смс) и добавляем пару строчек кода.

Что добавится к примеру:

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

void setup() 
{
                pinMode(13, OUTPUT);//Вывод, на котором установлен диод
                digitalWrite(13, LOW);  //Выключаем диод
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("nstatus=READY");
    started=true;  
  }
  else Serial.println("nstatus=IDLE");
  
  if(started){
    //Enable this two lines if you want to send an SMS.
    //if (sms.SendSMS("3471234567", "Arduino SMS"))
      //Serial.println("nSMS sent OK");
  }

};

void loop() 
{
  if(started){
    //Read if there are messages on SIM card and print them.
    if(gsm.readSMS(smsbuffer, 160, n, 20))
    {
      //Serial.println(n);
         Serial.println(smsbuffer);
         if (smsbuffer[0]=='f')       //если первая буква смс f
         {digitalWrite(13, LOW);} //выключаем диод
        if (smsbuffer[0]=='o')       //если первая буква смс o
         {digitalWrite(13, HIGH);}//включаем диод
//туда можно написать любой симфол на латиннице, с русским шрифтом не дружит   
 }
    delay(1000);
  }
};

Попробовал — все отлично работает, позже подключил реле на 13 вывод ардуино — все отлично переключается

#36. GSM-модуль SIM800L. AT команды и отправка СМС

Но для обзора это как-то хреновенько, да и сомневаюсь я, что человек будет рад отправлять по одной букве, а вот сообщения типа on-off подошли бы как нельзя лучше

Код примитивный, но рабочий

Не спешите кидать тапки, потом я спросил у программиста КАК?! сделать лучше.

#include "SIM900.h"
#include <SoftwareSerial.h>

#include "sms.h"
SMSGSM sms;

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
        char mes1[2]={'O','n'};    //сообщения, которые ждем
        char mes2[3]={'O','f','f'};
void setup() 
{
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("nstatus=READY");
    started=true;  
  }
  else Serial.println("nstatus=IDLE");
  
  if(started){
  }

};

void loop() 
{
  if(started){
    //Read if there are messages on SIM card and print them.
    if(gsm.readSMS(smsbuffer, 160, n, 20))
    {
      Serial.println(smsbuffer);
             int b=0;
             int c=0;
             for (int i=0;i<2;i  )
      {
      if (smsbuffer[i]==mes1[i])
      {b  ;}
      if(b==2){digitalWrite(13, HIGH);}
      }
            for (int i=0;i<3;i  )
      {
      if (smsbuffer[i]==mes2[i])
      {c  ;}
      if(c==3){digitalWrite(13, LOW);}
      }
    }
    delay(1000);
  }
};

Код как он должен быть


Это последняя эволюция кода с подключением библиотеки string.h
#include <string.h>

#include "SIM900.h"
#include <SoftwareSerial.h>

#include "sms.h"
SMSGSM sms;

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
char mes1[]="Onr";    //сообщения, которые ждем
char mes2[]="Offr";
void setup() 
{
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("nstatus=READY");
    started=true;  
  }
  else Serial.println("nstatus=IDLE");
  
  if(started){
  }

};

void loop() 
{
  if(started){
    //Read if there are messages on SIM card and print them.
    if(gsm.readSMS(smsbuffer, 160, n, 20))
    {
      Serial.println(smsbuffer);
      if(strcmp(smsbuffer, mes1) == 0){
          digitalWrite(13, HIGH);
      }
      if(strcmp(smsbuffer, mes2) == 0){
          digitalWrite(13, LOW);
      }
    }
    delay(1000);
  }
};

Принципиальная разница между первым и вторым вариантом в том, что после консультации со знающим человеком наступает просветление))) А если по нормальному, то смс заканчивается символом /r, я этого естественно не знал, поэтому сравнивал только 2 или 3 символа массива, остальная часть не учитывалась. Т.е. если послать Onnnn и On — результат будет идентичный, в последней версии этого недостатка нет.

В зависимости от того что спросившему человеку нужно, можно сделать список команд, например отключить на 10 секунд замок, отключить до следующей команды и т.д… Ну и можно сделать на 3d принтере корпус для всего этого, а питать лучше от сети к которой подключен электрический замок.
P.S. Модем мне понравился, все его плюсы относительно его собратьев я перечислил выше. я надеюсь мой опыт вам пригодится.

Vikefon

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

Vikefon nfc bt-b21 / bt-b22

Самая продвинутая модель и самая дальнобойная за счет двух антенн. Да, стоит она дороже, но и функционал выше. Поддержка Блютуз пятого поколения с чипом CSR8675. Поддержка протоколов AptX HD и AptX, которые улучшают связь и качество звука. Аккумуляторная батарея позволяет входить в режим ожидания, когда вы не пользуетесь аппаратом, что увеличивает время работы до 20 часов. Есть поддержка двойного потока – поэтому вы можете подключить сразу две гарнитуры. Упрощенный режим сопряжения с телефоном по NFC.

Смотрите про коптеры:  Радиоуправление кран-балкой и мостовым краном - примущества, работа, нюансы дистанционного управления » Школа для электрика: электротехника и электроника

Итог

Как вы видите, они примерно все одинаковые. Для телевизора я бы, конечно, взял без аккумулятора, так как он по сути и не нужен – если данный передатчик/приёмник будет находиться вблизи экрана.

Также следует обращать внимание на поддержку Dual Link – эта технология позволяет подключать несколько наушников и даже беспроводные колонки. Версия «Голубого зуба» тоже не маловажная вещь. От неё будет зависеть максимальная скорость передачи информации и радиус покрытия в квартире или доме.

ВНИМАНИЕ! При выборе смотрите не перепутайте этот передатчик с HDMI или USB Wi-Fi модулем – они немного похожи, но имеют разное назначение. Лучше в магазине несколько раз переспросить – что и для чего вам нужно.

Инструкция по подключению

Все достаточно просто. Какие порты сзади телевизора предназначены для вывода аудио-сигнала – мы уже разобрались. Если вы купили адаптер, который поддерживает только подключение по 3.5 разъёму, то такие модули имеют в комплектации не отсоединяемый проводок. Просто воткните его в разъём для телевизора. А для питания вставьте флэшку в любой USB порт.

Bluetooth передатчик для телевизора: как выбрать и подключить

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

Bluetooth передатчик для телевизора: как выбрать и подключить

Второй конец от каждого провода втыкаем в соответствующий разъём на телевизоре. После этого проверяем подключение. Включите ваши наушники и нажмите на них кнопку сопряжения. Обычно имеет значок угловатой буквы «B». Зажимаем кнопку, пока не загорится синий цвет.

Bluetooth передатчик для телевизора: как выбрать и подключить

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

Вывод

В следующей раз, когда будете брать телевизор, постарайтесь брать его сразу со встроенным Bluetooth модулем, чтобы в дальнейшем не пришлось мучиться как мне. Так же не забываем и о Wi-Fi передатчике, который позволяет подключать свой телевизор к вашей домашней сети, выходить в интернет и смотреть сериалы прям с Web-страниц сайтов. Но это уже совсем другая история.

Обзор популярных моделей

Рынок богат самыми разнообразными Bluetooth адаптерами. Они отличаются внешним видом, техническими характеристиками, способом подключения, ценой, а главное — качеством передачи сигнала.

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

Популярные модели блютуз адаптеров:

  1. TREND-net-TBW-106 UB. Компактный девайс Блютуз 2.1 с большим радиусом действия — до 100 м. Предельная скорость — 3 Мбит / с. Подключение — USB 2.0. Цена — от 870 руб.
    TREND net TBW-106 UB
  2. Gembird BTD-MINI 1. Высокомощное устройство Блютуз 2.0. Скорость — до 3 Мбит / с. Действует на расстоянии 20 м. Подключается через разъём USB 2.0. Цена — от 410 руб.
    Gembird BTD-MINI 1
  3. TREND net TBW-107 UB. Миниатюрное устройство, к которому можно одновременно подключать несколько устройств. Поколение — Блютуз 2.1. Максимальный радиус действия — 10 м. Подключение — USB 2.0. Скорость — 3 Мбит / с. Цена — от 780 руб.
    TREND net TBW-107 UB
  4. ASUS USB-BT 400. Небольшой девайс, совместимый с разными устройствами и операционными системами. Беспроводная связь Блютуз 4.0. Действует на расстоянии — до 10 м. Скорость — 3 Мбит / с. Подключается через разъём USB 2.0. Цена — от 850 руб.
    ASUS USB-BT 400
  5. HAMA H-49238. Устройство отличается большим радиусом действия (100 м), высокой мощностью, имеет led-индикатор. Поколение — Блютуз 3.0. Подключается через USB 2.0. Скорость — 3 Мбит / с. Цена — от 1 000 руб.
    HAMA H-49238
  6. Espada ES-M 03. Недорогая модель с неплохой дальностью действия (30 м) и простой установкой. Поколение — Блютуз 2.0. Подключение — USB 2.0. Скорость — 3 Мбит / с. Цена — от 400 руб.
    Espada ES-M 03
  7. Mobile data UBT-207. Работает без установки драйверов с разными операционными системами. Недорогой, но мощный. Поколение — Блютуз 2.0. Подключение — USB 2.0. Радиус действия — 20 м. Скорость — 3 Мбит / с. Цена — от 500 руб.
    Mobile data UBT-207
  8. HAMA H-49218. Устройство с доступной ценой и автоматической установкой драйверов. Отличается хорошей дальностью действия — 20 м. Поколение — Блютуз 4.0. Подключение — USB 2.0. Цена — от 600 руб.
    HAMA H-49218
  9. Bluetooth B6. Универсальная модель. Поддержка Bluetooth 2.1. Скорость — 3 Мбит / с. Питается от аккумулятора (8 часов). Имеется аудиовыход 3,5 мм и RCA. Цена — от 1 950 руб.
    Bluetooth B6
  10. BTR Bluetooth 5. Самая популярная модель. Поколение — Bluetooth 5.0. Может работать от аккумулятора или другого источника питания. Работает на расстоянии до 10 м. Подключение — Micro USB. Имеется аудио-порт 3,5 мм. Цена — от 442 руб.
    BTR Bluetooth 5

Отключение функции энергосбережения bluetooth

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

  1. Подключите беспроводную мышь, клавиатуру или другое устройство.
  2. Нажмите Win R, ведите команду devmgmt.msc и нажмите Enter.
    bluetooth_device_disconnecting1
  3. Отыщите в списке и разверните категорию Bluetooth. Кликните по драйверу сетевого адаптера правой клавишей мыши и выберите пункт Свойства.
    bluetooth_device_disconnecting4
  4. Перейдите во вкладку Управление электропитанием. Снимите галочку Разрешить отключение этого устройства для экономии энергии и нажмите ОК.
    bluetooth_device_disconnecting5
  5. Разверните категорию Устройства HID (Human Interface Devices). Найдите в списке драйвер, в названии которого содержится Bluetooth (оно может отличаться в зависимости от беспроводного аксессуара). В случае с мышью Microsoft Arc Touch BT этот драйвер называется HID-устройство, соответствующее GATT Bluetooth с низким энергопотреблением. В списке может присутствовать несколько названий, включающих Bluetooth. В таком случае вам необходимо будет выполнить описываемые операции со всеми подобными драйверами.
    bluetooth_device_disconnecting6
  6. Кликните по указанному драйверу правой клавишей мыши и выберите пункт Свойства.
  7. Перейдите во вкладку Управление электропитанием.
  8. Снимите галочку Разрешить отключение этого устройства для экономии энергии и нажмите ОК.

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

Подробный список at команд приведен в таблице ниже.

Описание
Команда
Структура ответа
Пример ответа
Готовность модуля к работеATOKOK
Запрос информации об устройствеATI<info>
OK

<info> — модель и версия модуля
SIM800 R14.18

OK

Запрос версии установленного ПОAT CGMR<revision>
OK

<revision> — модель и версия ПО
Revision:1418B04SIM800L24

OK

Готовность модуля совершать звонкиAT CCALR? CCALR: <mode>
OK

<mode> — идентификатор готовности:

— модуль не готов совершать звонки
1 — модуль готов совершать звонки

CCALR: 1

OK

Запрос качества связиAT CSQ CSQ: <rssi>,<ber>
OK

<rssi> — качество сигнала (от 10 и выше — нормальное):

-115 дБм и меньше
1 -111 дБм
2…30 -110… -54 дБм
31 -52 дБм и больше
99 определить невозможно

<ber> — RXQUAL (мера качества сигнала), значение из таблицы GSM 05.08 — ETSI:

0…7 — коэффициент битовых ошибок (меньше — лучше)
99 определить невозможно

CSQ: 8,0

OK

Запрос IMEI-модуляAT GSN<sn>
OK

<sn> — IMEI модуля
864713035030892

OK

Запрос идентификационной информации модуляAT GSVТекстовая информация о модулеSIMCOM_Ltd
SIMCOM_SIM800L
Revision:1418B04SIM800L24

OK

Напряжение питанияAT CBC CBC: <bcs>,<bcl>,<voltage>
OK

<bcs> — статус зарядки

— зарядки нет
1 — зарядка идет
2 — зарядка завершена

<bcl> — объем оставшегося заряда в процентах (1…100)
<voltage> — напряжение питания модуля, в милливольтах

CBC: 0,73,3988

OK

Тип регистрации в сетиAT CREG? CREG: <n>,<stat>
OK

<n> — параметр ответа

— незапрашиваемый код регистрации в сети отключен
1 — незапрашиваемый код регистрации в сети включен
2 — незапрашиваемый код регистрации в сети включен с информацией о местоположении

<stat> — статус

— незарегистрирован, не ищет нового оператора для регистрации
1 — зарегистрирован в домашней сети
2 — незарегистрирован, но в поиске нового оператора для регистрации
3 — регистрация запрещена
4 — неизвестно
5 — зарегистрирован, в роуминге

CREG: 0,1

OK

Информация об оператореAT COPS? COPS: <mode>,[<format>,<oper>]
OK

<mode> — режим регистрации
<format> — формат отображения
<oper> — наименование оператора в заданном формате
COPS: 0,0,”MegaFon”

OK

Получение списка всех операторовAT COPN COPN: <numeric1>,<alpha1>
[<CR><LF> COPN: <numeric2>,<alpha2>
[…]]

OK
<numeric n> — цифровой код оператора
<alpha n> — текстовый код оператора

COPN: “24008”,”vodafone”
COPN: “24010”,”Swefour AB”
COPN: “24201”,”TELENOR”
COPN: “24202”,”NetCom”
COPN: “24403”,”FINNET”
COPN: “24405”,”Elisa Corporation”
COPN: “24409”,”FINNET”

OK

Статус телефона GSM-модуляAT CPAS CPAS: <pas>
OK

<pas> — статус

— готов к выполнению команд из терминала
2 — неизвестно (исполнение команд не гарантируется)
3 — входящий вызов, но модуль готов к выполнению команд
4 — исходящий вызов, но модуль готов к выполнению команд

CPAS: 4

OK

Программная часть


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

Используемые в моем случае счетчики ВСХд-15 и ВСГд-15 формируют один импульс (замыкание размыкание геркона) на 1 л воды, при этом время замкнутого и разомкнутого состояний геркона за период примерно равны (полезный

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

— подключаем выходы со счетчиков между двумя цифровыми пинами МК и землей;

— объявляем пины как выходы;

далее в цикле:

— подтягиваем пины к шине питания командой digitalWrite(pin, HIGH) через встроенный в Atmega168 резистор 20 кОм;

— опрашиваем состояние пинов и фиксируем изменения;

— убираем подтяжку digitalWrite(pin, LOW);

— загоняем МК в сон на 500 мс

повтор цикла.

Т.е. подтяжка выходов счетчиков происходит непосредственно перед измерением на короткое время, что сильно экономит батарею.

Максимальная пропускная способность счетчика по паспорту 1л/с. То есть паузы в 500 мс как раз достаточно, чтобы не пропустить изменения состояния геркона.

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

Скетч


#include <EEPROM.h> // Стандартная библиотека для записи в энергонезависимую память
#include <SoftwareSerial.h> // Стандартная библиотека для виртуального последовательного порта
#include <LowPower.h> // Библиотека для эффективного засыпания - https://github.com/rocketscream/Low-Power

SoftwareSerial SIM800(18, 19); // Виртуальные RX, TX

#define timer 1121400 // 7*24*6675 tick/hour - через сколько тиков по ~0,5с отправлять смс

boolean hotPrev; // Переменные
boolean coldPrev;
unsigned long ticks = 0;
float hot, cold;

void setup() {
//  delay(10000); // Необходама однократная прошивка начальных значений счетчиков перед установкой
//  EEPROM.put(0, 32.385);
//  EEPROM.put(20, 47.8910);

  EEPROM.get(0, hot);
  EEPROM.get(20, cold);

  pinMode(2, INPUT); // Вход с геркона счетчика ГВС
  pinMode(3, INPUT); // Вход с геркона счетчика ХВС
  pinMode(4, OUTPUT); // Управление транзистором, через который подключен GSM модуль

  digitalWrite(2, HIGH); // Определяем начальное состояние счетчика ГВС
  hotPrev = digitalRead(2);
  digitalWrite(2, LOW);

  digitalWrite(3, HIGH); // Определяем начальное состояние счетчика ХВС
  coldPrev = digitalRead(3);
  digitalWrite(3, LOW);

  for (int i=0; i<3000; i  ){
    checkCounter();
  }

  sendSMS(); // Отправка тестового СМС
}

void loop() {
  checkCounter(); // Запускаем функцию опроса герконов счетчика
  ticks  ; // Тикаем один раз
  if (ticks > timer) { // Если кол-во тиков превысило заданное, обнуляем счетчик, записываем данные в EEPROM и шлем смс
    ticks = 0;
    sendSMS();
  }
}

void checkCounter() { //Функция опроса счетчиков

  digitalWrite(2, HIGH); //Подтягивем пин 2 к Vcc через встроенный в МК резистор 20кОм
  if (digitalRead(2) != hotPrev) { // Проверяем не изменилось ли состояние пина, если да, то:
    hot = hot   0.0005; // -накидываем поллитруху
    hotPrev = !hotPrev; // -инвертируем переменную
  }
  digitalWrite(2, LOW); // Отключаем подтяжку к Vcc (если этого не зделать, то МК будет жрать повышенный ток 4,2В/20кОм = 210мкА! с пина 2 и столько же с пина 3)

  digitalWrite(3, HIGH); // Все аналогично счетчику ГВС
  if (digitalRead(3) != coldPrev) {
    cold = cold   0.0005;
    coldPrev = !coldPrev;
  }
  digitalWrite(3, LOW);

  LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); // Засыпаем на 0,5с
}

void sendSMS() { // Функция отправки смс
  
  EEPROM.put(0, hot);
  EEPROM.put(20, cold);
  
  float V = 0; // Переменная для напряжения питания
  for (int i = 0; i < 100; i  ) { // Сто раз считываем значение с пина A3 (который подключен к Vcc) и внутреннее опорное напряжение
    V = V   analogRead(A3) / readVcc(); // Суммируем
  }
  V = (V / 100) * 1.0656   0.1017; // Усредняем с учетом коэффициентов, откалиброванных при Vcc 3,0-4,2В

  digitalWrite(4, HIGH); // Включаем GSM модуль
  for (int i = 0; i < 100; i  ) checkCounter(); //Даем модулю 50 сек на установку связи, в это время опрашиваем счетчики
  SIM800.begin(9600); // Скорость обмена данными с модемом
  SIM800.flush(), checkCounter(); // Дожидаемся передачи команды по Serial и даем GSM модулю 0,5 с на выполнение команды (проверяем в это время счетчики)
  SIM800.println("AT"); // Автонастройка скорости
  SIM800.flush(), checkCounter();
  SIM800.println("AT CMGF=1"); // Включить TextMode для SMS
  SIM800.flush(), checkCounter();
  SIM800.println("AT CMGS=" 79854xxxx03""); // Номер, на который шлем смс
  SIM800.flush(), checkCounter();
  SIM800.println("C: "   String(cold, 3)   ", H: "   String(hot, 3)   ", V: "   String(V, 3)   "rn"   (String)((char)26)); // Строка смс сообщения: ХВС, ГВС, напряжение на батарее
  SIM800.flush();
  for (int i = 0; i < 60; i  ) checkCounter(); // Даем модулю 30 секунд на отправку смс, в это время опрашиваем счетчики
  SIM800.println("AT CPOWD=1"); // Команда выключения
  SIM800.flush();
  for (int i = 0; i < 10; i  ) checkCounter(); // 5 сек даем на отключение
  digitalWrite(4, LOW); // Обесточиваем GSM модуль
}

float readVcc() { // Функция, возвращающая внутреннее опорное напряжение МК
  float tmp = 0.0;
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2);
  ADCSRA |= _BV(ADSC);
  while (bit_is_set(ADCSRA, ADSC));
  uint8_t low = ADCL;
  uint8_t high = ADCH;
  tmp = (high << 8) | low;
  return tmp;
}

Я постарался максимально подробно закомментировать скетч. Помимо опроса счетчиков, в программе также реализовано измерение питающего напряжения и передача значения в СМС вместе с данными по расходу воды. Также непосредственно перед отправкой СМС текущие показания сохраняются в энергонезависимую память. Интервал отправки СМС в скетче — 1 неделя.

Итоговый вид устройства:
#36. GSM-модуль SIM800L. AT команды и отправка СМС
#36. GSM-модуль SIM800L. AT команды и отправка СМС

Радиокот :: радиоуправление моделью через bluetooth le

РадиоКот >Схемы >Цифровые устройства >Игрушки >

Радиоуправление моделью через Bluetooth LE

Система дистанционного управления, представленная в статье, предназначена для работы на небольших расстояниях – где-то до 30м в открытом пространстве. Основное её достоинство – малое токопотребление, что во многих случаях может быть решающим фактором. В данном случае управление производится моделью машинки, в которой имеется один мотор для движения вперёд-назад и один мотор для поворота передних колёс. Модель для опытов была приобретена в местном молле уже собранной и изначально оснащённой аналоговой системой радиоуправления на частоте 27 мгц. Оба мотора модели нормированы на рабочее напряжение 3В и в оригинальном исполнении питались от одного литиевого аккумулятора напряжением 3.6В. Само управление производилось джойстиками в передатчике без регулировки скорости движения. Нашей целью было переделать модель под управление её траекторией и скоростью путём наклона платы передатчика, положение которой в пространстве отслеживалось-бы с помощью акселерометра. В сети известны примеры проектов использования смартфона для подобного управления, такой проект имеется и у нас. Однако на этот раз нам хотелось сделать что-то ощутимо менее энерго-потребяющее на передающей стороне. Это был первый обучающий BLE проект моего студента Нэйсена.

Ограничение на радиус действия управления связано прежде всего с использованием протокола BLE (Bluetooth Low Energy), который разработан преимущественно для небольших расстояний. Нами были использованы радиомодули семейства EZ-BLE фирмы Cypress с максимальной выходной мощностью 3dBm (2mW). Эти модули очень просты и удобны в программировании при использовании системы PSoC Creator. Про подобные модули у меня есть пара статей, см. [1] и ссылки в ней. Применённые в нашем проекте модули весьма просто паяются любым паяльником на плату благодаря большому шагу выводов (1.5мм) и наличию контактных площадок на рёбрах их плат. Данная модель модулей выпускается в двух модификациях – с установленным на плате экраном и без него. Отличие этих модификаций главным образом в наличиии сертификации и в цене. Мы использовали более дешёвые и несертифицированные модули без экранов, которые вполне пригодны для домашних поделок. Микроконтроллер модулей оснащён всей стандартной периферией, типичной для микроконтроллеров сегодня, так что вся система может быть собрана на основе одного лишь модуля. Микроконтроллер выполнен по архитектуре ARM Cortex-M0 с максимальной частотой тактирования 48 мгц от внутреннего генератора. На плате модуля установлен кварц на частоту 24 мгц для тактирования радио-тракта, а также часовой кварц для прецезионного формирования временных интервалов при работе стека протокола. В целях снижения токопотребления мы тактируем нижние уровни стека BLE на частоте 3 мгц от кварцевого генератора, а всё остальное приложение на частоте 6 мгц.

Приёмник

Схема приёмника чрезвычайно проста. Помимо радио-модуля IC1 она включает разъём для его программирования, драйвер моторов на микросхеме IC2, светодиод для индикации состояния программы приложения (см. ниже) и стабилизатор напряжения IC3. Для питания схемы решено было использовать 4 пальчиковые батареи типоразмера АА, так что напряжение на них не опускается ниже 4В при разрядке в процессе работы системы.

#36. GSM-модуль SIM800L. AT команды и отправка СМС

Применённый драйвер IC2 идеально подходит для управления небольшими моторами с потреблением до 1А. Он выполнен по КМОП технологии с малым падением напряжения на транзисторах выходного каскада, что предотвращает нагрев корпуса микросхемы даже при работе с максимальмым током. Нами использован вариант драйвера в корпусе с металлизированной подложкой, которая после припаивания к плате позволяет использовать фольгу на последней в качестве теплоотвода. Однако, эта мера предосторожности для трёх-вольтовых моторов модели оказалась совершенно излишней и подложку можно было-бы вообще не припаивать к плате, или даже использовать вариант корпуса без подложки. Четыре управляющих сигнала драйвера разбиты на 2 пары. В каждой паре один из сигналов используется для подачи из модуля ШИМ на соответствующий мотор, а второй для управления направлением его вращения. ШИМ для мотора поворота колёс предполагалось использовать для снижения эффективного напряжения на нём.

Внутри PSoC задействованы 3 модуля. Модуль PWM формирует ШИМ для управления моторами. В результате экспериментов была выбрана частота ШИМ в 2 мгц / 127 = 15.7 кгц при 7-битном разрешении. Разрешение выбрано из соображений посылки лишь одного байта для управления скоростью, положительное значение которого соответствует движению модели вперёд, а отрицательное – назад. При этом используются лишь 3 фиксированные скорости: малая, средняя, и большая. Как оказалось, в модели использована дешёвая коробка передач с пластиковыми шестерёнками без нормальных подшипников и с огромными потерями, а также весьма неэффективные моторы. Из-за увеличенного четырьмя батареями веса модели при очень малой скорости вращения колёс в воздухе она не могла тронуться с места после установки на пол. Поэтому и было принято решение насчёт трёх дискретных скоростей, так что даже на минимальной скорости моторы развивают достаточный момент для начального старта модели. Вот как выглядит соединение модулей PSoC в графическом конфигураторе ресурсов. Выводы A1 и B2 для изменения направления вращения моторов управляются непосредственно из программы.

#36. GSM-модуль SIM800L. AT команды и отправка СМС

Нижний на схеме модуль ШИМ предназначен для управления частотой мигания светодиода. Светодиод использовался преимущественно в режиме отладки для индикации различных фаз установки соединения с передатчиком путём изменения частоты его мигания. При этом постоянное его свечение соответствует успешному завершению процесса соединения. Однако, в конечном варианте соединение устанавливается в доли секунды после включения передатчика, так что светодиод практически сразу переходит к постоянному свечению.

Сердцем приёмника является модуль BLE в PSoC. Он сконфигурирован на GAP роль периферийного устройства с реализацией проприетарного GATT профиля (custom profile), и выступает в роли сервера. В профиле помимо стандартных сервисов Generic Access и Generic Attribute, регламентируемых BLE SIG, имеется и проприетарный сервис Car Control, включающий 3 характеристики Turn, Speed, и Control для управления поворотами и скоростью модели. Следует отметить, что наш проект отличается от опубликованного в [2], где GAP роли приёмника и передатчика противоположны нашим. Это сделано намеренно, чтобы Nathan глубже проникся миром BLE. Соответственно, заново разработана логика работы программ приёмника и передатчика и логика их взаимодействия со стеком BLE.

Приём команд передатчика, именно записи новых значений в характеристики профиля, реализован на основе обслуживания прерываний стека BLE в обрабочике GeneralEventHandler. При этом обрабатываются 4 события. Событие CYBLE_EVT_STACK_ON генерируется по завершении инициализации стека и используется для начала посылки advetisement с идентификатором приёмника, используемым для соединения его с передатчиком. В качестве идентификатора используется уникальный 48-битный код, зашитый в модуль на фабрике. Его можно изменить при необходимости, но мы это не делали. Следующие 2 события CYBLE_EVT_GAP_DEVICE_CONNECTED и CYBLE_EVT_GAP_DEVICE_DISCONNECTED генерируются стеком после установки соединения с передатчиком и при разъединении с ним. В первом случае мы просто конфигурируем светодиод на постоянное свечение, а во втором останавливаем модель и возобновляем посылку advetisement, предоставляя тем самым передатчику возможность возобновления соединения. Светодиод при отсутствии соединения с передатчиком начинает мигать с периодом 1 сек.

Наконец, главное для логики работы приложения событие CYBLE_EVT_GATTS_WRITE_REQ генерируется стеком при приёме команды записи значения характеристики в базу данных сервера. При этом мы проверяем какую именно характеристику следует изменить, посылаем подтверждение приёма команды в передатчик, и вызываем соответствующую функцию Set_Turn() и/или Set_Speed() для выполнения команды путём манипуляции сигналов на входах IC2.

В данной реализации протокола связи соединение с передатчиком происходит каждые 100 миллисекунд. В промежутках между соединениями система погружается в сон с потреблением 4.7 мА при неработающих моторах. Из этого потребления около 1.3 мА приходится на светодиод. Из-за необходимости постоянной генерации ШИМ для моторов не представляется возможным погрузить PSoC в глубокий сон во время движения модели, т.к. при этом останавливаются все генераторы и прекращается работа ШИМ. Потребление можно снизить примерно в 3 раза если отключать генерацию ШИМ при остановке модели и погружать систему в глубой сон.

Приёмник собран на односторонней печатной плате размером 37×26 мм, приклеенной на отрезок пластиковой упаковки, который в свою очередь приклеен к шасси модели. Батарейный отсек размещён в центральной части модели. Несмотря на фиксацию батарей крышкой корпуса отсека, при столкновении модели с препятствием или даже движении по шероховатой поверхности иногда возникает потеря контакта в пружинном держателе батарей, что приводит к кратковременной потере соединения с передатчиком и миганию светодиода на плате. Недаром в оригинальном исполнении в модели использовался аккумулятор с проволочными выводами, припаянными к плате.

Передатчик

Помимо радио-модуля, такого-же как в приёмнике, передатчик содержит 3-осный аналоговый акселерометр IC2 и светодиод для индикации наличия соединения с моделью. Конденсаторы C2-C4 наряду с резисторами внутри IC2 образуют ФНЧ для фильтрации шумов на выходе аналоговой части акселерометра. Измерение его сигналов на выходах X, Y, Z производится 12-битным АЦП в составе PSoC. Измерение производится каждые 100 миллисекунд в соответствии с периодом соединения с моделью. Временной интервал измерения параметров обеспечивается Watchdog-ом в PSoC, тактируемым от часового кристалла на плате модуля.

#36. GSM-модуль SIM800L. AT команды и отправка СМС АЦП сконфигурирован на недефференциальное включение. Начало процесса измерения сигналов акселерометра производится программно. АЦП тактируется от своего генератора на частоте 6 мгц, так что измерение данных со всех трёх осей акселерометра производится за 36 микросекунд, включая усреднение четырёх измерений по каждой оси. Поворот модели осуществляется наклоном платы передатчика вправо и влево на угол превосходящий примерно 30°. Этим предотвращается подача ложных команд при небольших флюктуациях положения платы в руках оператора. Скорость и направление движения модели регулируются наклоном платы передатчика в направлении от себя или к себе. При этом скорость модели пропорциональна степени наклона. Поскольку используются 3 дискретных значения скорости, соответствующих пороговым значениям наклона платы, изменение скорости не происходит при наклоне платы между этими пороговыми значениями.

Светодиод индицирует фазы соединения с приёмником. Частота его вспышек увеличивается от начала сканирования BLE устройств, до обнаружения BLE устройства с идентификатором приёмника, соединения с приёмником, и процессом окончания чтения предоставляемым приёмником сервисов и их характеристик. По завершении всего процесса светодиод светит постоянно без мигания. При этом его генератор ШИМ отключается и светодиод управляется непосредсвенно с выхода соответствующего пина порта PSoC.

В отличии от приёмника удалось помещать систему в глубокий сон в промежутках между измерением ускорения и обработки событий стека. При этом токопотребление передатчика оказалось около 1.6 мА, из которых около 1.3 мА приходится на светодиод. Для дальнейшего снижения токопотребления следовало-бы также погружать акселерометр в сон подачей соответствующего сигнала на его вход ENA.

#36. GSM-модуль SIM800L. AT команды и отправка СМС

Передатчик смонтирован на односторонней печатной плате размером 74×42 мм. Фольга вблизи антенны модуля удалена в соответствии с рекомендациями производителя. Батарейный отсек размещён на тыльной стороне платы и привинчен к ней двумя винтами M2.

#36. GSM-модуль SIM800L. AT команды и отправка СМС

Соединение передатчика (ведущее устройство – master) с приёмником (ведомое устройство – slave) производится на основе обработки событий стека BLE в файле BLEclient.c. Как и в приёмнике, событие CYBLE_EVT_STACK_ON генерируется по окончании инициализации стека. Как только это произойдёт, вызывается API функция CyBle_GapcStartScan для начала сканирования доступных передатчику BLE устройств. При обнаружении такового генерируется событие CYBLE_EVT_GAPC_SCAN_PROGRESS_RESULT и стек передаёт обработчику идентификатор (MAC address) устройства. Одновременно генерируется событие CYBLE_EVT_GAPC_SCAN_START_STOP. В обработчике первого события полученный идентификатор сравнивается с таковым для модели приёмника. При его несовпадении сканирование устройств продолжается путём подачи соответствующей команды в обработчике второго события. В противном случае там-же подаётся команда CyBle_GapcConnectDevice произвести соединение с приёмником. При успешном соединении сначала генерируется событие CYBLE_EVT_GATT_CONNECT_IND, при котором обработчик получает дескриптор устройства (device handle) приёмника, который сохраняется в переменной connHandle и впоследствии используется для подачи команд приёмнику. Далее стеком генерируется событие CYBLE_EVT_GAP_DEVICE_CONNECTED, символизирующее об окончании процесса соединения. В этот момент обычно начинают процесс сбора информации о сервисах, предoставляемых соединённым устройством, их характеристиках и дескрипторах. Однако, в целях упрощения кода мы этого не делаем, т.к. наверняка знаем какие сервисы следует ожидать от нашего приёмника. Значения дескрипторов характеристик (characteristic handle) Turn, Speed и Control профиля приёмника (в нашем случае 0х0012, 0х0016, 0x001A) можно найти в файле BLE_custom.h проекта приёмника. Этот файл автоматически генерируется конфигуратором при создании проекта.

На фоне обработки событий стека BLE логика работы передатчика чрезвычайно проста. По получении прерывания от сторожевого таймера производится пробуждение АЦП и измерение сигналов на выходе акселерометра. Значения вектора ускорения сравнивается с пороговыми для поворотов и скоростей в функции Check_Control(), и производится заполнение полей структур управления характеристиками. Далее подаётся команда CyBle_GattcWriteCharacteristicValue передачи соответствующей характеристики приёмнику. Параметрами этой функции являются дескриптор соединения с приёмником (полученный при соединении) и структура дескриптора соответствующей характеристики. Последние инициализируются лишь один раз при подаче питания в фунции Init_RAM(), т.к. в этих структурах требуется указать лишь адрес значения надлежащей характеристики. При изменении значения кода скорости и поворота адрес этих значений при статическом расположении их в RAM не меняется.

При повторении конструкции следует в программе передатчика (файл BLEclient.c) изменить в массиве serverAddress MAC адрес моего модуля приёмника на Ваш. Для этого следует включить приёмник модели, который в режиме advertisement будет передавать свой MAC адрес и который можно будет прочитать любым сканером BLE устройств. Например, с помощью проложения CySmart для смартфонов, свободно доступного в сети. Файлы плат для Eagle и исходники проекта прилагаются.

Радиус действия управления, даже при использовании протокола BLE, можно существенно повысить до нескольких сотен метров путём использования модулей с большей выходной мощностью. Таковые имеются у Cypress, я прежде всего имею в виду новые модули CYBLE-224110-00 с огромной для BLE мощностью 9.5 dBm (около 9 mW). Конечно, при такой мощности это будет уже не совсем Low Energy. Фирма любезно предоставила нам эти модули для экспериментов, однако про них подробнее как-нибудь в другой раз. В заключении видео управления моделью.

Литература

1. Реалиазция стандартного GATT-BLE профиля на RSoC фирмы Cypress
2. Project #047: PSoC 4 BLE – Accelerometer Controlled Car

Файлы:
Архив ZIP

Все вопросы в
Форум.



Эти статьи вам тоже могут пригодиться:

Решение 2. попробуйте переустановить драйверы bluetooth

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

Чтобы решить эту проблему, пользователи предлагают переустановить ваши устройства Bluetooth. Это довольно просто сделать, и вы можете сделать это, выполнив следующие действия:

  1. Нажмите Windows Key X, чтобы открыть меню Win X. Теперь перейдите к диспетчеру устройств .
    Bluetooth не работает Windows 10
  2. Найдите устройство, которое доставляет вам проблемы, щелкните его правой кнопкой мыши и выберите « Удалить устройство» из меню.
    Bluetooth не работает Windows 10
  3. Когда появится диалоговое окно подтверждения, нажмите « Удалить» .
    Bluetooth не находит наушники
  4. Теперь просто нажмите значок « Поиск изменений оборудования», и Windows автоматически установит отсутствующие драйверы.
    Bluetooth не подключен

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

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

Просто посетите веб-сайт производителя и загрузите последние версии драйверов для вашего адаптера Bluetooth, и проблема будет решена.

Обновлять драйверы автоматически

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

Этот инструмент одобрен Microsoft и Norton Antivirus и поможет вам не повредить ваш компьютер, загрузив и установив неправильные версии драйверов.

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

    1. Загрузите и установите TweakBit Driver Updaterстартовое окно обновления драйвера
    2. После установки программа начнет сканирование вашего компьютера на наличие устаревших драйверов автоматически. Driver Updater проверит установленные вами версии драйверов по своей облачной базе данных последних версий и порекомендует правильные обновления. Все, что вам нужно сделать, это дождаться завершения сканирования.сканирование обновлений драйвера tweakbit
    3. По завершении сканирования вы получите отчет обо всех проблемных драйверах, найденных на вашем ПК. Просмотрите список и посмотрите, хотите ли вы обновить каждый драйвер по отдельности или все сразу. Чтобы обновить один драйвер за раз, нажмите ссылку «Обновить драйвер» рядом с именем драйвера. Или просто нажмите кнопку «Обновить все» внизу, чтобы автоматически установить все рекомендуемые обновления.
      сканирование обновлений драйвера tweakbit завершено
      Примечание.Некоторые драйверы необходимо устанавливать в несколько этапов, поэтому вам придется нажимать кнопку «Обновить» несколько раз, пока не будут установлены все его компоненты.

Отказ от ответственности : некоторые функции этого инструмента не являются бесплатными.

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

Adblock
detector