Отправить данные датчика давления из Arduino в мой android студийный проект через соединение BLE - PullRequest
0 голосов
/ 08 апреля 2020

В поисках помощи - я пишу проект, который состоит из соединения BLE между моим android студийным проектом и платой arduino. Мое знание блютуса близко к нулю. Я не знаю, как сканировать устройство Arduino и читать данные. Вы можете помочь? Я постараюсь объяснить проект как можно лучше.

Прежде всего - это мой первый вопрос о переполнении стека - если я делаю что-то не так, пожалуйста, дайте мне знать! Для моего проекта - я хотел бы спросить, возможно ли это? Что-то не так с моим кодом Arduino. Могут ли данные, записанные с датчика давления, быть отправлены в мой android студийный проект. Как мне связать их сейчас по Bluetooth.

У меня есть пьезодатчик, который подключен к плате Arduino. Я успешно написал код, чтобы определить, какое давление применяется каждую секунду. Arduino поддерживает связь BLE.

Вот мой код arduino:

 #include <ArduinoBLE.h>

BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE LED Service

// BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEUnsignedCharCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

int pressureAnalogPin = 0 ; //pin where our pressure pad is located.
int pressureReading; //variable for storing our reading

//Adjust these if required.
int noPressure = 5; //max value for no pressure on the pad
int lightPressure = 500; //max value for light pressure on the pad
int mediumPressure = 1200; //max value for medium pressure on the pad

void setup(void) {
  Serial.begin(9600);
  while (!Serial);


  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");

    while (1);
  }

  // set the local name peripheral advertises
  BLE.setLocalName("MyProject");

  // start advertising
  BLE.advertise();

  Serial.println(("Bluetooth device active, waiting for connections..."));
}

void loop(void) {

  // listen for BLE peripherals to connect:
  BLEDevice central = BLE.central();

  // if a central is connected to peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's MAC address:
    Serial.println(central.address());


    // while the central is still connected to peripheral:
    while (central.connected()) {
          pressureReading = analogRead(pressureAnalogPin); 

          Serial.print("Pressure Pad Reading = ");
          Serial.println(pressureReading);

          if (pressureReading < noPressure) {
            Serial.println(" - No pressure");
          } else if (pressureReading < lightPressure) {
            Serial.println(" - Light Pressure");
          } else if (pressureReading < mediumPressure) {
            Serial.println(" - Medium Pressure");
          } else{
            Serial.println(" - High Pressure");
          }
          delay(1000);
        }


      // when the central disconnects, print it out:
      Serial.print(F("Disconnected from central: "));
      Serial.println(central.address());

  }
}

Я разработал приложение, которое имеет 9 кнопок изменения цвета, которые демонстрируют тепловую диаграмму. Каждая кнопка будет связана с указанным c датчиком в сетке 3x3. Кнопка меняет цвет в зависимости от того, что записывает датчик. Кнопки меняются с черного, красного, оранжевого, желтого, зеленого. Зеленый - это высокое значение давления. Он обновляется обработчиком каждую секунду, и показания датчика меняются.

Android Код:

package com.example.surf10;

import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_surfboard.*


class Surfboard : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_surfboard)

        val buttons = arrayOf(
            findViewById<Button>(R.id.b00),
            findViewById<Button>(R.id.b01),
            findViewById<Button>(R.id.b02),
            findViewById<Button>(R.id.b10),
            findViewById<Button>(R.id.b11),
            findViewById<Button>(R.id.b12),
            findViewById<Button>(R.id.b20),
            findViewById<Button>(R.id.b21),
            findViewById<Button>(R.id.b22)
        )
        Reading(buttons)
    }

    private fun Reading(buttons: Array<Button>) {

        val sensor1 =  (0..1250).random()
        val sensor2 =  (0..1250).random()
        val sensor3 =  (0..1250).random()
        val sensor4 =  (0..1250).random()
        val sensor5 =  (0..1250).random()
        val sensor6 =  (0..1250).random()
        val sensor7 =  (0..1250).random()
        val sensor8 =  (0..1250).random()
        val sensor9 =  (0..1250).random()



        val sensor = arrayOf(
            sensor1,
            sensor2,
            sensor3,
            sensor4,
            sensor5,
            sensor6,
            sensor7,
            sensor8,
            sensor9
        )
        heatChart(buttons, sensor)
    }

    private fun heatChart(buttons: Array<Button>, sensor: Array<Int>) {

        var i: Int = 0

        activate.setOnClickListener {

            for (n in buttons.indices) {

                var active = sensor[i]
                i = i.inc()

                if (active >= 1000) {
                    buttons[n].setBackgroundColor(Color.GREEN)
                    buttons[n].setText(active.toString())
                } else if (active >= 750) {
                    buttons[n].setBackgroundColor(Color.YELLOW)
                    buttons[n].setText(active.toString())
                } else if (active >= 500) {
                    buttons[n].setBackgroundColor(Color.rgb(255, 165, 0))
                    buttons[n].setText(active.toString())
                } else if (active >= 250) {
                    buttons[n].setBackgroundColor(Color.RED)
                    buttons[n].setText(active.toString())
                } else if (active >= 0) {
                    buttons[n].setBackgroundColor(Color.BLACK)
                    buttons[n].setText(active.toString())
                }

            }
        }
        Handler().postDelayed({
            Reading(buttons)
            activate.performClick()
        }, 1000)
    }
}

Моя проблема в том, чтобы соединить их вместе посредством связи BLE. Я хотел бы отправить данные, собранные с датчиков, подключенных к Arduino, на мобильное устройство. Я хотел бы, чтобы записи датчиков отправлялись в мое приложение android каждую секунду и отображались с помощью кнопки. Кнопка должна отображать показания и менять цвет в зависимости от этого показания. Сейчас я фокусируюсь только на одном датчике давления и кнопке.

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

Ссылка на arduino в действии: https://www.youtube.com/watch?v=zCdbed2Ry7Y&feature=youtu.be Ссылка на android приложение в действии: https://youtu.be/-rKEzuRalUw

Большое спасибо, Джордж Куайн

...