Не пишет данные в массив/виснет

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Разбирался с датчиком температуры в этой теме, благодаря помощи умных людей с осчилографом, разобрался - спасибо.

Создал другую тему, потому как это уже совершенно другая проблема и она не зависит от того какой датчик подключен =(

Не могу записать данные имульсов в массив =(, на стадии цикла записи импульсов в массив, ардуина наглухо зависает =( Что не так? (скетч минимальный - продвигаюсь вперед потихоньку, тестируя каждый этап. Сейчас хочу, хотя бы, получить все импульсы с датчика и записать их длины в массив, а потом вывести этот массив в терминал).

Датчик MHT02.

Краткий даташит такой:

jarik пишет:

Купил такой же датчик, вообщем он рабочий.

Работает (проверил осциллографом), как сказано в китайском даташите (1 - VDD, 2 - GND, 4 - DATA). 

Выставляете контроллером на линии DATA (4 контакт датчика) низкий уровень на время >= 100мкс, после этого датчик начинает передавать по этой же линии данные: импульсы (высокий уровень сигнала) 25мкс это 0,60мкс это 1, которые чередуются низким уровнем с длительностью 40мкс.   

#define pin 12
int buf [60];

void setup (){
  Serial.begin(115200);  
  pinMode(pin, OUTPUT);
  digitalWrite(pin, HIGH);
}

void loop(){
  Serial.println("Hello!");
  digitalWrite(pin,LOW);
  delay(100);
  pinMode(pin, INPUT);
  //noInterrupts();
  for (int j = 0; j = 60; j++){
    buf[j] = pulseIn(pin,HIGH);
    //Serial.println(pulseIn(pin,HIGH));
  }
  //interrupts();
  
  //for (int j = 0; j = 60; j++){    
  //  Serial.println(buf[j]);
  //}
  delay(100);
  pinMode(pin,OUTPUT);
  digitalWrite(pin,HIGH);
  delay(5000);
}

Если закоментировать запись в массив и раскоментировать непосредсвенный вывод длины импульса в терминал - все норм. Но, естественно, все импульсы выдатать в терминал ардуина не успевает, поэтому нужно записать в массив.

Araris
Offline
Зарегистрирован: 09.11.2012

Вместо for (int j = 0; j = 60; j++){  // j = 60 - это условие выполнения цикла такое ? Странноватое оно.

попробуйте for (int j = 0; j < 60; j++){

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Вполне себе нормальное условие.... Это мой не первый программный код вообще и для ардуино в частности. И проблема не в цикле, а в записи в буфер в цикле.

Потому как: 

LobsterOK пишет:

Если закоментировать запись в массив и раскоментировать непосредсвенный вывод длины импульса в терминал - все норм. Но, естественно, все импульсы выдатать в терминал ардуина не успевает, поэтому нужно записать в массив.

И, к тому же, с таким условием в цикле среда разработки пишет предупреждение, что мне не очень нравится.

Тем не менее любое условие цикла не дает результата (<,=<,=).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строке 16 условие j=60 всегда истинно, т.е. цикл работает бесконечно.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

ЕвгенийП пишет:

В строке 16 условие j=60 всегда истинно, т.е. цикл работает бесконечно.

Хмм... а ка кже тогда работает это?:

  for (int j = 0; j = 60; j++){
    //buf[j] = pulseIn(pin,HIGH);
    Serial.println(pulseIn(pin,HIGH));
  }

Тем более оно не может быть всегда истинно.... потому как j равняется 60, только тогда когда цикл проходит 61 шаг и только тогда, в других случаях j либо меньше 60, либо больше 60, что уже никак не = 60.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Тоже самое происходит с while

  int j = 0;
  while ( j <= 60){
    buf[j] = pulseIn(pin,HIGH);
    //Serial.println(pulseIn(pin,HIGH));
    j++;
  }

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ну да, проблема не в бесконечном цикле, а то, что при этом буфер переполняется. Конечно, всё дело не в бесконечном цикле. А вы тут автору со своими советами. Он лучше знает.

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

у вас массив на 60 элементов, т.е. с 0 по 59, 60-й за пределами массива, потому и виснет. надо онли < 60

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Странно.. но с фором так и не заработало (и так < и так =<), а вот с While получилось.

Вот так норм выдает:

  noInterrupts();
  int j = 0;
  while (j < 60){
    buf[j] = pulseIn(pin,HIGH);
    //Serial.println(pulseIn(pin,HIGH));
    j++;
  }
  interrupts();

  j = 0;
  while (j < 60){    
    Serial.println(buf[j]);
    j++;
  }

Получаю все 40 бит. 

Всем спасибо, буду дальше колупать до преображания в читабельный человеку вид =)

LobsterOK
Offline
Зарегистрирован: 04.10.2016

__Alexander пишет:

у вас массив на 60 элементов, т.е. с 0 по 59, 60-й за пределами массива, потому и виснет. надо онли < 60

Я же говорил проблема не в цикле а в массиве =))) Ну переклинило меня, забыл что он с нулевого элемента считает.

Спасибо.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

for (int j = 0; j = 60; j++) 

Это бесконечный чикл в котором j всегда равно 60, поскольку результат присвоения инту значения 60 всегда истина ! Да еще и запись ведется за пределы массива, поскольку последний его индекс имеет значение 59.

ТС запустите:

for(byte j = 0; j = 60 ; j++){
  Serial.println(j);
}

И насладитесь результатом 

LobsterOK пишет:

Я же говорил проблема не в цикле а в массиве =))) Ну переклинило меня, забыл что он с нулевого элемента считает.

