#1 Різне » Отправка данных на arduino и передача данных на мобильное приложение » 2020-05-10 16:03:36

MSerega
відповідей: 0

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

Код Arduino

#define PARSE_AMOUNT 8    // максимальное количество значений в массиве, который хотим получить
#define header '$'        // стартовый символ
#define divider ','       // разделительный символ
#define ending ';'        // завершающий символ
int intData[PARSE_AMOUNT];     // массив численных значений после парсинга
boolean recievedFlag;
String request = "1234567891011121314151617181920";
boolean getStarted;
byte index;
String string_convert = "";
boolean parseString, getString;

void bluetoothTick() {
  parsing();              // функция парсинга
  if (recievedFlag) {     // если получены данные
    recievedFlag = false;
    if (getString) {
      getString = false;
      loadingFlag = true;
      thisLength = runningText.length();
      showText = true;
      updateSettings();
      return;
    }

    switch (intData[0]) {
      case 0:   // запрос онлайна
        request = "OK ";
        request += String(random(0, 100));
        btSerial.print(request);
        break;
      case 1: // вкл/выкл
        toggleText(intData[1]);
        break;
      case 2: // скорость
        thisSpeed = 110 - intData[1];
        scrollTimer.setInterval(thisSpeed);
        break;
      case 3: // яркость
        thisBright = intData[1];
        matrix.setIntensity(thisBright);
        break;
      case 4: // режим
        thisMode = intData[1];
        break;
      case 5: // цвет
        thisColor = intData[1];
        break;
      case 6: // авто
        autoFlag = intData[1];
        if (autoFlag) showText = true;
        break;
    }
    if (intData[0] > 0) updateSettings();
  }
}

void parsing() {
  if (btSerial.available() > 0) {
    char incomingByte;
    if (parseString) {
      runningText = "";
      runningText = btSerial.readString();  // принимаем всю
      incomingByte = ending;              // сразу завершаем парс
    } else {
      incomingByte = btSerial.read();      // обязательно ЧИТАЕМ входящий символ
    }
    if (getStarted) {                         // если приняли начальный символ (парсинг разрешён)
      if (incomingByte != divider && incomingByte != ending) {  // если это не пробел И не конец
        string_convert += incomingByte;       // складываем в строку
      } else {                                // если это пробел или ; конец пакета
        intData[index] = string_convert.toInt();  // преобразуем строку в int и кладём в массив
        string_convert = "";                  // очищаем строку
        index++;                              // переходим к парсингу следующего элемента массива
      }
    }
    if (incomingByte == header) {             // если это $
      getStarted = true;                      // поднимаем флаг, что можно парсить
      index = 0;                              // сбрасываем индекс
      string_convert = "";                    // очищаем строку
      parseString = false;
    }
    if (incomingByte == '#') {                // если это #
      getStarted = true;                      // поднимаем флаг, что можно парсить
      index = 0;                              // сбрасываем индекс
      string_convert = "";                    // очищаем строку
      parseString = true;
      getString = true;
    }
    if (incomingByte == ending) {             // если таки приняли ; - конец парсинга
      getStarted = false;                     // сброс
      recievedFlag = true;                    // флаг на принятие
      parseString = false;
    }
  }
}

