如何从另一个Arduino上的HM10接收数据?

时间:2017-09-11 21:32:20

标签: arduino serial-port bluetooth-lowenergy hm-10

Link to set up of arduino's我是像Arduino这样的初学者。我试图在2个Arduinos之间建立一个BLE HM10连接。我将BLE模块连接到我的FTDI电缆并将它们设置为主设备和从设备。当我加电时,它们会立即连接。我将波特率设置为9600(默认值)并尝试发送"传感器值"从从机到主板,伺服应该移动。

我编写了我的代码,并以多种方式对其进行了测试。 Arduino引脚0/1和7/8中的HM10 Rx / Tx引脚......对我来说没什么用。我写了一个声明,如果从属设备的数据到达主设备,则串行终端不输出任何内容而不是" A"。

我使用Arduino Uno作为奴隶使用此代码:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 8); // RX, TX  
// Connect HM10      Arduino Uno
//     TXD          Pin 7
//     RXD          Pin 8

int reading = A0; // FSR attached to A0
int fsrreading;
int val;   

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);   //bluetooth serial begin
}

void loop() {
 int reading = analogRead(A0); //read fsr value
    Serial.print("Analog reading = ");
    Serial.println(reading);
    int val = map(reading, 0, 1023, 0, 180); // convert to servo value
    Serial.print("servo value = ");
    Serial.println(val);
    mySerial.write(val);//send fsr value to bt serial to the master
    delay(500); //Tweak this to lower value if communication is working
}

这是Arduino Leonardo的主人代​​码:

#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial mySerial(7, 8); // RX, TX
// Connect HM10      Arduino Uno
//     TXD          Pin 7
//     RXD          Pin 8
int servoPin = 9; //attached to pin 9 (PWM)
Servo myservo;

int val;
int data;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);//bluetooth serial begin
  myservo.attach(servoPin);//servo obj is attached to pin9
}

void loop()
{
    int avail = mySerial.available();//check is serial is available
        if (avail > 0)
        {
            for (int i = 0; i < avail; i++)
            {
                int data = mySerial.read();
                //no need to map or constrain
                // data is already between 0 an 180
                myservo.write(data);//move servo to pos
                Serial.println(data,DEC);
                delay(50);
            }
        }
}

如果我打开串口终端,我就得到A,如果我按下传感器&#34;那么就不要采取任何行动。 (FSR)......我在序列中获得了FSR值,但没有在主人的序列中获得...我不知道我到底做错了什么。 伙计们,你能看透我的意大利面条代码并告诉我我的错吗?

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题,可能还有FSR模拟输入。

将FSR的一端连接到5V,另一端连接到模拟0。 然后将10K电阻的一端从模拟0连接到地。

这样,您将在模拟输入上获得0伏(无压力)和4.9伏(全压力~22磅)之间的电压。

这将导致模拟值介于0和1023之间。

mySerial.write(val)以字节形式发送整数,但高于255的int值不适合字节,因此垃圾发送。 在发送之前映射您的模拟值。 如果将其映射到伺服的值,则接收器不需要转换。 这样:

 int reading = analogRead(A0); //read fsr value
    Serial.print("Analog reading = ");
    Serial.println(reading);
    int val = map(reading, 0, 1023, 0, 180); // convert to servo value
    Serial.print("servo value = ");
    Serial.println(val);
    mySerial.write(val);//send fsr value to bt serial to the master
    delay(500); //Tweak this to lower value if communication is working

这一行:

int val = mySerial.println(fsrreading); //convert fsr value in clean int

没有做你认为它正在做的事情。它可能返回fsrreading长度,但可能不需要垃圾,所以删除它。

在我的示例行中,我将延迟设置为500. HM10的缓冲区可以处理20个字节, 所以尽量将延迟设置得尽可能低而不会使缓冲区溢出。

在接收代码中,您只读取一个字节。 要获得平滑的伺服运动,您必须读取所有可用的并处理所有字节以设置伺服。 当您阅读所有可用的内容时,无需清理Serial 阅读或清洁后检查可用,将始终在草图中打印A.

而是检查收到的数据并打印出来,以便您知道收到的内容。 代码:

void loop()
{
    int avail = mySerial.available();//check is serial is available
        if (avail > 0)
        {
            for (int i = 0; i < avail; i++)
            {
                int data = mySerial.read();
                //no need to map or constrain
                // data is already between 0 an 180
                myservo.write(data);//move servo to pos
                Serial.println(data,DEC);
                delay(50);
            }
        }
}