Не пишет данные в массив/виснет
- Войдите на сайт для отправки комментариев
Разбирался с датчиком температуры в этой теме, благодаря помощи умных людей с осчилографом, разобрался - спасибо.
Создал другую тему, потому как это уже совершенно другая проблема и она не зависит от того какой датчик подключен =(
Не могу записать данные имульсов в массив =(, на стадии цикла записи импульсов в массив, ардуина наглухо зависает =( Что не так? (скетч минимальный - продвигаюсь вперед потихоньку, тестируя каждый этап. Сейчас хочу, хотя бы, получить все импульсы с датчика и записать их длины в массив, а потом вывести этот массив в терминал).
Датчик MHT02.
Краткий даташит такой:
Купил такой же датчик, вообщем он рабочий.
Работает (проверил осциллографом), как сказано в китайском даташите (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);
}
Если закоментировать запись в массив и раскоментировать непосредсвенный вывод длины импульса в терминал - все норм. Но, естественно, все импульсы выдатать в терминал ардуина не успевает, поэтому нужно записать в массив.
Вместо
for(intj = 0; j = 60; j++){// j = 60 - это условие выполнения цикла такое ? Странноватое оно.попробуйте
for(intj = 0; j < 60; j++){Вполне себе нормальное условие.... Это мой не первый программный код вообще и для ардуино в частности. И проблема не в цикле, а в записи в буфер в цикле.
Потому как:
Если закоментировать запись в массив и раскоментировать непосредсвенный вывод длины импульса в терминал - все норм. Но, естественно, все импульсы выдатать в терминал ардуина не успевает, поэтому нужно записать в массив.
И, к тому же, с таким условием в цикле среда разработки пишет предупреждение, что мне не очень нравится.
Тем не менее любое условие цикла не дает результата (<,=<,=).
В строке 16 условие j=60 всегда истинно, т.е. цикл работает бесконечно.
В строке 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.
Тоже самое происходит с while
int j = 0; while ( j <= 60){ buf[j] = pulseIn(pin,HIGH); //Serial.println(pulseIn(pin,HIGH)); j++; }Ну да, проблема не в бесконечном цикле, а то, что при этом буфер переполняется. Конечно, всё дело не в бесконечном цикле. А вы тут автору со своими советами. Он лучше знает.
у вас массив на 60 элементов, т.е. с 0 по 59, 60-й за пределами массива, потому и виснет. надо онли < 60
Странно.. но с фором так и не заработало (и так < и так =<), а вот с 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 бит.
Всем спасибо, буду дальше колупать до преображания в читабельный человеку вид =)
у вас массив на 60 элементов, т.е. с 0 по 59, 60-й за пределами массива, потому и виснет. надо онли < 60
Я же говорил проблема не в цикле а в массиве =))) Ну переклинило меня, забыл что он с нулевого элемента считает.
Спасибо.
for(intj = 0; j = 60; j++)Это бесконечный чикл в котором j всегда равно 60, поскольку результат присвоения инту значения 60 всегда истина ! Да еще и запись ведется за пределы массива, поскольку последний его индекс имеет значение 59.
ТС запустите:
for(byte j = 0; j = 60 ; j++){ Serial.println(j); }И насладитесь результатом
Я же говорил проблема не в цикле а в массиве =))) Ну переклинило меня, забыл что он с нулевого элемента считает.
Ошибаетесь, тут две проблеммы. Вы написали слово "ЕЩЁ" с пятью ошибками "ИСТЧО" :)
Хмм... а ка кже тогда работает это?:
Так же.
Тем более оно не может быть всегда истинно.... потому как j равняется 60, только тогдаОно всегда инстинно, потому что Вы не сравниваете j с 60, а присваиваете j значение 60. И результат такого присваивания - 60, т.е. истина.
Я же говорил проблема не в цикле а в массиве =)))
Главная проблема у Вас не в цикле и не в массиве. Главная Ваша проблема - нулевые знания. Если бы Вы прочитали хоть самую тощенькую книжку о программировании на С, Вы бы таких ошибок не делали, а если бы случайно сделали, тут же бы исправляли.
Прочитайте уж хотя бы (хотя это очень мало) вот это.
Только не говорите, что Вы программирование изучаете по видеоурокам - видеоуроки делаются для идиотов. Вы же не идиот?
Хмм... а ка кже тогда работает это?:
Так же.
Тем более оно не может быть всегда истинно.... потому как j равняется 60, только тогдаОно всегда инстинно, потому что Вы не сравниваете j с 60, а присваиваете j значение 60. И результат такого присваивания - 60, т.е. истина.
Я же говорил проблема не в цикле а в массиве =)))
Главная проблема у Вас не в цикле и не в массиве. Главная Ваша проблема - нулевые знания. Если бы Вы прочитали хоть самую тощенькую книжку о программировании на С, Вы бы таких ошибок не делали, а если бы случайно сделали, тут же бы исправляли.
Прочитайте уж хотя бы (хотя это очень мало) вот это.
Только не говорите, что Вы программирование изучаете по видеоурокам - видеоуроки делаются для идиотов. Вы же не идиот?
Я, конечно, к профессиональным программистам себя не отношу. Но и знания у меня отнюдь не нулевые! Да, признаю, глупые ошибки иногда совершаю, но человеку свойственно это, к сожалению. Иногда ошибки совершаются из-за невозомжности сосредоточится на коде, а так как моя работа (а кроме как на работе у меня больше нету времени заниматься программированием) не связана с программированием периодически приходится частенько отвлекаться. Из книжек мною было прочитано только 2 по PHP в 2005 году, все остальное изучал читая чужие коды и примеры в интернете и, пока со всеми поставленными задачами справлялся. Причем ОООООчень редко задаю вопросы на форумах со всем стараюсь справляться сам. За все время, что я программирую (лет 10) - эта тема, примерно...5-10. А писал я на многих языках (Delphi, C#, C++, JavaScript, PHP, ASP, VBS....) опять же, не в одном из них я далеко не профессионал, может поэтому они для меня все одинаковые (не считая некоторой разнице в синтаксисе) - все это только хобби.
К идиотам себя не отношу, по видеоурокам изучение программирования считаю нонсенсом.