Не пишет данные в массив/виснет
- Войдите на сайт для отправки комментариев
Разбирался с датчиком температуры в этой теме, благодаря помощи умных людей с осчилографом, разобрался - спасибо.
Создал другую тему, потому как это уже совершенно другая проблема и она не зависит от того какой датчик подключен =(
Не могу записать данные имульсов в массив =(, на стадии цикла записи импульсов в массив, ардуина наглухо зависает =( Что не так? (скетч минимальный - продвигаюсь вперед потихоньку, тестируя каждый этап. Сейчас хочу, хотя бы, получить все импульсы с датчика и записать их длины в массив, а потом вывести этот массив в терминал).
Датчик 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
(
int
j = 0; j = 60; j++){
// j = 60 - это условие выполнения цикла такое ? Странноватое оно.попробуйте
for
(
int
j = 0; j < 60; j++){
Вполне себе нормальное условие.... Это мой не первый программный код вообще и для ардуино в частности. И проблема не в цикле, а в записи в буфер в цикле.
Потому как:
Если закоментировать запись в массив и раскоментировать непосредсвенный вывод длины импульса в терминал - все норм. Но, естественно, все импульсы выдатать в терминал ардуина не успевает, поэтому нужно записать в массив.
И, к тому же, с таким условием в цикле среда разработки пишет предупреждение, что мне не очень нравится.
Тем не менее любое условие цикла не дает результата (<,=<,=).
В строке 16 условие j=60 всегда истинно, т.е. цикл работает бесконечно.
В строке 16 условие j=60 всегда истинно, т.е. цикл работает бесконечно.
Хмм... а ка кже тогда работает это?:
Тем более оно не может быть всегда истинно.... потому как j равняется 60, только тогда когда цикл проходит 61 шаг и только тогда, в других случаях j либо меньше 60, либо больше 60, что уже никак не = 60.
Тоже самое происходит с while
Ну да, проблема не в бесконечном цикле, а то, что при этом буфер переполняется. Конечно, всё дело не в бесконечном цикле. А вы тут автору со своими советами. Он лучше знает.
у вас массив на 60 элементов, т.е. с 0 по 59, 60-й за пределами массива, потому и виснет. надо онли < 60
Странно.. но с фором так и не заработало (и так < и так =<), а вот с While получилось.
Вот так норм выдает:
Получаю все 40 бит.
Всем спасибо, буду дальше колупать до преображания в читабельный человеку вид =)
у вас массив на 60 элементов, т.е. с 0 по 59, 60-й за пределами массива, потому и виснет. надо онли < 60
Я же говорил проблема не в цикле а в массиве =))) Ну переклинило меня, забыл что он с нулевого элемента считает.
Спасибо.
for
(
int
j = 0; j = 60; j++)
Это бесконечный чикл в котором j всегда равно 60, поскольку результат присвоения инту значения 60 всегда истина ! Да еще и запись ведется за пределы массива, поскольку последний его индекс имеет значение 59.
ТС запустите:
И насладитесь результатом
Я же говорил проблема не в цикле а в массиве =))) Ну переклинило меня, забыл что он с нулевого элемента считает.
Ошибаетесь, тут две проблеммы. Вы написали слово "ЕЩЁ" с пятью ошибками "ИСТЧО" :)
Хмм... а ка кже тогда работает это?:
Так же.
Тем более оно не может быть всегда истинно.... потому как 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....) опять же, не в одном из них я далеко не профессионал, может поэтому они для меня все одинаковые (не считая некоторой разнице в синтаксисе) - все это только хобби.
К идиотам себя не отношу, по видеоурокам изучение программирования считаю нонсенсом.