Ардуино получает данные датчиков от других arduino SPI

У меня есть Arduino Uno (отправитель) и Arduino Uno Wifi rev 2 (приемник). Я хочу отправить значение ping другому устройству через последовательные перемычки. Arduino Uno использует пример newping, и я хочу, чтобы Uno Wifi получал значение датчика и печатал его в последовательный порт. Я использую перемычки SoftwareSerial.h go TX<->RX , RX <-><->TX, GRD-GRD в соответствии с выводами на рисунке ниже.

Проблема заключается в коде скетча для Uno WiFi (приемника), он продолжает печатать мусор и иногда кажется, что возврата каретки нет.

13
⸮10
⸮52
⸮5LC⸮1⸮H⸮10
5⸮H⸮51
13C⸮10
⸮5⸮H⸮5LC⸮13
10
⸮52
51C⸮13
10
⸮52
5LC⸮13
⸮10C⸮52
⸮51
13
10
⸮52
50

Код на Uno (отправитель):

// ---------------------------------------------------------------------------
// Пример скетча библиотеки NewPing, который выполняет пинг примерно 20 раз в секунду.
// ---------------------------------------------------------------------------
#include <SoftwareSerial.h>
#include <NewPing.h>

#define TRIGGER_PIN  12  // Вывод Arduino привязан к выводу триггера на ультразвуковом датчике.
#define ECHO_PIN     11  // Вывод Arduino привязан к выводу echo на ультразвуковом датчике.
#define MAX_DISTANCE 200 // Максимальное расстояние, на которое мы хотим пинговать (в сантиметрах). Максимальное расстояние датчика расклассифицировано на 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
SoftwareSerial mySerial(9, 10); // RX, TX

void setup() {
  Serial.begin(115200); // Откройте последовательный монитор на 115200 бод, чтобы увидеть результаты ping.
  while (!Serial) {
    ; // дождитесь подключения последовательного порта. Требуется только для родного USB-порта
  }

 Serial.println("Hello World Serial");
 mySerial.begin(4800);
 mySerial.println("Hello World, mySerial");
}
void loop() {
  delay(500);                     // Ожидание 50 мс между пингами (около 20 пинг/сек). 29 мс должна быть самая короткая задержка между пингами.
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");
  mySerial.print(sonar.ping_cm());
  mySerial.println();
  }

код на uno wifi (приемник):

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // Откройте последовательную связь и дождитесь открытия порта:
  Serial.begin(115200);
  while (!Serial) {
    ; // дождитесь подключения последовательного порта. Требуется только для родного USB-порта
  }
  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  
}

void loop() { // run over and over
 
    Serial.println(mySerial.read());
    delay(1000);
  
}

Я вижу, что Uno (отправитель) с помощью NewPing печатает правильные данные на свой последовательный порт, но я не могу заставить Uno wifi (слушатель) получить то же значение. Это просто мусор. Я новичок в этом деле, что я делаю не так?

, 👍1

Обсуждение

уменьшите код отправителя ... отправляйте только фиксированные значения ... удалить весь код, который не связан с отправкой данных mySerial ... нет последовательного, нет сонара, @jsotola

Попробуйте заменить принимающую последовательную линию на if(mySerial.available()) Serial.write(mySerial.read());, @chrisl

Ну, я продвинулся немного дальше. Я использовал Serial.write и на получающем Arduino я получаю значения просто не правильные. Последовательный на отправителе передает значение - 32, на получающем arduino с - SonarReading=(mySerial.read()); Я получаю номера, такие как 240, 241, ..., @foxtrot22


1 ответ


1

Мне немного повезло после того, как я потратил на это весь день.

Arduino UNO (отправитель): Как упоминал крисл, используйте Serial.write, а не Serial.print

mySerial.write(sonar.ping_cm());

UNO Wifi (приемник):

Serial.println(mySerial.readString());

Итак, вместо mySerial.read Я использовал mySerial.ReadString. Это, скорее всего, очевидная ошибка почти для всех здесь присутствующих; мне потребовалось два дня. Вздох.

,