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

См. SoftSerial Example.
Последовательный порт 'COM3' занят. Попробуйте выйти из программ, которые могут его использовать.
https://www.arduino.cc/en/tutorial/SoftwareSerialExample
Причем неважно, подключен ли jdy-40 или нет
Давайте так: я завяжу вам глаза, приведу в зоопарк и попрошу угадать, что за зверь сидит в клетке. У него есть хвост!
Вот сейчас в эту же самую позу Вы ставите всех нас.
#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()); }подключение как на схеме, ардуино нано, при заливке скетча говорит, что порт занят, причем неважно, подключен модуль или нет, на других скетчах такого нет
строчки с 9 по 11 удалите, попробуйте снова
Скетч залился, в мониторе порта пишет "åþòüÿ", cs на земле, set на 5в.
На 57600 пишет "Goodnight moon!", на 4800 пусто, почему в примере скорости ставятся разные?
Потому что это два разных "канала". С одной стороны в первый softserial->jdy40 что-то должно запихиваться, а с другой из jdy40->softserial это что-то должно вылезать.
Потому что это порты разные.
yeee... вы чего хотели-то? - две арджуины соединить? - ну так скетч надо залить в две разных ардуины, с одной что-нибудь послать, на другую принять...
если ты в настройках модулей ничего не менял, поменяй 18 строчку на
mySerial.begin(9600);
Можно по разному. Например, с программным свитчем, но я предпочитаю ставить аппаратный. Тогда скетч один для приёмника и передатчика. Но два скетча - это дебилизьм, ИМХО.
Вроде разобрался, но есть проблемы. Модуль не хочет выходить в 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()); }а на приемнике только этот код или вы выдрали его из большой программы?
Вообще подобный код у меня работал абсолютно стабильно...
Вот именно что только этот код приема и все! Не знаю, пробовал на разных расстояниях от пары сантиметров до 50 метров через стены, никаких закономерностей нет. Надоело бороться с этим модулем, иду спать. Есть теории, что проблема кроется в неверно подобранных командах Serial.read/flush/write и др., в некачественной пайке или может еще чего, хз. Довольно странно и то, что в режим АТ команд модуль не хочет никак переходить (ну по сути передача данных останавливается, но ни на одну из инструкций не реагирует)
и да, вот здесь
должна быть двоечка после Т, это так, к слову
Модуль не хочет выходить в AT команды, ставлю set на землю
не забывай про это
the JDY -40 module sends the AT instruction need to end the symbol \r\n
я тоже с этим долго бился, а потом мануально отправил "AT+BAUD\r\n" и получил наконец-то отклик
Ну... модуль просто выдает непрерывное START
Если честно, я в тупике. Пойду перепаяю пятачки что-ли...
В общем, я перегрел один модуль и оторвал дорожку. Ну и хрен с ним, всё равно ничего не вышло :) (@%!бись перепаял пятачки)