- Управление голосом в режиме постоянного ожидания команд

Управление голосом с помощью Андроид и Ардуино в режиме постоянного прослушивания команд

Практика для студентов. Мясищев А.А.

Здесь представлена программа голосового управления Ардуино с помощью Андроид - устройства через Bluetooth HC-05. К Ардуино подключены три исполнительных механизма и датчик температуры. После выполнения соответствующих команд программа синтезирует голосовое сообщения о результате работы. Этот пример является типичной подзадачей общей задачи "Умный дом". Программа также реализует простейший диалог между устройством и пользователем, отвечая на простые вопросы.Для распознавания и синтеза речи используется инструментарий Google. Если смартфон поддерживает голосовой поиск в режиме оффлайн, доступ к Интернет не обязателен. Программа для Андроид написана в среде Android Studio(язык Java), а для Ардуино - в среде разработки Ардуино на C++(проект Wiring). Тестировалась на планшете Acer A500.

Недостатком предыдущих решений является невозможность постоянного прослушивания голосовых команд от пользователя. Например, в случае отсутствия команды или нечеткого ее произношения активити распознания речи останавливается и требует для своего перезапуска нажатия на кнопку на активити. В этой работе рассматривается программа, которая постоянно готова к восприятию голосовых команд. В случае паузы выполняется фиксация ошибки и перезапуск метода startListening класса SpeechRecognizer, обеспечивающего доступ к сервису распознавания речи. Если произносится фраза или команда, которая не описана в программе, выполняется только ее распознавание, а строка выводится в окне активити. В этом случае динамики планшета отключаются и синтез речи не выполняется. Динамики выключаются и в случае появления ошибки, например не произнесено ни одно слово, или фраза не разборчива. Таким образом у пользователя создается впечатление, что устройство "засыпает", однако оно продолжает прослушивание. Для вывода Андроид из состояния "сна" необходимо произнести фразу или команду, известную программе (переменные sp), например, фразу "маша". Устройство должно включить динамики и ответить "я здесь".

На рисунке 1 представлено фото открытого приложения.

Рис.1. Фото открытого приложения

Видео работы программы можно посмотреть здесь

На рисунке 2. показана схема подключения к Arduino UNO Bluetooth HC-05, датчика температуры DS18B20 и трех светодиодов красного, зеленого и синего цвета (альтернатива трем исполнительным механизмам, например свет, телевизор и кондиционер).

Рис.2. Схема подключения устройств к Ардуино

Программа на Ардуино достаточно проста (см. текст внизу) и ее работа понятна из комментариев.

Программа на Java Android Studio 1.0.1 (Для планшета Acer A500)

package net.sytes.speech_bluetooth2;

import java.io.DataInputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.ArrayList;

import java.io.IOException;

import java.util.HashMap;

import java.util.Locale;

import java.util.Timer;

import java.util.TimerTask;

import java.util.UUID;

import android.content.Context;

import android.media.AudioManager;

import android.speech.RecognitionListener;

import android.speech.RecognizerIntent;

import android.speech.SpeechRecognizer;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.speech.tts.TextToSpeech;

import android.speech.tts.UtteranceProgressListener;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import android.bluetooth.BluetoothAdapter;

import android.bluetooth.BluetoothDevice;

import android.bluetooth.BluetoothSocket;

import android.widget.Toast;