Ошибаетесь, тут две проблеммы. Вы написали слово "ЕЩЁ" с пятью ошибками "ИСТЧО" :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

LobsterOK пишет:

Хмм... а ка кже тогда работает это?:

Так же.

LobsterOK пишет:

Тем более оно не может быть всегда истинно.... потому как j равняется 60, только тогда

Оно всегда инстинно, потому что Вы не сравниваете j с 60, а присваиваете j значение 60. И результат такого присваивания - 60, т.е. истина.

LobsterOK пишет:

Я же говорил проблема не в цикле а в массиве =))) 

Главная проблема у Вас не в цикле и не в массиве. Главная Ваша проблема - нулевые знания. Если бы Вы прочитали хоть самую тощенькую книжку о программировании на С, Вы бы таких ошибок не делали, а если бы случайно сделали, тут же бы исправляли.

Прочитайте уж хотя бы (хотя это очень мало) вот это.

Только не говорите, что Вы программирование изучаете по видеоурокам - видеоуроки делаются для идиотов. Вы же не идиот?

LobsterOK
Offline
Зарегистрирован: 04.10.2016

ЕвгенийП пишет:

LobsterOK пишет:

Хмм... а ка кже тогда работает это?:

Так же.

LobsterOK пишет:

Тем более оно не может быть всегда истинно.... потому как j равняется 60, только тогда

Оно всегда инстинно, потому что Вы не сравниваете j с 60, а присваиваете j значение 60. И результат такого присваивания - 60, т.е. истина.

LobsterOK пишет:

Я же говорил проблема не в цикле а в массиве =))) 

Главная проблема у Вас не в цикле и не в массиве. Главная Ваша проблема - нулевые знания. Если бы Вы прочитали хоть самую тощенькую книжку о программировании на С, Вы бы таких ошибок не делали, а если бы случайно сделали, тут же бы исправляли.

Прочитайте уж хотя бы (хотя это очень мало) вот это.

Только не говорите, что Вы программирование изучаете по видеоурокам - видеоуроки делаются для идиотов. Вы же не идиот?

Я, конечно, к профессиональным программистам себя не отношу. Но и знания у меня отнюдь не нулевые! Да, признаю, глупые ошибки иногда совершаю, но человеку свойственно это, к сожалению. Иногда ошибки совершаются из-за невозомжности сосредоточится на коде, а так как моя работа (а кроме как на работе у меня больше нету времени заниматься программированием) не связана с программированием периодически приходится частенько отвлекаться. Из книжек мною было прочитано только 2 по PHP в 2005 году, все остальное изучал читая чужие коды и примеры в интернете и, пока со всеми поставленными задачами справлялся. Причем ОООООчень редко задаю вопросы на форумах со всем стараюсь справляться сам. За все время, что я программирую (лет 10) - эта тема, примерно...5-10. А писал я на многих языках (Delphi, C#, C++, JavaScript, PHP, ASP, VBS....) опять же, не в одном из них я далеко не профессионал, может поэтому они для меня все одинаковые (не считая некоторой разнице в синтаксисе) - все это только хобби.

К идиотам себя не отношу, по видеоурокам изучение программирования считаю нонсенсом.