Помогите с Serial

gzp13
Offline
Зарегистрирован: 06.04.2015

//////Код ведомой ардуины////////

#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 7); // RX, TX
void setup () 
{Serial.begin(57600);
mySerial.begin(4800);
}
void loop() {
int t=// тут информация с датчика температуры
int h=// тут информация с датчика влажности
mySerial.write(t);
mySerial.write(h);
}

///////Код ведущей ардуины/////////
#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 7); // RX, TX
void setup () 
{Serial.begin(57600);
mySerial.begin(4800);
}
void loop() {
if(mySerial.available())
{
Serial.println( mySerial.print(h));
Serial.println( mySerial.print(t));
}

Здравствуйте, имеются 2 ардуины, соеденены между собой по SoftSerial, так вот, мне необходимо с одной ардуины передать температуру и влажность на другую ардуину чтобы та вывела информацию на LCD дисплей. Я не пойму как мне передать сигнал температуры и влажности с одной платы на другую. Код набросал такой, но передачи нет.

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

мошт, передача и есть, только вы не читаете на ведущей ардуине СофтСериал, а пишете в него зачем-то.  Куда-то надо вставить read();   :)

gzp13
Offline
Зарегистрирован: 06.04.2015

//////Код ведомой ардуины////////

#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 7); // RX, TX
void setup () 
{Serial.begin(57600);
mySerial.begin(4800);
}
void loop() {
int t=// тут информация с датчика температуры
int h=// тут информация с датчика влажности
mySerial.write(t);
mySerial.write(h);
}

///////Код ведущей ардуины/////////
#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 7); // RX, TX
void setup () 
{Serial.begin(57600);
mySerial.begin(4800);
}
void loop() {
if(mySerial.available())
{
data=mySerial.read();
Serial.println( mySerial.print(h));
Serial.println( mySerial.print(t));
}

точно,не указал, в 25 строке у меня есть data=mySerial.read();

Но как мне из data выделить конкретно температуру и влажность., а то в Serial.print в COM порту поочередно выводятся данные о температуре и влажности,  а мне надо на LCD выводить отдельно температуру, и отдельно влажность. Я так понимаю надо побитово считывать информацию с data.

uno
Offline
Зарегистрирован: 16.06.2016

Перед температурой пиши символ"Т" при чтени по нему определяй и его убирай. ил можеш писать влажность с % если есть символ проценты то ето влажность и выводи с этим символом

gzp13
Offline
Зарегистрирован: 06.04.2015

Ничего не понял) Можно поконкретней с примером?)

типа так mySerial.write("T",t);

а при чтении Serial.print(T);

бред получается) не работает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gzp13 пишет:

Ничего не понял) Можно поконкретней с примером?)

типа так mySerial.write("T",t);

а при чтении Serial.print(T);

бред получается) не работает

Выбросьте всю траву и не курите её больше, глядишь, перестанете бредить и всё начнёт получаться.

Почитайте про параметр функции write и напишите нормально.

