Leonardo+RDM6300-Компьютер

Dimsan
Offline
Зарегистрирован: 25.10.2013

Сразу совет: сравнивать принятые данные между собой. Если предыдущая строка равна текущей строке, то не обращаем на неё внимание, сравниваем следующую, иначе обнаружена новая метка и в предыдущую строку записываем текущую.

maksim
Offline
Зарегистрирован: 12.02.2012

Есть способ проще, приняли метку и в течении 1 секунд игнорируем какие либо данные, то есть попросту по истечении секунды очищаем буфер.

String s = "";

void setup() 
{ 
  Serial.begin(9600); 
  Serial1.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() 
{
  if (Serial1.available()) 
  {
    s += (char)Serial1.read();   // то же самое, что и s=s+input; 
    if (s.length() == 26) 
    {
      digitalWrite(13, HIGH);   // зажигаем светодиод
      delay(1000);              // ждем секунду
      digitalWrite(13, LOW);    // выключаем светодиод
      Serial.println(s);
      s=""; 
      while(Serial1.available()) Serial1.read();
    } 
  } 
}

 

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

Пытаюсь написать что то по смыслу напимонающее, но ардуинка отказывается воспринимать адекватно, и отметает напрочь. С данными типа int, получается легко (просто тестовыц скетч, никак не относящийся к теме). А со String такя тема не прокатывает. Может ссылкой на литературку поможете? Только не гугл запрос и не ардуино.ру, так уже пробывал

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

А где именно в коде прописан момент "1секунду игнорировать"? Я свое железо наблюдаю, и честно говоря, увеличил бы интервал секунд до 5-6. Выделенную строчку вижу. Конкретно куда цифру 5 написать?))

Dimsan
Offline
Зарегистрирован: 25.10.2013

В приведённом выше скетче, это delay(1000);

Можете добавить строку delay(5000); непосредственно перед while(Serial1.available()) Serial1.read();

maksim
Offline
Зарегистрирован: 12.02.2012

so_nooby пишет:

Пытаюсь написать что то по смыслу напимонающее, но ардуинка отказывается воспринимать адекватно, и отметает напрочь.

Вот тут я бы перефразировал так:

so_nooby пишет:

Пытаюсь написать что то по смыслу напимонающее, но ардуинка отказывается воспринимать мой неадекватный код, и отметает напрочь.

К сожалению, что вы там пытаетсь написать видно только вам. А читать нужно все тоже самое - Программирование.

Клапауций
Offline
Зарегистрирован: 10.02.2013

я бы раз в сутки метку опрашивал - так... чиста для усугубления бестолковости задачи

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

Dimsan пишет:

В приведённом выше скетче, это delay(1000);

Можете добавить строку delay(5000); непосредственно перед while(Serial1.available()) Serial1.read();

 

пробывал

не канает

он как будто специально ждет 5 секунд и только потом начинает опять херней страдать.

в общем суть такая, в оригинальном скетче (почти ни чем не отоичается, кроме моргание диодом замененным на открывание/закрывание двери) дуинка хреначит действия по очереди. То есть допустим я дверь закрыл, потом идет delay(5000), потом дверь сама открыватся и такой цикл пока ей не надоест. Ровно столько, сколько считыватель раз считал ключ. Если кол-во не четное, все супер конечно. Рано или поздно закроется. Но это же не комильфо. 

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

Перефразируя мою бывшую учительницу в школе:"Так, Клапауций, встал и вышел из темы"

пол часа смеха прошло. Опоздал. 

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

Я читал. Пытаюсь подстроить, но мой неадекватный код адекватнее не становится. Помочь можете?

Клапауций
Offline
Зарегистрирован: 10.02.2013

so_nooby пишет:

Перефразируя мою бывшую учительницу в школе:"Так, Клапауций, встал и вышел из темы"

пол часа смеха прошло. Опоздал. 

щаз!

*нужно две метки - одна для закрытия двери, вторая для открытия.

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

Ага

типо два брелка таскать? Я еще условие добавил. Переменная отвечающая за состояние дверь. Она работает правильно, судя по циклу повторений. Если б не работало, замок бы просто закрывался до посинения

maksim
Offline
Зарегистрирован: 12.02.2012

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

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

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

maksim пишет:

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

а зачем экстрасенсорные способности?

код есть. Типы данных известны. Вопрос как ограничить поток. Пробывал загонять все в массив, а потом брать только первое значение. Но со String не получается.  Прочитал теорию, стринг и есть массив. Поэтому не знаю чтобы замутить. Рассмотреть матрицу, где каждая строка полученное значение и брать только первую?

матрицу String так же описывать? Как string[,]=new string? В теории не заметил

Dimsan
Offline
Зарегистрирован: 25.10.2013

