Как правильно составить скетчи для передачи данных между двумя ардуино с jdy-40?

yeee
Offline
Зарегистрирован: 17.08.2019

Здравствуйте, приобрел недавно пару модулей jdy-40, нужно составить шаблон для нормальной передачи данных между двумя ардуино, использующие jdy-40 в качестве приемника\передатчика, без участия ПК. Все подключил согласно этой схеме, cs на 3.3 в, set на земле (т. к. изменять стандартные параметры модуля не вижу смысла), tx-rx, rx-tx. (На двух ардуино - уно и нано). 

Я никогда ранее не передавал данные между двумя ардуино по UART, ни по проводу, никак. Можете помочь, приведя шаблоны скетчей передачи данных для приемника/передатчика. Я пробовал сам изменить примеры из сети для передачи данных по проводу, но, как понимаете, ничего не вышло :) (руки потому что кривые и мозг не туда впихнут) Поможете?

sadman41
Offline
Зарегистрирован: 19.10.2016

См. SoftSerial Example.

yeee
Offline
Зарегистрирован: 17.08.2019

Последовательный порт 'COM3' занят. Попробуйте выйти из программ, которые могут его использовать.

https://www.arduino.cc/en/tutorial/SoftwareSerialExample

Причем неважно, подключен ли jdy-40 или нет

sadman41
Offline
Зарегистрирован: 19.10.2016

Давайте так: я завяжу вам глаза, приведу в зоопарк и попрошу угадать, что за зверь сидит в клетке. У него есть хвост!

Вот сейчас в эту же самую позу Вы ставите всех нас.

yeee
Offline
Зарегистрирован: 17.08.2019

#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(10, 11); // RX, TX
 
void setup()  
{
  // Инициализируем последовательный интерфейс и ждем открытия порта:
  Serial.begin(57600);
  while (!Serial) {
    ; // ожидаем подключения к последовательному порту. Необходимо только для Leonardo
  }
 
 
  Serial.println("Goodnight moon!");
 
  // устанавливаем скорость передачи данных для последовательного порта, созданного 
  // библиотекой SoftwareSerial
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}
 
void loop() // выполняется циклически
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

подключение как на схеме, ардуино нано, при заливке скетча говорит, что порт занят, причем неважно, подключен модуль или нет, на других скетчах такого нет

b707
Offline
Зарегистрирован: 26.05.2017

строчки с 9 по 11 удалите, попробуйте снова

yeee
Offline
Зарегистрирован: 17.08.2019

Скетч залился, в мониторе порта пишет "åþòüÿ", cs на земле, set на 5в.

yeee
Offline
Зарегистрирован: 17.08.2019

На 57600 пишет "Goodnight moon!", на 4800 пусто, почему в примере скорости ставятся разные?

sadman41
Offline
Зарегистрирован: 19.10.2016

Потому что это два разных "канала". С одной стороны в первый softserial->jdy40 что-то должно запихиваться, а с другой из jdy40->softserial это что-то должно вылезать.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Потому что это порты разные.

yeee
Offline
Зарегистрирован: 17.08.2019

что дальше? 

b707
Offline
Зарегистрирован: 26.05.2017

yeee... вы чего хотели-то? - две арджуины соединить? - ну так скетч надо залить в две разных ардуины, с одной что-нибудь послать, на другую принять...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

если ты в настройках модулей ничего не менял, поменяй 18 строчку на 

mySerial.begin(9600);

Green
Offline
Зарегистрирован: 01.10.2015

Можно по разному. Например, с программным свитчем, но я предпочитаю ставить аппаратный. Тогда скетч один для приёмника и передатчика. Но два скетча - это дебилизьм, ИМХО.

yeee
Offline
Зарегистрирован: 17.08.2019

Вроде разобрался, но есть проблемы. Модуль не хочет выходить в AT команды, ставлю set на землю, подключаю к ноутбуку, захожу в монитор порта, скорость монитора порта 9600 бод, NL & CR, пробовал заменить с софтверного сериала на аппаратный к выводам rx tx на самой ардуино, эффекта ноль. И при передаче данных нехило так зажевывает данные. При передаче с одной ардуины на другую "start", три показания с датчиков, "end" идет полнейшая чушь. Вместо start str, sar, и прочее, из трехзначного числа с датчика приходит лишь один или два, в общем, никуда не годится

Передатчик

#include <SoftwareSerial.h> 
#include <SFE_BMP180.h>
#include <Wire.h>
#include <DHT.h>

SFE_BMP180 pressure;  
int DHTPIN = 2;
DHT dht(DHTPIN, DHT22);

SoftwareSerial mySerial(6, 7);

void setup() {
 // Serial.begin(9600);
  dht.begin();
  pressure.begin();
  mySerial.begin(9600);
}

void loop() { 
  int h = dht.readHumidity(); //Измеряем влажность
  int t = dht.readTemperature(); //Измеряем температуру
  double T,P;
  
  mySerial.println("start");
  mySerial.println(h);
  mySerial.println(t); 
  pressure.getPressure(P, T);
  mySerial.println(P,2);
  mySerial.println("end");

  delay(5000);
}

Приемник

#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(6, 7); // RX, TX
 
void setup()  
{
  Serial.begin(57600);
  Serial.println("Hello!");
  mySerial.begin(9600);

}
 
void loop()
{
  if (mySerial.available())
    Serial.write(mySerial.read());
}

 

yeee
Offline
Зарегистрирован: 17.08.2019

b707
Offline
Зарегистрирован: 26.05.2017

а на приемнике только этот код или вы выдрали его из большой программы?

Вообще подобный код у меня работал абсолютно стабильно...

yeee
Offline
Зарегистрирован: 17.08.2019

Вот именно что только этот код приема и все! Не знаю, пробовал на разных расстояниях от пары сантиметров до 50 метров через стены, никаких закономерностей нет. Надоело бороться с этим модулем, иду спать. Есть теории, что проблема кроется в неверно подобранных командах Serial.read/flush/write и др., в некачественной пайке или может еще чего, хз. Довольно странно и то, что в режим АТ команд модуль не хочет никак переходить (ну по сути передача данных останавливается, но ни на одну из инструкций не реагирует)

yeee
Offline
Зарегистрирован: 17.08.2019

и да, вот здесь

 pressure.getPressure(P, T);

должна быть двоечка после Т, это так, к слову

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

yeee пишет:

Модуль не хочет выходить в AT команды, ставлю set на землю

не забывай про это

the JDY -40 module sends the AT instruction need to end the symbol \r\n

я тоже с этим долго бился, а потом мануально отправил "AT+BAUD\r\n" и получил наконец-то отклик

yeee
Offline
Зарегистрирован: 17.08.2019

Ну... модуль просто выдает непрерывное START

Если честно, я в тупике. Пойду перепаяю пятачки что-ли...

yeee
Offline
Зарегистрирован: 17.08.2019

В общем, я перегрел один модуль и оторвал дорожку. Ну и хрен с ним, всё равно ничего не вышло :) (@%!бись перепаял пятачки)