Передача чисел между двумя платами через UART

Добрый день , создаю систему с помощью которой буду управлять светодиодом. Для этого использую три платы Arduino UNO: Управляющую, ИК-передатчик(используется UART), ИК-приемник(используется UART и модуль ИК-приемника 1838B). В значениях используются случайные числа , посредством генерации с использованием функции “random()”, возникла проблема при передаче случайных чисел(по UART передаются непонятные символы). Не знаю что с ними можно сделать . Используются ячейки памяти EEPROM для хранения информации.
Код управляющей платы.

#include <Wire.h>
#include <EEPROM.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#define RX 12
#define TX 13
SoftwareSerial mySerial(RX,TX);
const int but = 10;
const int but2 = 11;
const int but3 = 7;
const int but4 = 8;
int State;
int State2;
int State3;
int State4;
unsigned char b, n;

LiquidCrystal_I2C lcd(0x3F,16,2);
void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.print("C");
  lcd.print("O");
  lcd.print("N");
  lcd.print("T");
  lcd.print("R");
  lcd.print("O");
  lcd.print("L");
  pinMode(but,INPUT_PULLUP);
  pinMode(but2,INPUT_PULLUP);
  pinMode(but3,INPUT_PULLUP);
  pinMode(but4,INPUT_PULLUP);
  int State = 1;
  int State2 = 1;
  int State3 = 1;
  int State4 = 1;
  Serial.begin(9600);
  mySerial.begin(9600);
  randomSeed(analogRead(0));
 }
  void loop()
  {
    State3 = digitalRead(but3);//Создание случайного значения и запись его в ячейку памяти()
    if(State == LOW)
    {
      lcd.clear();
      b = random(10,255);
      EEPROM.update(0,b);
      n = EEPROM[0];
      }
     State = digitalRead(but);//Передача ключа на УА(Кнопка на 10 входе)
     if(State == LOW)
     {
      lcd.clear();
      lcd.print("1");
      Serial.println(n);
      Serial.setTimeout(1000);
      }
      State2 = digitalRead(but2);//Передача ключа на носитель(Кнопка на 11 входе)
      if(State2 == LOW)
      {
        lcd.clear();
        lcd.print("2");
        mySerial.println(n);
        mySerial.setTimeout(1000);
       }
        State4 = digitalRead(but4);//Принудительное открытие УА(Кнопка на 8 входе)
       if(State4 == LOW)
       {
        Serial.println('10');
        Serial.setTimeout(1000);
        lcd.clear();
        lcd.setCursor(1,0);
        lcd.print("D");
        lcd.print("I");
        lcd.print("S");
        lcd.print("T");
        lcd.print("A");
        lcd.print("N");
        lcd.print("C");
        lcd.print("E");
        lcd.print(" ");
        lcd.print("A");
        lcd.print("C");
        lcd.print("C");
        lcd.print("E");
        lcd.print("S");
        lcd.print("S");
        delay(5000);
        lcd.clear();
        
        }
      if(Serial.available())
      {
       char signID = Serial.read();
       if(signID == '1', signID != '0', signID != n , signID != b)
       {
        lcd.clear();
        lcd.setCursor(1,0);//Установка курсора в начало второй строки
        lcd.print("U");//Вывод текста на дисплее
        lcd.print("S");
        lcd.print("E");
        lcd.print("R");
        lcd.print(" ");
        lcd.print("1");
        lcd.setCursor(1,1);//Установка курсора в начало второй строки
        lcd.print("A");
        lcd.print("C");
        lcd.print("C");
        lcd.print("E");
        lcd.print("S");
        lcd.print(" ");
        lcd.print("G");
        lcd.print("R");
        lcd.print("A");
        lcd.print("N");
        lcd.print("T");
        lcd.print("E");
        lcd.print("D");
        delay(5000);
        lcd.clear();
       }
        else if(signID == '10', signID != '1', signID != n )//Сигнализация об аварии на линии
       {
        lcd.clear();
        lcd.setCursor(1,0);
        lcd.print("L");
        lcd.print("I");
        lcd.print("N");
        lcd.print("E");
        lcd.print(" ");
        lcd.print("F");
        lcd.print("A");
        lcd.print("I");
        lcd.print("L");
        lcd.print("U");
        lcd.print("R");
        lcd.print("E");
        delay(5000);
        lcd.clear();
       }
     } 
    }

Код ИК-передатчика(пульта)

#define cr_pin 9
#define RX 12
#define TX 13
#include <EEPROM.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(RX,TX);
const int BUT = 10;
int State = 1;
char n;
char a;
char m;
void setup() 
{
  pinMode(BUT,INPUT_PULLUP);
  Serial.begin(9600);
  mySerial.begin(9600);
  tone(cr_pin,38000);
}

void loop() 
{
  if(mySerial.available()>0)
  {
    m = mySerial.read();
    EEPROM.update(1,m);
    n = EEPROM [1];
    mySerial.println(n);
    mySerial.setTimeout(1000);
  }
    State = digitalRead(BUT);
    if(State == LOW)
  {
    EEPROM.update(3,'1');
    a = EEPROM[3];
    Serial.println(n);
    Serial.setTimeout(1000);
    Serial.println(a);
    Serial.setTimeout(1000);
  }
}