public class MainActivity extends Activity implements TextToSpeech.OnInitListener {//Создание основного

// класса с интерфейсом RecognitionListener для обработки событий связанных с распознаванием речи

// и интерфейсом для инициализации синтезатора голоса

public int r19=10;

public int upbluetooth = 1;

public String spout;

public String sp;

public TextToSpeech tts;

private TextView returnedText;

private TextView ErrText;

private TextView editTexts;

private TextView temText;

private TextView oText;

public Button Button1;

public Button Button2;

public Button Button3;

public SpeechRecognizer speech = null;

public Intent recognizerIntent;

//Socket, с помощью которого будут отправляться данные на bluetooth Arduino

public BluetoothSocket clientSocket;

// UUID случае подключения к последовательному bluetooth устройству

private UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

public HashMap<String, String> params = new HashMap<String, String>();

private int bluecancel=0;

public String st;

public int value=100;

public int bytes;

public byte[] buffer = new byte[128];

public String readMessage;

public Timer time;

private Context ma;

// Вопросы

public String sp0 = "выключить красный";

public String sp1 = "включить красный";

public String sp2 = "выключить зеленый";

public String sp3 = "включить зеленый";

public String sp4 = "выключить синий";

public String sp5 = "включить синий";

public String sp6 = "температура";

public String sp10 = "как тебя зовут";

public String sp11 = "что ты умеешь";

public String sp12 = "твои команды";

public String sp13 = "спасибо";

public String sp14 = "откуда ты";

public String sp15 = "привет";

public String sp16 = "маша";

public String sp19 = "конец связи";

// Ответы

public String sp20 = "меня зовут маша";

public String sp21 = "я могу включать и выключать свет и определять температуру";

public String sp22 = "Включить зеленый. Выключить зеленый. То же для красного и синего. Температура.";

public String sp23 = "пожалуйста";

public String sp24 = "я из хмельницкого";

public String sp25 = "здравствуйте";

public String sp26 = "я здесь";

public String sp29 = "до свидания";

public String sp30 = "красный выключила";

public String sp31 = "красный включила";

public String sp32 = "зеленый выключила";

public String sp33 = "зеленый включила";

public String sp34 = "синий выключила";

public String sp35 = "синий включила";

public AudioManager myAudioManager;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

returnedText = (TextView) findViewById(R.id.textView1);

ErrText = (TextView) findViewById(R.id.textView2);

temText = (TextView) findViewById(R.id.textView6);

oText = (TextView) findViewById(R.id.textView5);

editTexts = (TextView) findViewById(R.id.editTexts);

Button1 = (Button) findViewById(R.id.button1);

Button2 = (Button) findViewById(R.id.button2);

Button3 = (Button) findViewById(R.id.button3);

utteranceProgressListener TextSpeech = new utteranceProgressListener(); //Экземпляр класса слушателя

tts = new TextToSpeech(this, this);

tts.setOnUtteranceProgressListener(TextSpeech); //Установка слушателя синтеза речи

ma=this;

// Создание экземпляра класса AudioManager

myAudioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);

}

@Override

public void onDestroy() {

super.onDestroy();

// Остановить синтезатор речи tts!

if (tts != null) {

tts.stop();

tts.shutdown();

}

if (upbluetooth == 0) {

try {

clientSocket.close(); // Закрыть соединение с bluetooth

} catch (IOException e2) {

}

}

}

@Override

public void onInit(int status) { // Инициализация перед синтезом речи

if (status == TextToSpeech.SUCCESS) {

int result = tts.setLanguage(Locale.getDefault());

if (result == TextToSpeech.LANG_MISSING_DATA

|| result == TextToSpeech.LANG_NOT_SUPPORTED) {

Log.e("TTS", "This Language is not supported");

}

} else {

Log.e("TTS", "Init Failed!");

}

}

public void bspeesh() {

speech = SpeechRecognizer.createSpeechRecognizer(ma); //Создание объекта распознавателя речи

speech.setRecognitionListener(thiss); //Установить обработчик событий распознавания

// Передача параметров

recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,

RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,

this.getPackageName());

recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,

RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);

recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);

}