uno
Offline
Зарегистрирован: 16.06.2016
    while (Serial3.available() > 0) 
    {
      s=Serial3.read();
       if (s=='^') {
        switch (Serial3.read()) {
          case '0':
            s0=""; str="0";Serial3.read(); break;
          case '1':
            s1=""; str="1";Serial3.read(); break;


     else {
          if (str=="1") { s1=s1+s; }
          else {
            if (str=="2") { s2=s2+s; }
            else {
            if (str=="3") { s3=s3+s; }
            else {
            if (str=="0") { s0=s0+s; }


     u8g.setPrintPos(0, 35);
     u8g.print(s1);
     u8g.setPrintPos(0, 60);
     u8g.print(s2);

 

uno
Offline
Зарегистрирован: 16.06.2016

Отправляется строка вида ^1:текст выводится в 1 строку если 2 выводится во вторую строку. куски кода надергал с разных мест дооформить

gzp13
Offline
Зарегистрирован: 06.04.2015

мне нужно выводить данные с датчиков, а они постоянно обновляются, поэтому if s==чему ио тут не подходит.

uno
Offline
Зарегистрирован: 16.06.2016

У меня эта конструкция работает как дисплей покупателя выводя даные с весов с интервалом в пол секунды. передовай информацию с датчиков с нужным тебе интервалом и выводи. Врят ли у тебя температура и влажность меняются очень быстро и нужно менять показания чаще чем раз в надсать секунд.

gzp13
Offline
Зарегистрирован: 06.04.2015

Так я бы вывел, но только не получается.

gzp13
Offline
Зарегистрирован: 06.04.2015

//////Код ведомой ардуины////////

#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 7); // RX, TX
int t;
int h;
void setup () 
{Serial.begin(57600);
mySerial.begin(4800);
}
void loop() {
int t=// тут информация с датчика температуры
int h=// тут информация с датчика влажности
mySerial.write(t);
mySerial.write(h);
}

///////Код ведущей ардуины/////////
#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 7); // RX, TX
int t;
int h;
void setup () 
{Serial.begin(57600);
mySerial.begin(4800);
}
void loop() {
if(mySerial.available())
{
data=mySerial.read();
Serial.println(( mySerial.print(t));
Serial.println( mySerial.print(t));
}

Попробовал так, опять не работает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gzp13

а Вы бы не потрудились выкладывать именно те коды, котрые запускаете, а не какой-то бред?

В том коде. что Вы называете "ведущей" в строке 30 используется переменная data, которая нигде не описана. Этот код не может компилироваться! В том же самом коде Вы печатаете t но ничего её не присваиваете.

Напишите нормально что Вы хотите делать (словами) и потом (только потом) чётко слово в слово переписывайте в виде программы.

gzp13
Offline
Зарегистрирован: 06.04.2015
#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 7); // RX, TX
#include "DHT.h"
#define DHTPIN 2 
DHT dht(DHTPIN, DHT22);
 int h;
int t;
void setup () 
{Serial.begin(57600);
mySerial.begin(9600);
dht.begin();
}
void loop() {
 float t = dht.readTemperature();    
float h = dht.readHumidity();
  mySerial.write(h);
mySerial.write(t);
}
}
 Это кодпередающей ардуины

 

gzp13
Offline
Зарегистрирован: 06.04.2015
#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 7); // RX, TX
int incomingByte =0;
int t;
int h;
void setup ()
{
  Serial.begin(57600);
  mySerial.begin(9600);
}
void loop()
{
if(mySerial.available()){
incomingByte = mySerial.read();
// вот тут мне надо вывести данные о влажности и температуре с передающей ардуины
// (т.е float t и float h) на lcd и в com порт
}

это код приемной ардуины

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. мой совет сначала написать словами послан "на"? Ну, тогда продолжайте своё творчество, удачи. Вы, например, знаете какого типа параметр должет быть у функции write? Вы ей в 16 и 17 строках пихаете float, это правильно? Она его нормально переваривает?

gzp13
Offline
Зарегистрирован: 06.04.2015

Нда, оригинально тут помогают.Видимо такие же специалисты как и я.

uno
Offline
Зарегистрирован: 16.06.2016

Врайт зачем юхаете это бинарные данные вам надо Принт

Вам правельно написали напишите словами что хотите потом это переводим в команды. сразу в командах у вас както совсем плохо получается

uno
Offline
Зарегистрирован: 16.06.2016

как вариант тупо соедините 4 проводами и передовайте температуру и влажность на разные порты

uno
Offline
Зарегистрирован: 16.06.2016

Инт А=0; флоат В=0;
Если А!=В Тогда

Принт ("О блин в програмировании ноль не равен нулю);

gzp13
Offline
Зарегистрирован: 06.04.2015

Объясняю, на одну ардуину через модуль NRF24L01 поступают данные о температуре и влажности.Эта ардуина через uart подсоединена к другой ардуине(сделал так потому что не хватает пинов).Далее ардуина на которую приходят данные о температуре и влажности должна через uart отправить эти данные на другую ардуину, которая подключена к дисплею.Так вот, я не понимаю как мне конкретно отправлять температуру и влажность, чтобы я на приемной ардуине мог опознать что это температура и отправить ее куда надо, а это влажность.Например вот на молулях на 433Мгц все поеятно, указываю в передающей ардуине данные, соответственно в приемной тоже, и все, отправил ткмпературу, на приемнике принял. А вот через serial не получается, как ухазать что мне нужна температура и влажность?

uno
Offline
Зарегистрирован: 16.06.2016

Используй принт. при передаче и передовай сразу два значения.

Т-температура

В-влажность

Передаем Т*1000+В;

При приеме разбирай.

gzp13
Offline
Зарегистрирован: 06.04.2015

А можно поконкретней?) с примером.

gzp13
Offline
Зарегистрирован: 06.04.2015

Типа так

С передающей Serial.print(t), Serial.print(h)

А как я на приемной ардуине пойму где эти сигналы?

uno
Offline
Зарегистрирован: 16.06.2016

Serial.Print(1000+T)

Serial.Print(H)

На приемной стороне читаеш значение Если меньше или равно 100 (влажность небывает больше 100) то это влажность. если больше то отнимаеш 1000 и получаеш свою температуру

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gzp13 пишет:

Нда, оригинально тут помогают.

Вам невозможно помочь. Вам говоришь "сделай это" - Вы плюёте, не делаете и требуете пример (то бишь готовый код).

Вы, похоже, не понимаете разницы между помочь и сделать за Вас.

gzp13 пишет:

Видимо такие же специалисты как и я.

Да, Господь с Вами! Нам до Вас - как эйтимеге до интель ксеона

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Я добрый с утра. Хорошо день начался, вчера сделал прекрасное песто, обнаружив в Ашане зеленый базилик. ;)

Так что объясню. Только на словах, без кода, ессно. Код - стоит денег.

Если ТС нихера не поймет, вероятность чего 99%, то это его траблы.

------------------------------

1. Метод write(), класса Print, от которого унаследован и сериал и софт-сериал, подразумевает аргумент типа uint8_t ож же byte, он же unsigned char, и НИКАКОГО ДРУГОГО.

2.  Сериал, что хард, что софт, передает данные посимвольно и собирать их в кучу нужно посимвольно.

3. класс сериал, и софт тоже, унаследован от Stream, который содержит методы для приема чисел. Чтобы не ипать моск, собирая числа посимвольно.

Возможно некоторые из них, которые все равно уже скомпилированы  в Вашу прогррамму и размер ее не увеличат, будут полезны. Поглядите на parseInt и parseFloat.

 

Чечако
Offline
Зарегистрирован: 15.06.2018

Подниму тему, если позволите.

С записью в Serial строк все понятно, Serial.Print. А чтение у нас возможно только по байту, или сразу некий пакет целиком считать тоже есть варианты? В доке вижу только read, который читает побайтно. Не то, чтобы это было проблемой, но вдруг есть варианты? :)

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

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Варианты, конечно, есть.

Вот только "волшебных" среди них нет. (Ардуино не знает, что такое "пакет целиком")

5N62V
Offline
Зарегистрирован: 25.02.2016

Чечако пишет:

Подниму тему, если позволите.

С записью в Serial строк все понятно, Serial.Print. А чтение у нас возможно только по байту, или сразу некий пакет целиком считать тоже есть варианты? В доке вижу только read, который читает побайтно. Не то, чтобы это было проблемой, но вдруг есть варианты? :)

Есть Serial.readbytes(), по идее он должен быть описан в той же доке, где и все остальные методы класса сериал. 

Чечако пишет:
И может есть готовые библиотеки протоколов передачи данных пакетами через uart, чтобы велосипед не изобретать? Гугл навскидку не помог.

от задачи все зависит. Если задача передать 4 байта из состава переменной float какого-нить датчика - Вам протокол сто лет не нужен. В задачах посложнее может и нужен.  Я пишу протоколы самостоятельно по типу

признак начала пачки-счетчик пачки-длина пачки-сам пейлоад-контрольная сумма-признак конца пачки.

IVAN222
Offline
Зарегистрирован: 19.04.2017

gzp13

Почему Вы используете RX TX 6 и 7 пин? Если у Вас УНО или НАНО 2(RX) и 3(TX), если будете использовать пины 0 и 1 , то при компиляции скеча их нужно разрывать. 

Отправить данные t и h с одной ардуино на другую, считайте данные с датчика, заполните массив

data[0] = int(t); 
data[1] = int(h);
отправляем на 2 ардуино
radio.write(&data, sizeof(data));
Читаем данные на 2 ардуно
radio.read(&data, sizeof(data));                    
               Serial.print("Humidity:");             
               Serial.print(data[1]);
               Serial.print(" ");        
               Serial.print("Temperature:");
               Serial.print(data[0]);