Код принимающей части

#include <EEPROM.h>
#include <SoftwareSerial.h>
#define  RX 12
#define  TX 13
SoftwareSerial mySerial(RX,TX);
unsigned char a , b , m ;
boolean c;
const int BUT = 11; 
const int ledPin = 10;
const int BUT2 = 9; 
int State = 1;
int State2 = 2;
void setup()
{
 Serial.begin(9600);
 mySerial.begin(9600);
 pinMode(ledPin, OUTPUT);
 pinMode(BUT, INPUT_PULLUP);
 pinMode(BUT2, INPUT_PULLUP);
 }
 void loop()
 {
   if(mySerial.available())//Принятие сигнала от РМО
   {
     m = mySerial.read();
     EEPROM.update(1,m);
     a = EEPROM [1];
     mySerial.setTimeout(1000);
     if(m == 10, m != c)//Дистанционное открытие стойки УА с РМО
     {
       digitalWrite(ledPin,HIGH);
     }
   }
    if(Serial.available())//Принятие сигнала от ИК-пульта
   {
     EEPROM.update(2,Serial.read());
     b = EEPROM [2];
     Serial.setTimeout(1000);
     EEPROM.update(3,Serial.read());
     c = EEPROM[3];
     Serial.setTimeout(1000);
     
     if(a == b, a != '0', b != '0')//Предоставление доступа с помощью ИК-пульта 
     {
       digitalWrite(ledPin, HIGH);
     }
     else if(c == '1', c != a, c != b )//Отправка информации о пользователе на РМО
     {
       mySerial.println(c);
       mySerial.setTimeout(1000);
     }
    }
     State = digitalRead(BUT);//Сигнализация об аварии на линии
     if(State == LOW)
     {
       mySerial.println(2,BIN);
       mySerial.setTimeout(1000);
     }
     State2 = digitalRead(BUT2);//Закрытие стойки
     if(State2  == LOW)
     {
       digitalWrite(ledPin, LOW);
       }
 }

Перепроектировать систему, чтобы одна Ардуина управляла тремя светодиодами.
Тогда необходимость в передаче через UART отпадет сама собой.

И еще: в следующий раз, когда будете задавать вопрос, не забудьте опубликовать схему.

Ну и в догонку: конструкция '10' скорее всего будет работать совсем не так, как Вы ожидаете.

1 лайк

В дополнению к сказанному коллегой.

Вы передаёте символы (функцией print), а принимать пытаетесь числа. Это не одно и то же.

Если хотите решить проблему (или чтобы кто-нибудь за морочился Вашим кодом) уберите из кода ВСЁ не имеющее отношение к проблеме. Всё - это значит ВСЁ - lcd, eeprom, всё! Оставьте только передачу по сериал. Код станет намного короче и разбираться будет не в пример легче. А когда отладитесь, тогда остальное добавите.

Ещё при передаче пробуйте не
mySerial.println(n);

а mySerial.write(n);

Можно подумать конструкция “S” будет работать нормально… Хотя работать то будет, но это извращение какое то.
В чем сакральный смысл вывода каждого символа отдельно ?
Чтоб дисплей не устал ?

А так, уже выше отметили.
Serial.print(“xxx”); шлёт в порт коды символов + конец строки .
А
Serial.write(xхх); непосредственно значение

Разобрался со значениями и решил пересылать их через кодировку , к примеру
Serial.write(‘1’) на выходе ИК-передатчика имеет код 62 , соответственно на приеме мы должны задать , что принимается код 62. Теперь главное правильно разобраться с условием

Могу ли я в языке задать значение a = b + 48?

можете

вообще-то глупость.
Больше похоже на то. что в итоге так и не разобрались, как посылать числа - поэтому решили посылать строчки.

а это что такое???

и вот это?

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

Условие сравнения
Но немного подумал и решил исправить на if(a == b && a != 0 &&b != 0)

Так что же все-таки по вашему означает запись a != 0, b != 0 ?
Почему вы добавили логическое “И” между первым и вторым условием, но оставили запятую между вторым и третьим?

Прошу прощения исправил.
А что по поводу EEPROM? В чем проблема такой записи? Я же считываю значение из записанной ячейки памяти

а зачем?
Сначала записываете в ЕЕПРОМ из одной переменной, потом тут же считываете в другую и печатаете ее. А сразу первую не проще напечать было?

Обычно делают так:

a=b+'0';//так сказать быстрое преобразование в char

А кто мешает пересылать Serial.write(1) на выходе ИК-передатчика имеет код 1 , соответственно на приеме мы должны задать , что принимается код 1?

Вы придерживаетесь какой-то специфической религии, которая это запрещает? Пастафарианец?

Да, кто ж Вас знает, можете Вы или нет. Этого, кроме Вас никто не знает :slight_smile:

А так разве можно? Serial.write(1)

Кому как. Мне можно, Вам - не знаю, может Ваша религия запрещает, я же не зря спросил про неё.