2 ардуино по Serial

Тема в разделе "Arduino & Shields", создана пользователем An4ous, 26 фев 2016.

  1. An4ous

    An4ous Нерд

    Привет.опишу немного то что я хочу сделать чтоб было понятно.
    Имеется 2 ардуинки НАНО и УНО. на Уно будет висеть tft с тачем. Нано будет увешен различными датчиками( темперетура, влажность и т.п) а также нарисую небольшое меню для управления электро устройствами (розетка, лампочка и т.п). возникли проблемы со связкой 2х ардуин. а именно с пониманием типов данных.
    допустим ставлю я себе задачу пока управлять лампочкой. есть у меня на дисплее кнопка(включить свет на первом светильнике) при нажатии на кнопку мне надо отправить по Serial слово "Light1On" вот тут и начинаются проблемы с передачей , по 1й цифре из примера ниже все передается, а вот слово как передать я не понимаю.
    пример из интернета
    Код (C++):
    int outputPin = 13;                //здесь храним номер контакта
    int val;                           //здесь будет храниться принятый символ

    void setup()
    {
      Serial.begin(9600);              //установка порта на скорость 9600 бит/сек
      pinMode(outputPin, OUTPUT);      //устанавливаем 13 контакт в режим вывода
    }

    void loop()
    {
      if (Serial.available()) {         //если есть принятый символ,
        val = Serial.read();            //  то читаем его и сохраняем в val
        Serial.println(val);
        if (val == '1') {               //  если принят симовол 'H',...
          digitalWrite(outputPin, HIGH);//  то включаем светодиод
        }
        if (val == '0') {               //  если принят симовол 'L',
          digitalWrite(outputPin, LOW); //    то выключаем светодиод
        }
      }
    }
    где копать, что исправить?
     
  2. Securbond

    Securbond Гуру

    Вам принципиальны символы?? Почему не отправлять
    11 - включение лампы номер1
    10- выключение
    21- включение лампы 2
    20 - выключение .... и т.д.
     
  3. An4ous

    An4ous Нерд

    В данном примере работает диапазон чисел от 0 до 9,
    Код (C++):
     if (val == "11")//уже не работает.
    что то компилятору уже не нравится при компиляции.
    С символьными данными работать легче, и может быть кто растолкует чтоб было понятно как работать с последовательными символьными данными
     
  4. Securbond

    Securbond Гуру

    Не спец в этом вопросе но точно знаю что символьные данные это string а вы запихиваете в int, а он числовой .
    И по поводу компиляции кавычки одинарные не пробовали как в примере ?
    Вам нужно почитать про Парсинг строк в ардуино, скорее всего и библиотека есть для этих целей.
     
  5. Onkel

    Onkel Гуру

    ну во первых
    '1'==0x33=49
    а "1" - это уже будет строка, или массив из двух элементов со значениями 49 и 0, если вы пишите что-то в " ", то компилятор автоматически добавляет терминатор строки 0. Соответсвенно "11" - это массив из трех unsigned char - {49,49,0}. Для сравнения строк вроде "11" нужно уже не ==, а функция strcmp(*string1,*string2).
    если у вас val Int, то компилятор не дает сравнивать int со строкой "11"
     
    Последнее редактирование: 26 фев 2016
  6. An4ous

    An4ous Нерд

    Действительно символьные данные нужно было совать в string, и ошибка пропадает.
    ух, голова моя боюсь не переварит это, хотя это только базовые основы. спасибо за объяснение о двойных кавычках. и про функцию такую не слышал. получается все что я отправляю на ардуину, она переводит в код согласно таблице ASCII ?

    нашел вот такой код. вроде работает как надо
    Код (C++):
    String bufer="";
    char ledPin = 13;

    void setup(){
      pinMode(ledPin, OUTPUT);
      Serial.begin(9600);
      Serial.println("arduino started");
    }

    void loop(){

      if (Serial.available() > 0) {
        char ByteRead=Serial.read();  //чтение данных с порта
        if (ByteRead==13) {  //возврат каретки
          analyzer();   //передача данных на обработку
          bufer="";
        }  //освобождение буфера
        else {
          ///накопление данных в буфер
          if(ByteRead!=10)bufer=bufer+char(ByteRead); // символ "новая строка" \n, нам в буффере не нужен
        }  
      }
    }

    void analyzer() {
      if (bufer.length()>1) {
        Serial.println("!!!!");
      } //если буфер не пустой
     
      if (bufer=="test") {
        Serial.print("read: ");
        Serial.println(bufer);
        digitalWrite(ledPin, HIGH);
      } //если принято слово "test"

      if (bufer=="test1") {
        Serial.print("read: ");
        Serial.println(bufer);
        digitalWrite(ledPin,LOW);
      } //если принято слово "test1"



    }
     
  7. Onkel

    Onkel Гуру

    Да, тут слегка погорячился, == работает в ардуине со string.
     
  8. An4ous

    An4ous Нерд

    Другая проблема, может подскажете? как с одной ардуинки передать текст во вторую, у второй залит скетч что выше, в мониторе порта с переносом строки все работает? думал все так просто, оказалось не так) на первой пишу ради эксперимента
    Код (C++):
    Serial.println("test");
    вторая принимает, и в окне порта вижу циферки
     
  9. Onkel

    Onkel Гуру

    а пп вызывается с контентом буфера не просто "test", а "test\r" - 5 элементов, включая '\r' - перенос строки, так специально обозначают упр. символ аsci 13, он же return, он же '\r'
     
  10. An4ous

    An4ous Нерд

    От спасибо большое, я писал до этого "test\n" поэтому ничего не получалось. щас все работает)
     
  11. Securbond

    Securbond Гуру

  12. Sindbad

    Sindbad Гик

    String (с заглавной буквы!) это имя класса, которого нет в чистом С/С++. Для него переопределены операции сравнения, потому и == работает. https://www.arduino.cc/en/Tutorial/StringComparisonOperators
    Когда употребляют термин string (с маленькой буквы!), то имеют в виду обычные нультерминированые строки языка Си. https://www.arduino.cc/en/Reference/String
     
  13. Onkel

    Onkel Гуру

    ну теперь мне понятно происхождение режущего глаз
    string s+='\r'
     
  14. An4ous

    An4ous Нерд

    Как можно передать данные часов реального времени с одной ардуины по Serial во вторую ардуинку? что бы вторая смогла понять что пришли нужные данные и их нужно обработать. ? на первой стоит TFT и линии SDA SCL заняты им
     
  15. Securbond

    Securbond Гуру

    И что Что заняты ??? Они параллельно работают прекрасно
    http://forum.amperka.ru/threads/Часы-с-функцией-включения-ночного-света.7215/
    Вот посмотрите. То же часы и экран работают вместе, эта шина позволяет
    Почитайте внимательно про I2C ну и про остальные шины то же будет полезно ..
     
  16. An4ous

    An4ous Нерд

    стоит мне подключить библиотеку wire как у меня дисплей идет в reset т.к на SDA в библиотеке дисплея где то задан этот пин как tft_reset, у меня не i2c дисплей.
    [​IMG]
     
    Последнее редактирование: 28 фев 2016
  17. Securbond

    Securbond Гуру

    Всетаки думаю стоит капнуть библиотеку чем строить городки из двух ардуин ещё и сериал потом занимать , ну если уж совсем приспичило обратите внимание на библиотеки virtual wire и easy transfer virtual wire.
     
  18. An4ous

    An4ous Нерд

    Спасибо, библиотеки для меня темный лес, там вообще все не понятно), основы то с трудом даются. я бы с радостью повесил все на одну ардуинку, только вот в планах несколько датчиков, а дисплей съедает почти все пины. остается воде 4 свободных пина. есть еще ардуинка МЕГА попробую на ней)