RecognitionListener thiss = new RecognitionListener(){

@Override

public void onBeginningOfSpeech() {

}

@Override

public void onBufferReceived(byte[] buffer) {

}

@Override

public void onEndOfSpeech() {

oText.setText("НЕ ГОВОРИ");

}

@Override

public void onError(int errorCode) {

speak_off(); //Выключить звук в случае любой ошибки

String errorMessage = getErrorText(errorCode); // Вызов метода расшифровки ошибки

ErrText.setText(errorMessage + "; Ошибка=№"+errorCode);

speech.destroy();

bspeesh();

oText.setText("ГОВОРИ");

speech.startListening(recognizerIntent);

}

@Override

public void onEvent(int arg0, Bundle arg1) {

}

@Override

public void onPartialResults(Bundle arg0) {

}

@Override

public void onReadyForSpeech(Bundle arg0) {

}

@Override

public void onResults(Bundle results) { // Результаты распознавания

ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);

sp = data.get(0).toString();

value=100;

returnedText.setText(sp);

spout = sp;

int r0 = sp.compareTo(sp0);

int r1 = sp.compareTo(sp1);

int r2 = sp.compareTo(sp2);

int r3 = sp.compareTo(sp3);

int r4 = sp.compareTo(sp4);

int r5 = sp.compareTo(sp5);

int r6 = sp.compareTo(sp6);

int r10 = sp.compareTo(sp10);

int r11 = sp.compareTo(sp11);

int r12 = sp.compareTo(sp12);

int r13 = sp.compareTo(sp13);

int r14 = sp.compareTo(sp14);

int r15 = sp.compareTo(sp15);

int r16 = sp.compareTo(sp16);

int r19 = sp.compareTo(sp19);

if (r0 == 0) spout = sp30;

if (r1 == 0) spout = sp31;

if (r2 == 0) spout = sp32;

if (r3 == 0) spout = sp33;

if (r4 == 0) spout = sp34;

if (r5 == 0) spout = sp35;

if (r6 == 0) spout = sp6;

if (r10 == 0) spout = sp20;

if (r11 == 0) spout = sp21;

if (r12 == 0) spout = sp22;

if (r13 == 0) spout = sp23;

if (r14 == 0) spout = sp24;

if (r15 == 0) spout = sp25;

if (r16 == 0) spout = sp26;

if (r19 == 0) spout = sp29;

if (upbluetooth == 0) { // Если подключение к bluetooth существует то

// результат сравнения представляем символом

// Например, если результат распознавания голоса соответствует строке

// "включить зеленый" то на bluetooth посылаем символ 3 (код 51)

if (r1 == 0) value = 49;

if (r0 == 0) value = 48;

if (r3 == 0) value = 51;

if (r2 == 0) value = 50;

if (r5 == 0) value = 53;

if (r4 == 0) value = 52;

if (r6 == 0) value = 54;

// Посылаем данные

if (value != 54) outData(value);

if (value == 54) {

temText.setText(readMessage); // Распечатываем температуру

spout = readMessage;

}

}

if (r0==0||r1==0||r2==0||r3==0||r4==0||r5==0||r6==0||r10==0||r11==0||r12==0

||r13==0||r14==0||r15==0||r16==0||r19==0||value==54) // Синтез речи

// выполняется в случае наличия команд и фраз в памяти

{

speak_on(); // Включаем динамики

params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "HELLO");

tts.speak(spout, TextToSpeech.QUEUE_ADD, params);// Синтезировать речь

}

else

{

speak_off(); // Если фразы и команды не описаны, выполняется распознавание речи, вывод результата

// в виде строки при выключенных динамиках

speech.stopListening(); //Прекратить слушать речь

speech.destroy(); // Уничтожить объект SpeechRecognizer

bspeesh();

oText.setText("ГОВОРИ");

speech.startListening(recognizerIntent);

}

}

@Override

public void onRmsChanged(float rmsdB) {

}

};

public void onClick1(View view) { // После нажатия на кнопку начать распознавание речи

if(upbluetooth == 0) {

//При нажатии на кнопку останавливаю таймер работы программы по передаче и чтению температуры

time.cancel();

time.purge();

// Запускаю таймер работы программы с новыми начальными данными(посылка запроса температуры и прием темпелатуры)

bluecancel = 0;

time = new Timer();

bluetoothInOut bInOut = new bluetoothInOut();

time.schedule(bInOut, 500, 1000);

}

speak_off();

bspeesh(); // Вызов метода для активизации распознавателя голоса

oText.setText("ГОВОРИ");

speech.startListening(recognizerIntent); // Начать прослушивание речи

}

public void speak_off() // Метод для выключение внешних динамиков планшета

{

myAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

}

public void speak_on() // Метод включения внешних динамиков планшета

{

myAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 20, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

}

public void onClick2(View view) { // После нажатия на кнопку закончить распознавание

if (speech != null) {

speech.stopListening(); //Прекратить слушать речь

speech.destroy(); // Уничтожить объект SpeechRecognizer

// останавливаю таймер

if (upbluetooth == 0) {

time.cancel();

time.purge();

// и запускаю таймер работы программы с новыми начальными данными(без посылки запроса температуры но с приемом температуры)

bluecancel = 1;

time = new Timer();

bluetoothInOut bInOut = new bluetoothInOut();

time.schedule(bInOut, 500, 1000);

}

}

}

public void onClick3(View view) {

st = editTexts.getText().toString().toUpperCase(); // Получаем адрес bluetooth с строки ввода

bluet();

}

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

// распознавания голоса