Код Android

 private class ConnectThread extends Thread {

    private BluetoothSocket bluetoothSocket = null;
    private BluetoothDevice device;

    public ConnectThread(BluetoothDevice device) {
        try {
            Method method = device.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
            bluetoothSocket = (BluetoothSocket) method.invoke(device, 1);
            this.device = device;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            bluetoothSocket.connect();
            success = true;

        } catch (IOException e) {
            e.printStackTrace();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mProgressDialog.dismiss();
                    Toast.makeText(MainActivity.this, "Не могу соединиться!", Toast.LENGTH_SHORT).show();
                }
            });

            cancel();
        }

        if (success) {
            connectedThread = new ConnectedThread(bluetoothSocket);
            connectedThread.start();


            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    showFrameDeviceControls();
                    txtDeviceConnectedName.setText(device.getName());
                    txtDeviceConnectedName.setTextColor(getResources().getColor(R.color.colorGreen));
                }
            });
        }
    }

    public boolean isConnect() {
        return bluetoothSocket.isConnected();
    }

    public void cancel() {
        try {
            bluetoothSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



private class ConnectedThread extends Thread {

    private final InputStream inputStream;
    private final OutputStream outputStream;

    public ConnectedThread(BluetoothSocket bluetoothSocket) {
        InputStream inputStream = null;
        OutputStream outputStream = null;

        try {
            inputStream = bluetoothSocket.getInputStream();
            outputStream = bluetoothSocket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        this.inputStream = inputStream;
        this.outputStream = outputStream;
    }

    @Override
    public void run() {

    }

    public void write(String command) {
        byte[] bytes = command.getBytes();
        if (outputStream != null) {
            try {
                outputStream.write(bytes);
                outputStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void cancel() {
        try {
            inputStream.close();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Вид приложения

B3pGZ.jpg

Также есть основной код программы для Arduino

    /*
  Скетч к проекту "Бегущая строка"
  Страница проекта (схемы, описания): https://alexgyver.ru/GyverString/
  Исходники на GitHub: https://github.com/AlexGyver/GyverString/
  Нравится, как написан код? Поддержи автора! https://alexgyver.ru/support_alex/
  Автор: AlexGyver, AlexGyver Technologies, 2019
  https://AlexGyver.ru/
*/

//  Версия 1.2 - исправлена ошибка с количеством матриц
// Версия 1.3 - исправлена скорость

// ================ НАСТРОЙКИ ================
#define MATR_NUM 8            // количество матриц последовательно

// ============ ДЛЯ РАЗРАБОТЧИКОВ ============
// ПИНЫ
#define BT_RX 3
#define BT_TX 2

// БИБЛИОТЕКИ
#include <SoftwareSerial.h>
#include <avr/eeprom.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include "fonts.h"
#include "timerMinim.h"

#define WIDTH MATR_NUM*8      // ширина матрицы
#define HEIGHT 8              // высота матрицы

Max72xxPanel matrix = Max72xxPanel(10, MATR_NUM, 1);
SoftwareSerial btSerial(BT_TX, BT_RX); // RX, TX
timerMinim scrollTimer(100);
timerMinim eepromTimer(5000);

String runningText = "";
boolean loadingFlag, fullTextFlag, runningState = true, eepromFlag = false, autoFlag = true, showText = true;
byte thisSpeed, thisBright, thisMode, thisColor, thisLength;

void setup() {
  //Serial.begin(9600);
  btSerial.begin(9600);
  btSerial.setTimeout(100);
  randomSeed(analogRead(0));
  if (eeprom_read_byte((uint8_t*)1023) != 123) {
    eeprom_write_byte((uint8_t*)1023, 123);
    for (int i = 10; i < 300; i++) eeprom_write_byte((uint8_t*)i, 0);
    eeprom_write_byte((uint8_t*)0, 60);
    eeprom_write_byte((uint8_t*)1, 60);
    eeprom_write_byte((uint8_t*)2, 0);
    eeprom_write_byte((uint8_t*)3, 0);
    eeprom_write_byte((uint8_t*)4, 0);
  }
  thisSpeed = eeprom_read_byte((uint8_t*)0);
  thisBright = eeprom_read_byte((uint8_t*)1);
  thisMode = eeprom_read_byte((uint8_t*)2);
  thisColor = eeprom_read_byte((uint8_t*)3);
  thisLength = eeprom_read_byte((uint8_t*)4);

  for (byte i = 10; i < thisLength + 10; i++) {
    runningText += (char)eeprom_read_byte((uint8_t*)i);
  }

  matrix.setIntensity(50);
  for (byte i = 0; i < MATR_NUM; i++) {
    // матрицы расположены криво, здесь поворачиваем
    matrix.setRotation(i, 1);
  }
  matrix.fillScreen(LOW);
  matrix.write();

  scrollTimer.setInterval(thisSpeed);
}

void loop() {
  bluetoothTick();  // парсинг блютус
  if (runningState) fillString(runningText, thisMode);
  eepromTick();
}

void toggleText(boolean state) {
  if (state) {
    runningState = true;
    loadingFlag = true;
  } else {
    runningState = false;
    matrix.fillScreen(LOW);
    matrix.write();
  }
}

Файл с EEPROM

   // --------------- РАБОТА С EEPROM --------------
// EEPROM MAP
// 0 - скорость
// 1 - яркость
// 2 - режим
// 3 - цвет
// 4 - длина строки
// 10-300 - строка


void eeprom_update_byte(int addr, byte value) {
  byte buf = eeprom_read_byte((uint8_t*)addr);
  if (value != buf) eeprom_write_byte((uint8_t*)addr, value);
}

void updateSettings() {
  eepromFlag = true;    // ставим галочку, что данные изменились
  eepromTimer.reset();
}

void eepromTick() {
  eepromFlag = false;
  eeprom_update_byte(0, thisSpeed);
  eeprom_update_byte(1, thisBright);
  eeprom_update_byte(2, thisMode);
  eeprom_update_byte(3, thisColor);
  eeprom_update_byte(4, thisLength);

  for (byte i = 10; i < thisLength + 10; i++) {
    eeprom_update_byte(i, runningText[i - 10]);
  }
}

#2 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-05 14:20:03

г0сть пише:

1. softSerial.begin поставь 9600
2. попробуй поменять Rx Tx местами

Не помогает

#3 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-05 14:00:43

г0сть пише:

Я где то писал про пины D2 D3? Что не понятного в

подключаете к пинам Rx и Tx Arduino.

https://a.radikal.ru/a22/2004/0e/b015198a7307.png

https://youtu.be/f0IwiJ2D9qM

#4 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-05 12:53:27

HC-06 - Arduino

RST - GND
RXD - D2
TXD - D3
Так подключил так,  ну плюс RST - GND которое подключил потом

untitled-1-jpg.11776

#5 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-05 12:37:24

г0сть пише:
MSerega пише:

Додаю перед D2 - GND і RST замыкаю между собою і тогда подключаю?

Нет, не так. RST перемычкой соединяете с GND. HC-06 подключаете к пинам Rx и Tx Arduino.

renoshnik пише:

А мне кажется, что нужно на оборот подключать ...

int gRxPin  = 10; подключить Tx_ВТ 
int gTxPin  = 11; подключить Rx_ВТ

Возможно.
Никто же не мешает ТС попробовать разные варианты

Как не так? Я же взял кабель мама-мама и соеденил RST и GND после них идут уже D2 и D3 подключенные

#6 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-05 12:13:01

г0сть пише:
MSerega пише:

У меня нету никаких переходников. Чисто ардуино нано и модуль

Указанную мной статью https://wiki.iarduino.ru/page/Arduino_as_a_USB_UART_converter/ внимательно читали? В самом начале написано как из ардуины сделать обычный переходник. И не нужно никаких скетчей, достаточно простой терминальной программы ...

Пробую! что то ни так не так не получаеться

#7 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-05 11:53:13

г0сть пише:
MSerega пише:

У меня нету никаких переходников. Чисто ардуино нано и модуль

Указанную мной статью https://wiki.iarduino.ru/page/Arduino_as_a_USB_UART_converter/ внимательно читали? В самом начале написано как из ардуины сделать обычный переходник. И не нужно никаких скетчей, достаточно простой терминальной программы ...

Тоесть я к этому подключению
untitled-1-jpg.11776

Додаю перед D2 - GND і RST замыкаю между собою і тогда подключаю?

c6fb80f52665d058bb05d5dfabe37f3d.png

#8 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-05 11:31:27

renoshnik пише:
MSerega пише:
г0сть пише:

Да.
Если отдельного usb-uart модуля нет, то можно сделать так https://wiki.iarduino.ru/page/Arduino_as_a_USB_UART_converter/

Мне нужно поменять имя HC-06

Так меняйте...
Вам уже столько способов предложили ...

У меня нету никаких переходников. Чисто ардуино нано и модуль

untitled-1-jpg.11776

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3);

void setup() {
  BTSerial.begin(9600);
  Serial.begin(9600);
  delay(500);
   Serial.println("Enter AT commands");
}

void loop() {
  if (BTSerial.available()) {
    Serial.write(BTSerial.read());
  }
  if (Serial.available()) {
    BTSerial.write(Serial.read());
  }
}

bezymjannyj-png.11774

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

#9 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-05 00:50:04

г0сть пише:
MSerega пише:

Я RXD подключаю на D10 ардуино а TXD на D11 верно?

Да.
Если отдельного usb-uart модуля нет, то можно сделать так https://wiki.iarduino.ru/page/Arduino_as_a_USB_UART_converter/

Мне нужно поменять имя HC-06

#10 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-04 23:56:03

г0сть пише:
MSerega пише:

Но причем тут вверху include? Нужно подключать какую то библиотеку?

Автор статьи скорее всего взял какой-то скетч и не все лишнее удалил

Я RXD подключаю на D10 ардуино а TXD на D11 верно?

#11 Re: Різне » HC-06 не реагирует на AT команды » 2020-04-04 23:31:06

г0сть пише:
MSerega пише:

Скажите что я сделал не так?

Не научился пользоваться гуглом http://drach.pro/blog/hi-tech/item/149-bluetooth-hc-06

// Ретранслятор
// У НАШЕГО модуля адрес +ADDR:98D3:31:F6102B

#include
#include

int gLedPin = 13;
int gRxPin  = 10;
int gTxPin  = 11;

SoftwareSerial BTSerial(gRxPin, gTxPin);

void setup() {
//  # 38400 - для метода №1, 9600 - для метода №2
  BTSerial.begin(9600);
  Serial.begin(9600);
  delay(500);
   Serial.writeln("uno READY");
}



void loop() {
  if (BTSerial.available()) {
    Serial.write(BTSerial.read());
  }
  if (Serial.available()) {
    BTSerial.write(Serial.read());
  }
}

Но причем тут вверху include? Нужно подключать какую то библиотеку?

#12 Різне » HC-06 не реагирует на AT команды » 2020-04-04 21:24:33

MSerega
відповідей: 22

Здравствуйте! Купил себе Arduino Nano и HC-06 решил попробывать что и как. Подключал таким методом

start_arduino_hc05_scheme.jpg

Телефон видет его. Сопражение есть. А вот через Arduino IDE я не могу в мониторе портов ввести AT команду для смены имени. Я ввожу АТ, на что результат должен быть "ОК", а у меня пустота. Скажите что я сделал не так?

Підвал форуму