В поисках помощи - я пишу проект, который состоит из соединения 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
Большое спасибо, Джордж Куайн