public class utteranceProgressListener extends UtteranceProgressListener {

@Override

public void onDone(String utteranceId) { // Действия после окончания речи синтезатором

MainActivity.this.runOnUiThread(new Runnable() {

@Override

public void run() {

r19 = sp.compareTo(sp19);

if(r19 != 0) { // Если не "конец связи", то активити распознавания голоса запускается вновь

oText.setText("ГОВОРИ");

speech.startListening(recognizerIntent);

}

else {

if(upbluetooth==0) { //Если Bluetooth включен то

// если произнесено "конец связи" - останавливаю таймер

time.cancel();

time.purge();

// и запускаю таймер работы программы с новыми начальными данными(без посылки запроса температуры но с приемом температуры)

bluecancel = 1;

time = new Timer();

bluetoothInOut bInOut = new bluetoothInOut();

time.schedule(bInOut, 500, 1000);

}

}

}

} );

}

@Override

public void onStart(String utteranceId) {

}

@Override

public void onError(String utteranceId) {

}

}

public void bluet() { // Подключение к bluetooth при нажатии на кнопку

Intent enableBt = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

enableBt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(enableBt);

// Используется bluetooth по умолчанию

BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();

try {

// Выбираем bluetooth с конкретным адресом для простоты

BluetoothDevice device = bluetooth.getRemoteDevice(st);

// Создание RFCOMM секретного socket - а для входящих и исходящих сообщений

clientSocket = device.createRfcommSocketToServiceRecord(uuid);

// Попытка подключения к удаленному bluetooth

clientSocket.connect();

// Если попытка удалась, выводится сообщение внизу экрана

Toast.makeText(getApplicationContext(), "Связь с bluetooth установлена", Toast.LENGTH_LONG).show();

upbluetooth=0;

bluecancel=0;

time = new Timer();

bluetoothInOut bInOut = new bluetoothInOut();

time.schedule(bInOut,500,1000); //Через 500 миллисекунд после запуска программы начинать

// запрашивать температуру каждую секунду

}

//В случае появления ошибок сообщаем, что bluetooth не подключен

catch (IOException e) {

upbluetooth=1;

Toast.makeText(getApplicationContext(), "Проверь bluetooth!", Toast.LENGTH_LONG).show();

}

}

public class bluetoothInOut extends TimerTask {

public void run() {

try {

if( bluecancel == 0 ) // Только в этом случае посылаем запрос температуры

{

OutputStream outStream = clientSocket.getOutputStream();

outStream.write(54);}

// Получаем входной поток для приема данных

InputStream inb = clientSocket.getInputStream();

// Преобразование входного потока от bluetooth в строку

DataInputStream in = new DataInputStream(inb);

bytes = in.read(buffer);

if (bytes > 10 ) // Если через bluetooth получено (например) больше 10 байт, то

{

// преобразуем байты в строку с нулевого индекса до индекса bytes

readMessage = new String(buffer, 0, bytes);

}

} catch (IOException e) {

}

}

}

public void outData(int value) { // Выполняет передачу данных на Bluetooth

try {

// Получаем выходной поток для передачи данных

OutputStream outStream = clientSocket.getOutputStream();

// Посылаем данные

outStream.write(value);

} catch (IOException e) {

}

}

public static String getErrorText(int errorCode) { // Метод возврата ошибки по ее коду

String message;

switch (errorCode) {

case SpeechRecognizer.ERROR_AUDIO:

message = "Audio recording error";

break;

case SpeechRecognizer.ERROR_CLIENT:

message = "Client side error";

break;

case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:

message = "Insufficient permissions";

break;

case SpeechRecognizer.ERROR_NETWORK:

message = "Network error";

break;

case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:

message = "Network timeout";

break;

case SpeechRecognizer.ERROR_NO_MATCH:

message = "No match";

break;

case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:

message = "RecognitionService busy";

break;

case SpeechRecognizer.ERROR_SERVER:

message = "error from server";

break;

case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:

message = "No speech input";

break;

default:

message = "Didn't understand, please try again.";

break;

}

return message;

}

}

Файл разметки

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"

android:gravity="center">

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"

android:text="Распознанный текст"

android:id="@+id/textView1"

android:textSize="30dp"

android:textColor="#ff000000"

android:gravity="center"

android:width="700dp"

android:layout_below="@+id/textView2"

android:layout_centerHorizontal="true" />

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceSmall"

android:text="Сообщение об ошибке"

android:id="@+id/textView2"

android:textColor="#ffff0513"

android:textSize="25dp"

android:gravity="center"

