#51 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-03 20:32:12

Nefreemen пише:
ardnew пише:

код из change #5 у меня не ругается, но и ничего не делает  sad
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "Watt 1.5", "Watt 2.5" т.е. значения могут быть дробными,
как в таком случае быть ?

Вот в этом и проблема что "не делает" а должен. Вопрос не в том дробные не дробные. Надежный парсинг буфера Serial как бы по своей сути прост. Прост в том случае когда вы точно знаете что получаете ( и красота если вы можете внести изменения в передачу то есть поставить какие то символы для удобства разделения например символьных величин  от числовых). В данном случае как понимать допустим 2.5 символьное или флот. Но поскольку вы указываете в кавычках следовательно мы рассматриваем  строку. Мой код и код NoName читает строку из буфера Serial тут вопросов нет, только по разному происходит чтение у меня байты читаются в другой буфер, массив char[] выглядит примерно это так ['R','e','l','a','y',' ','1'], дальше идет преобразование массива в строковую переменную, ну и потом сравнение. NoName сомневается в надежности такого подхода и предлагает читать сразу в строку добавлением каждого поступившего символа к имеющей уже строке, одновременно проводить контроль по длине строки ( в целесообразности чего я сомневаюсь). Такой способ тоже очень распространен и есть масса примеров. В том коде от NoName есть какая то проблемка, и как я понял в моем, и проблема эта может быть в спецсимволах которые Serial компьютера посылает в конце строки, типа перевод каретки, конец строки. Ни в терминале ардуино ни гипертерминале вы их не увидите. Почему я спросил какая Arduino у Вас. Если допустим Atmega2560, то у нее есть 4 Serial порта тогда можно написать скетч монитор и "пощупать" именно байтики которые приходят с компьютера.

отладку делаю в протеусе, вижу все что передаю и принимаю, этот код меня устраивает полостью:
char input[20];
void loop()
{   
      if (Serial.available() > 0)
  {
    Serial.readBytes( input, 20 );
    String str= (String) input;
    if (str == "Rele 1") digitalWrite(led11, HIGH);
    if (str == "Rele 2"') digitalWrite(led12, HIGH);
    if (str == "Rele 3") digitalWrite(led13, HIGH);
    }
}
но, читаю вас и думал что, что то в нем не так smile

#52 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-03 20:26:44

NoName пише:

1.5 сек )   no comments )

понял так что сказал глупость, а какую ? 1.5 сек. это нормально ?

#53 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-03 19:58:23

ardnew пише:
Nefreemen пише:

Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?

да, включается именно то реле которое нужно, но, бывает 2-4 раза включается без проблем, а бывает нужно 2-3 раза дать команду.

и еще заметил, с не большой задержкой команды проходят, примерно 1.5 секунды, хотелось бы побыстрее  smile

#55 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-03 19:43:53

Nefreemen пише:

Ну это просто, там где включаете реле, допишите выключение остальных.
Примерно так:
if (inputString == "Rele 1"){
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
...............................
digitalWrite(pin8, LOW);
}

нет, ну так то я могу, но слишком много строк получается, хотелось бы как то по изящнее smile

Nefreemen пише:

Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?

да, включается именно то реле которое нужно, но, бывает 2-4 раза включается без проблем, а бывает нужно 2-3 раза дать команду.

#56 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-03 19:25:47

код из change #5 у меня не ругается, но и ничего не делает  sad
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "Watt 1.5", "Watt 2.5" т.е. значения могут быть дробными,
как в таком случае быть ?

#57 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-03 18:54:00

NoName пише:

а в этом варианте   (  if (x == 1) digitalWrite(led11, HIGH); ) что хотите то и пишите )
мы сейчас   http://forum.arduino.ua/viewtopic.php?pid=2404#p2404   этот код обсуждаем

если честно, не въехал, может на примере покажите ?

#58 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-03 18:24:50

NoName пише:

это просто см change 5
добавлен лог выполнения

если правильно понял..

вот это работает четко if (x == 1) digitalWrite(led11, HIGH);
если с терминала даю один байт, типа 1, 2, или 3, но у меня текстовая строка, и вот в этом вся проблема  sad

#59 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-03 17:38:33

NoName пише:

Nefreemen, самое смешное что ardnew уже получил что нужно и тему не читает )

читаю, и очень внимательно !
и получил как бы не совсем то, вернее то, но реле как то включаются через раз
какую либо статистику не собрать sad

и еще, никак не могу сообразить, у меня 8 реле, нужно сделать так что бы по сигналу включалось только одно реле, а остальные выключались,
например, пришел сигнал "Rele 2" включилось реле 2, пришел сигнал "Rele 5" включилось бы реле 5, а реле 2 выключилось,
короче, всегда может быть включено только одно реле из восьми.

#60 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-02 22:16:46

Nefreemen пише:

может где то так  smile

точно! так работает! спасибо большое за помощь !

#61 Re: Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-02 19:09:27

NoName пише:

вы   делаете вычитку по байту
и байт сравниваете со строкой
Вам нужно читать строки
https://www.arduino.cc/en/Serial/ReadString
либо самому собирать строку

несколько вариантов в ответах
http://stackoverflow.com/questions/1119 … on-arduino

по последней ссылке нашел похожий пример, ну что то опять не хочет работать, что опять не так делаю ?

int x;
String str;

  void setup(){
    Serial.begin(9600);
  }
     
      if (Serial.available() > 0)
  {
        str = Serial.readStringUntil('\n');
        x = Serial.parseInt();
    if (x == 'Rele 1') digitalWrite(led11, HIGH);
    if (x == 'Rele 2') digitalWrite(led12, HIGH);
    if (x == 'Rele 3') digitalWrite(led13, HIGH);
    }

#62 Програмування Arduino » помогите новичку пожалуйста ! » 2016-03-02 18:23:39

ardnew
відповідей: 180

помогите пожалуйста, с компьютера на ардуино поступают команды в таком виде: "Rele 1", "Rele 2", "Rele 3" (изменить их нельзя)
написал такой код:

   if (Serial.available() > 0)
  {
   char str = Serial.read(); 
    if (str == 'Rele 1') digitalWrite(led11, HIGH);
    if (str == 'Rele 2') digitalWrite(led12, HIGH);
    if (str == 'Rele 3') digitalWrite(led13, HIGH);
  }

но не работает, что делаю не так ?
заранее признателен за помощь !

Підвал форуму