Взаимодействие 2 ардуино

Тема в разделе "Arduino & Shields", создана пользователем TebEnkov2222, 3 май 2019.

?

Как вы относитесь к контроллерам Wavgat?

  1. Такой же как и ардуино

    0 голосов
    0,0%
  2. Убогий контроллер

    25,0%
  3. Не знаю, не пробовал

    62,5%
  4. Купи нормальную ардуину

    12,5%
  1. TebEnkov2222

    TebEnkov2222 Гик

    У меня проблема при соединении двух ардуин (uno r3 и wavgat nano 3.0 (ну простите, другого нету)). Передача осуществлена по юарт с помощью software. Они общаются, если сделать очень простую передачу данных:
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial in(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      in.begin(9600);               // Скорость обмена данными с модемом
      in.println("AT");
    }

    void loop() {
      if (in.available())           // Ожидаем прихода данных (ответа) от модема...
        Serial.write(in.read());    // ...и выводим их в Serial
      if (Serial.available())           // Ожидаем команды по Serial...
        in.write(Serial.read());    // ...и отправляем полученную команду модему
    }
    При вводе на одном, на втором выводится то что ввел. Это все понятно. Но как мне брать вычисления? Основной контроллер - уна. Ваугат как косвенный. Уна отправляет запрос на косвенный контроллер. Тот в соответствии с запросом или игнорирует или отвечает. Я пытался сделать таким образом:
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial input(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    int num = 12;
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      input.begin(9600);               // Скорость обмена данными с модемом
      input.println("AT");
    }

    void loop() {
      if (input.available()) {          // Ожидаем прихода данных (ответа) от модема...
        Serial.write(input.read());    // ...и выводим их в Serial
        int readInput = input.read();
        if (readInput == 'x'){
           input.write('1');
        }
      }
      if (Serial.available())           // Ожидаем команды по Serial...
        input.write(Serial.read());    // ...и отправляем полученную команду модему
       
    }
    На уне остался тот же код. При вводе 'x' ничего не происходит. если вывести в сериал значение readInput, то выводится квадратик. Помогите. Что я делаю не так? (или может контроллер настолько отсталый)
     
  2. Airbus

    Airbus Радиохулиган Модератор

    1Нахрена 2Сериала?
    2Где установка бодрейта Софтсериала?
    3Что такое in.println?
    4Что такое input.println?
     
  3. TebEnkov2222

    TebEnkov2222 Гик

    1. Два сериала потому, что через один юарт не работает нифига. Мне нужно и данные на комп выводить, и данными между мк передавать. А он за место достоверных данных мне одни квадратики выдает. Потому я и подключил библиотеку SoftwareSerial.h
    2. input.begin(9600);
    3, 4 in.println("AT"); это вывод первой команды ( ат команды с sim800l взята, потому я и первый код тоже от туда взял) [вывод с переносом строки]
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Нет такой команды input.begin(9600); и такой как input.println нет.
    Sofwareserial.begin(9600); есть.
     
  5. TebEnkov2222

    TebEnkov2222 Гик

    А Это тогда что?
    Я же не придумал это все. В софтверсериал есть и begin, и print, и println. Кучу команд у этой библиотеки. Вот функции у данной библиотеки

    Я дал название подключению библиотеки software serial (SoftwareSerial input(8, 9)). По этому за место software serial я пишу input. команды остались те же самые.
     
    Последнее редактирование модератором: 5 май 2019
  6. parovoZZ

    parovoZZ Гуру

    кто выдает квадратики??? МК только цифры выдает.
     
  7. TebEnkov2222

    TebEnkov2222 Гик

    upload_2019-5-4_12-44-56.png
    (поянение. Снизу wavgat, сверху уна)
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial input(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    int num = 12;
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      input.begin(9600);               // Скорость обмена данными с модемом
      input.println("AT");
    }

    void loop() {
      if (input.available()) {          // Ожидаем прихода данных (ответа) от модема...
        Serial.write(input.read());    // ...и выводим их в Serial
        int readInput = input.read();
        Serial.write(readInput);
        if (readInput == 'x'){
           input.write('1');
        }
      }
      if (Serial.available())           // Ожидаем команды по Serial...
        input.write(Serial.read());    // ...и отправляем полученную команду модему
       
    }
     
  8. Airbus

    Airbus Радиохулиган Модератор

    И?Вы считаете если Sofwareserial назвать к примеру Шляпой то Шляпа будет работать как Sofwareserial?Что/Кто мешает в коде писать Sofwareserial?Разницу между mySerial.begin(9600);и in.begin(9600); не чувствуете?В первом случае всё же какой никакой Serial устанавливает бод 9600 а во втором вообще пустой оператор ничего не делает и скорость устанавливается от Балды (даже не знаю сколько там по умолчанию)и поэтому принимаются кракозяблы.Да и потом то что пришло не надо разве собирать в строку например?

    А так?
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      mySerial.begin(9600);               // Скорость обмена данными с модемом
      mySerial.println("AT");
    }

    void loop() {
      if (mySerial.available())           // Ожидаем прихода данных (ответа) от модема...
        Serial.write(mySerial.read());    // ...и выводим их в Serial
      if (Serial.available())           // Ожидаем команды по Serial...
        mySerial.write(Serial.read());    // ...и отправляем полученную команду модему
    }
     
    Последнее редактирование модератором: 5 май 2019
  9. TebEnkov2222

    TebEnkov2222 Гик

    Грубо говоря это то же самое, что и мой код. Только вы назвали подключение myserial, а я input (in).
    Ну прошью я. Покажу, что ничего не изменится

    Это то у меня работает. Мне нужно как то данные с вава передавать на уну, чтобы уна принимала их. ТО есть. Допустим мне нужно из переменной передать число по софтсериалу (допустим 20) Уна это число должна принять и обработать (то есть занести в свою переменную) Как мне это сделать?

    На счет этого. Кракозябры в последнем случае, что я скинул это int, который я принял с ввода и вывожу в сериал, чтобы посмотреть, что вышло. Там должен быть индекс символа я так понимаю, но почему то ничего нету. (Кстати, я понял почему так происходит. Потому что нужно сперва введые данные принимать в переменную, а уже потом обрабатывать, а не наоборот, как было изначально. Я сперва выводил то, что принял, потом в переменную заносил, а потом обрабатывал. ТАК НЕЛЬЗЯ (если кого то такие же проблемы будут). Вот порядок: 1. приняли и занесли в переменную 2. выведи на экран если надо 3. обработали)
     
    Последнее редактирование модератором: 5 май 2019
  10. parovoZZ

    parovoZZ Гуру

    там цифры на самом деле. Квадратики это ваша абдурина выдает. МК не при делах.
     
  11. TebEnkov2222

    TebEnkov2222 Гик

    Часть 2. Почему так происходит? Контроллер снизу отправляет данные 225,74. Почему уна его дробит на 2 числа? (есть предположение, что передается только от -128 до 128)
    upload_2019-5-4_22-12-7.png
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial input(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    String comStr = "";
    bool priem = false;
    long tm;
    float str;
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      input.begin(9600);               // Скорость обмена данными с модемом
      input.println("AT");
    }

    void loop() {
      if (input.available()){           // Ожидаем прихода данных (ответа) от модема...
        char com = input.read();
        comStr = comStr + com;
        int leng = comStr.length();
        //Serial.print(leng);
        //Serial.write(' ');
        //Serial.write(com);    // ...и выводим их в Serial
        //Serial.write("   ");
        priem = true;
     
      } else{
        if (comStr != ""){
          if ( comStr.toFloat() != 0) str = comStr.toFloat();
          if (str != 0){
            Serial.println(str);
            str = 0;
          }

          comStr = "";
        }
      }
      if (Serial.available())           // Ожидаем команды по Serial...
        input.write(Serial.read());    // ...и отправляем полученную команду модему
      if (millis() - tm > 5000){
        input.write('t');
        tm = millis();
      }
    }
    const char* IntToChar (unsigned int v) {
      char buffer [20];
      sprintf(buffer, "%d", v);
      return buffer;
    }
    const char* intToStr(int x){
      char b[5];
      String str;
      str=String(x);
      str.toCharArray(b,2);
      return b;
    }
     
    Код (C++):
    #include <SoftwareSerial.h>
    #include <HX711_ADC.h>
    SoftwareSerial input(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    HX711_ADC LoadCell(4, 5);
    int num = 12;
    long t;
    float testFloat = 12.85,
          wt = 0;
    char msgBuffer[20];           // убедитесь что стройки размера хватит
    char *pointer_to_created_string;
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      input.begin(9600);               // Скорость обмена данными с модемом
      input.println("AT");
      LoadCell.begin();
      long stabilisingtime = 2000;
      LoadCell.start(stabilisingtime);
      LoadCell.setCalFactor(696.0); // user set calibration factor (float)
      Serial.println("Startup + tare is complete");
    }

    void loop() {
    LoadCell.update();
      if (millis() > 250) {
      tenzo();
      }
    ;
      if (input.available()) {          // Ожидаем прихода данных (ответа) от модема...
        //Serial.write(input.read());    // ...и выводим их в Serial
        char readInput = input.read();
        //Serial.write(readInput);
        pointer_to_created_string = dtostrf(wt, 6, 2, msgBuffer);
        if (readInput == 'x'){
          input.println(testFloat);
        }
        if (readInput == 't'){
          Serial.println(wt);
          input.write(pointer_to_created_string);
        }
      }
      if (Serial.available())           // Ожидаем команды по Serial...
        input.write(Serial.read());    // ...и отправляем полученную команду модему
     
    }
    void tenzo(){
      wt = LoadCell.getData();
    }
    подключил тензодатчик и передаю вес в граммах.
     
  12. parovoZZ

    parovoZZ Гуру

    МК ничего не знает про граммы. Поэтому передавать надо в величанах, понятных МК. А уже на приемной стороне приводить к виду, который удобен для восприятия.
     
  13. TebEnkov2222

    TebEnkov2222 Гик

    А подробнее пожалуйста