android:layout_centerHorizontal="true" />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Запустить распознавание"

android:id="@+id/button1"

android:onClick="onClick1"

android:layout_marginTop="94dp"

android:textSize="40dp"

android:layout_below="@+id/button3"

android:layout_centerHorizontal="true" />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Остановить распознавание"

android:id="@+id/button2"

android:onClick="onClick2"

android:textSize="40dp"

android:layout_marginTop="81dp"

android:layout_below="@+id/button1"

android:layout_centerHorizontal="true" />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Подключить bluetooth"

android:id="@+id/button3"

android:onClick="onClick3"

android:layout_below="@+id/editTexts"

android:layout_centerHorizontal="true"

android:textSize="40dp" />

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Введите адрес и нажмите кнопку"

android:id="@+id/textView3"

android:layout_above="@+id/editTexts"

android:layout_centerHorizontal="true"

android:textSize="30dp"

android:gravity="center" />

<EditText

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/editTexts"

android:width="300dp"

android:text="98:D3:31:B0:86:16"

android:layout_centerVertical="true"

android:layout_centerHorizontal="true"

android:textSize="35dp"

android:gravity="center" />

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textView5"

android:hint="Готовность распознавания"

android:textSize="40dp"

android:textStyle="bold"

android:textColor="#ff121dff"

android:textColorHint="#ff0610ff"

android:gravity="center"

android:layout_marginBottom="105dp"

android:layout_above="@+id/textView3"

android:layout_centerHorizontal="true" />

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textView6"

android:hint="Температура"

android:textSize="40dp"

android:textColor="#ff059f0e"

android:textColorHint="#ff0ecd0b"

android:textStyle="bold"

android:layout_above="@+id/textView5"

android:layout_centerHorizontal="true"

android:layout_marginBottom="110dp" />

</RelativeLayout>

Файл манифеста

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="net.sytes.speech_bluetooth2" >

<uses-permission android:name="android.permission.RECORD_AUDIO" />

<uses-permission android:name="android.permission.BLUETOOTH" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

android:label="@string/app_name"

android:windowSoftInputMode="stateHidden">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

Программа для Ардуино написана в стандартной среде разработки Ардуино:

#include <OneWire.h> //Подключаем описание библиотеки шины OneWire

#include <DallasTemperature.h> //Подключаем описание библиотеки для определения температуры(DS18B20)

#define ONE_WIRE_BUS 5 //Датчик температуры подключен к 5-му выводу Ардуино

char inByte; // входящие данные

int RED = 2; // RED подключен к 2 выводу

int GR = 4; // GREEN подключен к 4 выводу

int BL = 6; // BLUE подключен к 6 выводу

OneWire oneWire(ONE_WIRE_BUS); //Настройка шины 1wire для работы с 5-м выводом Ардуино

DallasTemperature sensors(&oneWire); //Подключаем датчик температуры

void setup() {

Serial.begin(9600); // инициализация порта

sensors.begin(); //Инициализация датчика температуры DS18B20

pinMode(RED, OUTPUT); //Установка 2-го вывода на выход

pinMode(GR, OUTPUT); //Установка 4-го вывода на выход

pinMode(BL, OUTPUT); //Установка 6-го вывода на выход

sensors.requestTemperatures(); // Запрос температуры

int temp=sensors.getTempCByIndex(0); // Получение температуры с нулевого датчика

}

void loop() {

if (Serial.available() > 0) { //если пришли данные

inByte = Serial.read(); // считываем байт

if(inByte == '0') {

digitalWrite(RED, LOW); // если 0, то выключаем RED

}

if(inByte == '1') {

digitalWrite(RED, HIGH); // если 1, то включаем RED

}

if(inByte == '2') {

digitalWrite(GR, LOW); // если 2, то выключаем GREEN

}

if(inByte == '3') {

digitalWrite(GR, HIGH); // если 3, то включаем GREEN

}

if(inByte == '4') {

digitalWrite(BL, LOW); // если 4, то выключаем BLUE

}

if(inByte == '5') {

digitalWrite(BL, HIGH); // если 5, то включаем BLUE

}

if(inByte == '6') { // если 6, то считываем температуру и посылаем ее на bluetooth

sensors.requestTemperatures();

int temp=sensors.getTempCByIndex(0);

Serial.print("Температура, ");

Serial.print(temp); Serial.print(" ");

}

}

}

Написано 31.03.2015г.