Семейство Arduino

Семейство Arduino: важное и не очень;)

Есть часть кода на Arduino:
void loop() {
mySerial.println(“AT+INQ”); //сканирование доступных bluetooth
SerialMon.println(" RESTART SCAN");
delay(3000);
save_to_bufer(); // сохранение mac адреса 1-ого из них

//вывод в терминал mac адрес//

//подключение к ric//

mqtt.loop();
publishMAC(); // ф-ия отправки mac адреса в ric(объект)
}
он подключается к ric, выводит в терминал компьютера mac адрес, но не выполняет publishMAC(),(т. е. игнорирует эту функцию) с чем может быть связана данная проблема?

Здравствуйте.

Из вашего кусочка кода сложно сказать в чем может быть причина.

Вы уверены, что он подключается к RIC ? Статус объекта становится онлайн (зеленый круглый индикатор)?

image

image

Если подключение точно есть попробуйте добавить проверку и явное определение топика и пайлоада с мак в publishMAC()

void publishMAC() {
  // Что нибудь типо такого
  const char* topic = "your/topic";
  const char* payload = "mac_payload";
  
  if (client.publish(topic, payload)) {
    Serial.println("Publish successful");
  } else {
    Serial.println("Publish failed");
  }

После чего попробуйте включить отображение в платформе поулчаемых пакетов в виде кода. Если данные будут доходить, даже если не настроена модель вы это увидите

image

Когда то раньше, когда работал с Ардуино у меня был такой шаблон который позволял мне локализовывать проблему, может что-то пригодиться

#include <SoftwareSerial.h>
#include <PubSubClient.h>
#include <WiFi.h>

// Замена SoftwareSerial на соответствующий пин для вашего оборудования
SoftwareSerial mySerial(10, 11); // RX, TX

// Настройка WiFi и MQTT
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "your_MQTT_SERVER";

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(115200);
  mySerial.begin(9600); // Убедитесь, что скорость соответствует вашему модулю

  // Настройка WiFi
  setup_wifi();
  
  // Настройка MQTT
  client.setServer(mqtt_server, 1883);
  
  // Другие необходимые настройки
}

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
 
  String clientId = "your_CLIENTID";
  
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Попробуйте подключиться
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  delay(3000);

  publishMAC(); 
}



void publishMAC() {
  const char* topic = "your_topic";
  const char* payload = "your_payload";
  
  if (client.publish(topic, payload)) {
    Serial.println("Publish successful");
  } else {
    Serial.println("Publish failed");
  }
}

1 лайк

есть код:
#define mySerial Serial2
void setup() {
mySerial.begin(9600); // Устанавливаем скорость последовательной связи Bluetooth модуля
Serial.begin(9600); // Устанавливаем скорость основной последовательной связи
Serial.println(“Hello”);
delay(300);
mySerial.println(“AT”);
delay(500);
mySerial.println(“AT+VERR?”);
delay(500);
mySerial.println(“AT+RENEW”);
delay(1000);
mySerial.println(“AT+RESET”);
delay(1000);
mySerial.println(“AT”);
delay(500);
mySerial.println(“AT+ROLE1”);
delay(1000);
mySerial.println(“AT+IMME1”);
delay(1000);
mySerial.println(“AT+RESET”);
delay(1000);
mySerial.println(“AT+FILT0”);
delay(2000);
mySerial.println(“AT+DISI?”);
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
В результате его работы выводится:
Hello
OK
HMSoft V610
OK+RENEW
OK+RESET
OK
OK+Set:1
OK+Set:1
OKOK+DISIS
OK+DISC:00000000:00000000000000000000000000000000:0000000000:78BD64284478:-059
OK+DISC:00000000:00000000000000000000000000000000:0000000000:F0AE661416A0:-043
OK+DISC:4C000215:74278BDA212910FF8F0C720EAF059935:FFE0FFE1C5:8801F98CCAF4:-075
OK+DISC:00000000:00000000000000000000000000000000:0000000000:485DBDEA9F04:-069
OK+DISCE
Нужно сохранить в переменную строчку: 4C000215:74278BDA212910FF8F0C720EAF059935:FFE0FFE1C5:8801F98CCAF4:-075
Есть ли какой-то простой и удобный способ? Я пытался считывать каждую строку, но из-за этого очень сильно замедлился вывод этих строчек.

А что это вообще за строка? Это MAC адрес Bluetooth устройства?

Как будто в рамках данного кода выглядит так, что слушая последовательный порт не очень то удобно понять что поступают те данные которые удовлетворяют вашим требованиям и их нужно сохранить? Регулярок же нету в C - чтобы по какому то принципу разбирать строку? По какому принципу вы поинмаете что вам нужно сохранить именно это “4C000215:74278BDA212910FF8F0C720EAF059935:FFE0FFE1C5:8801F98CCAF4:-075”

это bluetooth ibeacon адрес для модуля bluetooth hm 10 из документации
команда AT+DISI? выдает OK+DISC[P0:P1:P2:P3:P4], где P0: Factory ID
P1: iBeacon UUID
P2: Major Value
Minor Value
Measured Power
P3: MAC
P4: RSSI
P0 length is 8; P1 length is 32; P2 length is 10; P3 length is 12, P4 length is 4
P2 include Major Value (length 4);
Minor Value (length 4);
Measured Power (length 2)
в общем вместо Major Value, Minor Value, Measured Power я хочу передавать значения датчиков и отправлять с помощью hm 10 на другую плату и после уже отправлять их на ric, используя gsm модем

1 лайк

Ну если у вас всегда будет одна платка в проекте использоваться и вы точно уверенны, что ее Factory ID = 4C000215 то может так закастылить? Ну или расширить проверку еще и по UUID…

#define mySerial Serial2

String buffer = "";
String targetString = "";

void setup() {
  mySerial.begin(9600); // Устанавливаем скорость последовательной связи Bluetooth модуля
  Serial.begin(9600); // Устанавливаем скорость основной последовательной связи
  Serial.println("Hello");
  delay(300);
  mySerial.println("AT");
  delay(500);
  mySerial.println("AT+VERR?");
  delay(500);
  mySerial.println("AT+RENEW");
  delay(1000);
  mySerial.println("AT+RESET");
  delay(1000);
  mySerial.println("AT");
  delay(500);
  mySerial.println("AT+ROLE1");
  delay(1000);
  mySerial.println("AT+IMME1");
  delay(1000);
  mySerial.println("AT+RESET");
  delay(1000);
  mySerial.println("AT+FILT0");
  delay(2000);
  mySerial.println("AT+DISI?");
}

void loop() {
  while (mySerial.available()) {
    char c = mySerial.read();
    buffer += c;

    if (c == '\n') {
      Serial.print(buffer); 

      // Проверяем, содержит ли строка целевой шаблон
      if (buffer.startsWith("OK+DISC:4C000215:")) {
        targetString = buffer; // Сохраняем строку в переменную
      }

      buffer = "";
    }
  }

  while (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

1 лайк