Тип string (который на самом деле массив char) и тип String - не одно и тоже. У второго есть метод equals(), для сравнения строк.

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

Примерчик можно? Попробую адаптировать под мои нужды

Dimsan
Offline
Зарегистрирован: 25.10.2013
  // two strings not equal (case sensitivity matters):
   stringOne = "This";
   stringTwo = "this";
   if (stringOne != stringTwo) {
     Serial.println(stringOne + " =! " + stringTwo);
   }
   // you can also use equals() to see if two strings are the same:
   if (stringOne.equals(stringTwo)) {
     Serial.println(stringOne + " equals " + stringTwo);
   } 
   else {
     Serial.println(stringOne + " does not equal " + stringTwo);
   }

Взято отсюда: http://arduino.cc/en/Tutorial/StringComparisonOperators

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

Допустим

а поток как разделить на стринг1 и стринг2?

у меня же поток прет. Ограничение на количество символов уже ввел

так он мне несколько значений подряд подгоняет. По моим словам мало что понятно, могу видео снять=))))

Dimsan
Offline
Зарегистрирован: 25.10.2013

Да понятно всё. Днём, если будет время, набросаю пример.

maksim
Offline
Зарегистрирован: 12.02.2012

so_nooby пишет:

а поток как разделить на стринг1 и стринг2?

Каком и желательно к верху.

String s = "";

void setup() 
{ 
  Serial.begin(9600); 
  Serial1.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() 
{
  if (Serial1.available()) 
  {
    char ch = Serial1.read();
    if(ch != ' ') s += ch;
    else
    {
      if(s == "4E00ABF38593")
      { 
        Serial.println(s);
        digitalWrite(13, HIGH);   // зажигаем светодиод
        delay(3000);              // ждем секунду
        digitalWrite(13, LOW);    // выключаем светодиод
        while(Serial1.available()) Serial1.read();
      }
      s="";
    } 
  } 
}

 

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

maksim пишет:

Есть способ проще, приняли метку и в течении 1 секунд игнорируем какие либо данные, то есть попросту по истечении секунды очищаем буфер.

String s = "";

void setup() 
{ 
  Serial.begin(9600); 
  Serial1.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() 
{
  if (Serial1.available()) 
  {
    s += (char)Serial1.read();   // то же самое, что и s=s+input; 
    if (s.length() == 26) 
    {
      digitalWrite(13, HIGH);   // зажигаем светодиод
      delay(1000);              // ждем секунду
      digitalWrite(13, LOW);    // выключаем светодиод
      Serial.println(s);
      s=""; 
      while(Serial1.available()) Serial1.read();
    } 
  } 
}

 

вот после этого уже усилия были лишними. только дошло, что никакого времени не нужно, потому что цикл while. включил комп, проверил, работает. всем спасибо за проделанную работу. будет новая задумка по использованию дуины, обызательно напишу. уж извините) спасибо всем большое!

com
Offline
Зарегистрирован: 06.09.2013

so_nooby пишет:

у меня же поток прет...  По моим словам мало что понятно...

вся суть двухстраничной переписки.

аффтар, пеши исчо!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

да с такими познаниями афтор нас еще не раз порадует :)

so_nooby
so_nooby аватар
Offline
Зарегистрирован: 24.09.2013

Puhlyaviy пишет:

да с такими познаниями афтор нас еще не раз порадует :)

 

наверное в вашем сверх современном мегаполисе дети рождаются с познаниями такого рода. В моей же деревне ( учтите, мне так говоритт можно, вам нет) слыхать не слыхивали что такое ардуино или вообще микроконтроллер. Занимаюсь я этой темой неделю. До этого небольшой опыт в программировании на турбопаскале и сишарпе. Самый длинный и сложный код написанный мной в период обучения едва ли может сравниться с этими 30 строчками по функционалу и полезности. Так что да, я вас порадую, и скорее всего не самым умным или хотя бы хитрым вопросом. 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

so_nooby пишет:

 В моей же деревне ( учтите, мне так говоритт можно, вам нет) слыхать не слыхивали что такое ардуино или вообще микроконтроллер. 

Эт чего вдруг мне мою деревню нельзя называть деревней? Если она даже на карте деревней обозначена! и до ближайшего города 200 км...

Клапауций
Offline
Зарегистрирован: 10.02.2013

Puhlyaviy пишет:

Эт чего вдруг мне мою деревню нельзя называть деревней? Если она даже на карте деревней обозначена! и до ближайшего города 200 км...

молчи, деревеньщина - что ты можешь знать о высоте глубины интеллекта крупномегаполисного небожителя?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций пишет:

молчи, деревеньщина - что ты можешь знать о высоте глубины интеллекта крупномегаполисного небожителя?

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