Простой во время опроса датчиков
- Войдите на сайт для отправки комментариев
Пнд, 15/09/2014 - 04:34
Здравствуйте.
Время опроса 5 датчиков DHT22 (4шт) и DS20B18 (1шт) составляет около 1,8 секунды. На этот период Arduino Mega 2560 как бы зависает и не реагирует ни на какие внешние раздражители (кнопки и т.п.)
Планировал на одну Arduino повестить опрос датчиков температуры, выключатели света и др., но так как если нажать выключатель освещения во времяо проса датчиков - он не сработает, что есть не правильно.
Возможно есть способ обойти эту проблему, т.е. чтобы на время опроса МК не "зависал"? Опрос датчиков не всех за раз, а попеременно решает проблему только частично, так как, например, по DataSheet DS18B20 время получения данных - 750 мс (0,7 сек.)
Можно взять другие датчики
Датчики совсем не обязательно безпрерывно опрашивать. Или у вас температура каждые 5 секунд меняется?
Можно расковырять библиотеку.
Датчики, видимо, имеются в виду DS18B20.
Вы можете воспользоваться тем, что время опроса для них весьма зависит от установок точности.
Table 1. DS18B20 Conversion Times and Resolution Settings
Resolution 9 bit 10 bit 11 bit 12 bit
Conversion Time (ms) 93.75 187.5 375 750
LSB (°C) 0.5 0.25 0.125 0.0625
Пруф: http://www.maximintegrated.com/en/app-notes/index.mvp/id/4377
Можно паузу в 750 мс убрать - просто читатся будет без её предыдущее значение
Можно паузу в 750 мс убрать - просто читатся будет без её предыдущее значение
Либо соорудить подобную конструкцию : (ReadTemperatures() вызывается раз в секунду)
void ReadTemperatures()
{
if (DS18B20mode) { DS18B20sensors1.requestTemperatures(); }
else { tempGet = DS18B20sensors1.getTempC(DS18B20_devaddr0); }
DS18B20mode = !DS18B20mode;
}
Araris, MaksMS спасибо за наводку куда копать - суть понял, в реализации буду разбираться, пока что только начинаю осваивать программирование Arduino.
Разбираясь с библиотекой DallasTemperature и пытаясь заменить delay() на millis() совершенно неожиданно для меня получилось уменьшить время получения температуры с 750 мс (все датчики) до 45 мс (каждый датчик) вообще ничего не изменяя в библиотеке, просто немного подредактировав пример, идущий в комплекте с ней... Код:
Если раскомментировать 114 строку - sensors_1.requestTemperatures() время получения результата заметно возрастает.
Я совсем ничего не понимаю - согласно описанию DS18B20 при точности 12 бит время от запроса до получения температуры - 750 мс. Каким же тогда таким "чудесным" образом используя requestTemperaturesByAddress() вместо requestTemperatures() получилось так сократить время на получение результата?
Да, и просьба разъяснить: если опрашивать датчики DS18B20 раз в секунду - не сократит ли это существенно время до их выхода из строя? В даташите я не нашел никакой информации по этому поводу.
Можно паузу в 750 мс убрать - просто читатся будет без её предыдущее значение
Да, и просьба разъяснить: если опрашивать датчики DS18B20 раз в секунду - не сократит ли это существенно время до их выхода из строя? В даташите я не нашел никакой информации по этому поводу.
Ой какой правильный вопрос. Конечно же датчики стираются от часто прилетающих электронов с запросом.
Или я чего не понимаю, или одно из двух. Зачем сначала запрашивать по всей шине, а потом персональной у каждого датчика?
Либо трусы наденьте, либо крестик снимите, т.е. либо все сразу, что по мне лучше и быстрее, либо вот как сейчас, что дольше.
Или я чего не понимаю, или одно из двух. Зачем сначала запрашивать по всей шине, а потом персональной у каждого датчика?
Либо трусы наденьте, либо крестик снимите, т.е. либо все сразу, что по мне лучше и быстрее, либо вот как сейчас, что дольше.
Гыыы. А еще температура меняется каждую секунду на улице и очень важно ее мониторить.
Или я чего не понимаю...
Строка с sensors_1.requestTemperatures() оставлена для теста, и она, кстати, еще и закомментирована. Только все сразу - как раз медленнее: 750 мс, а по одному (sensors_1.requestTemperaturesByAddress(insideThermometer) и sensors_1.requestTemperaturesByAddress(insideThermometer)) - намного быстрее: 45 мс на каждый датчик, 90 мс на 2.
Надеюсь, так будет понятнее? :)
А Вы, наверное, как родились, так сразу у родителей и потребовали: "Телочку мне!!!", ну вот так, прямо с пеленок? :)))
А по сути - зачем марать мой топик своим сарказмом? Ведь его прочитает не один человек, и вместо полезной информации - Ваши сообщения... Вопросы, которые для гуру могут казаться глупыми и смешными, новичку, иногда, бывает решить очень не просто.
Бывает важно получить АКТУАЛЬНЫЕ данные о температуре по запросу, например через W5100, как можно быстрее, а по поводу улицы - это всего лишь Ваше, ни чем не обоснованое предположние. Возможно, мне потребуется измерить её у какого-нибудть сатирика в определенном месте с частотой 1Hz :)
Вы делаете мне смешно.
Тут нет полезной информации.
Если вы считаете что кто то вашего уровня будет читать ваш топик. То вот вам простой пример, у вас не хватило ума найти и прочитать несколько похожих топиков ниже. Ваш уровень не позволяет вам пользоваться поиском и вы постоянно моздаете одни и теже топики с переодисностью примерно пара недель.
Может быть, вместо того, чтобы пытаться издеваться над другими, Вам стоит решить свои личные проблемы? :)
Может быть, вместо того, чтобы пытаться издеваться над другими, Вам стоит решить свои личные проблемы? :)
Давайте забирайтесь на кушетку и начинайте расказывать про мои проблемы. Весь прям внимание.
Строка с sensors_1.requestTemperatures() оставлена для теста, и она, кстати, еще и закомментирована. Только все сразу - как раз медленнее: 750 мс, а по одному (sensors_1.requestTemperaturesByAddress(insideThermometer) и sensors_1.requestTemperaturesByAddress(insideThermometer)) - намного быстрее: 45 мс на каждый датчик, 90 мс на 2.
Или ты где-то косячишь, или одно из двух.
Если вычисление температуры с разрадностью 12 занимает 750 мс, судя по таблице выше, то откуда возьмутся 45 мс с такой же точностью?
Блин в топике один флуд, мне точноть до сотых не важна, подскажите пожалуйста всё таки ка можно уменьшить до 45мс. Важнее чтоб кнопочи работали, задержа более 1 секунды очень мешает обработке кнопок(
Я не пользовался специальной библиотекой для DS18B20, я тольк пользовался библиотекой OneWire:
http://playground.arduino.cc/Learning/OneWire
И даташитом к датчикам. По даташиту видно, что получение температуры происходит в 2,5 этапа:
* Послать команду, что нужно померять температуру.
* Подождать сколько надо (время зависит от настроек).
* Прочитать температуру.
И во время "Подождать" можно заниматься чем угодно, не обязательно делать delay(750); У меня, например, реализовано все так:
В итоге во время этих 750 милисекунд можно делать что угодно + кнопкам, если они на 2 и 3 пинах можно повесить прерывания и тогда они будут обрабатываться мгновенно.
При частом опросе DS18xxx происходит разогрев датчиков и как следствие - ощутимое искажение реальной температуры. Следовательно часто опращивать эти датчики нельзя.
..... по DataSheet DS18B20 время получения данных - 750 мс (0,7 сек.).......
Да, но не обязательно это время сидеть в delay.....
SunX
спасибо выручил!
Не понятно только одно - где косяк? Ведь все работает как нужно...
SunX - спасибо за код, но на мой взгляд стоит поставить на функцию initDS18B20() таймер, и не крутить её все время, особенно, если информация от brokly - true:
При частом опросе DS18xxx происходит разогрев датчиков и как следствие - ощутимое искажение реальной температуры. Следовательно часто опращивать эти датчики нельзя.
Да, но не обязательно это время сидеть в delay.....
Не то что бы не обязательно, а вообще функцию delay() нужно изьять из языка :) Вот при попытке избавиться от этой функции в библиотеке DallasTemperature я и обнаружил, что испольование функции requestTemperaturesByAddress() намного быстрее requestTemperatures()... Хотя в теории так быть не должно... Код в посте №6
Не понятно только одно - где косяк? Ведь все работает как нужно...
Возможно просто температура берется с предыдущего запроса, а не с текущего
SunX - спасибо за код, но на мой взгляд стоит поставить на функцию initDS18B20() таймер, и не крутить её все время, особенно, если информация от brokly - true:
В Вашем случае - вполне возможно, просто у меня вообще этот код выполняется раз в минуту, потому проблем с нагревом нет :) Но в таком случае и потом получать с датчиков температуру нет смысла несколько раз, проще запомнить в какой-нибудь буфер. Думаю, кстати, использование таймера вообще может помочь избавиться от всех этих задержек при работе с DS18b20
Возможно просто температура берется с предыдущего запроса, а не с текущего
Возможно... даже скорее всего, так как чудес не бывает :) Проверить пока что нет времени.
Думаю, кстати, использование таймера вообще может помочь избавиться от всех этих задержек при работе с DS18b20
К сожалению, от всех задержек при цифровых датчиках избавиться невозможно, так как всеравно требуется веремя для задержек на отправку запроса и получение результата (...0101000010...). Это, конечно, уже не 750 мс, но всеже...
Проблему с задержками для себя решил пока что так: опрашиваю цифровые датчики через интервал времени, т.е. 1-ый дачтик, через 10 сек 2-ой, через 10 сек - 3-ий и т.д. по кругу. Правда все равно, казавшеюся по началу идиличесскую картину оцифровки дома портят все эти задержки: ну ведь будет совсем не хорошо, если в момент связи с датчиком DS18B20 послать сигнал на IR-приемник, находящийся на одном микроконтроллере...
Сейчас смотрю в сторону прерываний, но как я понял при поверхностном изучении этого вопроса, проблему с задержками они не решат на 100%.
Если обработку критичных по времени сигналов поставить на прерывания, то задержки все эти, насколько я понимаю мешать совсем не должны.
сдравствуйте rfl вы можете подсказать как опрашивать датчики через определенный интервал времени.
у меня 4 датчика ds18b20 . делал скетч по циклу For. не подходит потому что в это время не возможно послать команды радио розеткам. на вкл выкл.
и без For/ тоже не помогает в Loop как идет цикл опроса датчиков то не работают кнопки.
что мне делать подскажите пож.
Кнопки на прерывания, опрос датчиков по таймеру или через delay.
датчики скорее по таймеру, чтоб была возможность послать команду, радио розеткам. на вкл или выкл.
пробовал опрос датчиков через For цикл, как только начнется цикл управление радио розетками не возможно. как только цикл проверки датчиков остановится, то кнопки сразу работают. И цикл не получалось остановить по брейку.
Зачем 5 раз запрашивать замер?!
Запрос на замер идет на все датчики на шине.
И ты вообще читаешь, что пишу?
Кнопки на ПРЕРЫВАНИЕ!
это был пример . можно и без For/ вопрос был в другом . ели начат цикл. опроса датчиков в loop / то кнопки не работают.
как это обойти ????????????????????????????????
возможно ли прервать процес проверки датчиков, чтобы отправить команду радио розеткам. ?????????????????????????
и что за кнопки прирывания поподробней ?????????????????????
http://playground.arduino.cc/Code/Interrupts
http://robocraft.ru/blog/arduino/45.html
Ты на основы забил и просишь помощи.
есть ли скетч короткий будет занимать не 15 сраниц . короткий код существует ???????
я видел человека который считает себя програмистом. пишет код для переключения между экранами ( это для телефона на базе андроид, ) , у него получается код на 3 листа стандартных.
но можно сделать код и всего 2 строчки и 14 символов. так пишет другой програмист. кто лучший ??
"Ищу исполнителя" в другом разделе находится.
Кнопки на ПРЕРЫВАНИЕ!
Radjah, А вы обратили внимание, что у него не используются кнопки? Собссно проблему мы разобрали в соседней ветке. Далласовская библа содержит в себе delay() и не даёт ничему работать, если опрос датчиков крутится в Loop. Как решить проблему тоже разобрали.
Я всего кода не видел же.
Хотя если разобрали, то пусть идет на йух^W^W читать маны.
Товарищ Dimax .
1 все кнопки у меня в телефоне. который управляет Ардвиной. через блютуз. вывод данных тоже смотрю на экране телефона. а не на дисплее приставленном к Ардвине, если успели заметить.
2 я не просил написать за меня весь код. я только начинаю разбираться в сетче. вы не видели #32 или не читали полностью.
3 вы не читаете или не видете, вопроса который я задал. уводите совсе в другую сторону и обращаете внимание, не на сам вопрос, а что в коде.
TovBender, вы это всё мне пишите я не пойму?
вы очень внимательный ... что в заголовке написано ? по вашей же просьбе . что вы просили писать. как вы думаете к кому вопросы ?
TovBender, читайте внимательнее кто вам что пишет! И отвечайте тому, кто инициирует разговор. Я вам про кнопки, и прочее о чём вы изливаетесь в #36 ничего не писал!
Radjah я смотрю вы тут сааамый умный с интеллектом УУ. не из Тагила ? случайно который рулит. ????
вы не читали #32 .
ссылка из друговго чата -- ( есть такие разрабы считают себя чуть ли не супер пупер разработчиками и их время стоит много денег. На деле же пользуются исходниками других. в простом вопросе не отвечают выдают стандартные КЛИШЕ, читай мат часть, и на деле ни кому помочь не могут, потомучто сами не .... )
Чувак, у тебя комплексы? Если да, то это к доктору.
Если хочешь, чтобы указали ошибки в коде и/или реализации, то код в студию.
Если хочешь, чтобы за тебя всё написали и спаяли, то дензнаки складывать вон в ту коробочку.
Умолять бесполезно.
Маны - гугл - форум.
TovBender, если бы вы взяли на себя труд сделать хоть что то с примерами и рекомендациями из вашей первой ветки, а не скулили на предмет большого кода и кнопок на любимом андроиде, вам бы помогли. Но вы даже не пытаетесь что то попробовать изменить и забываете основной принцип - сперва отлаживаем локальные задачи, а потом их объединяем.
С таким подходом, лучше сразу в "Ищу исполнителя", там все сделают не доставляя Вам особого беспокойства.
"Рыбки я тебе не дам, а дам тебе удочку"
bwn - Прошу вас внимательно прочитать #32, и #36.
если у вас плохо с внимателностью ваши проблеммы. вы ооочень не внимательны.
я просил не писать за меня программу, а только указать варианты, как отменить цикл, и чтоб код был не 240 строк а поменьше, НЕ от того что писать долго, а память у АРДВИНКИ ограничена, если вы не вкурсе. Вы наверное пишете только чтоб помигать лампочкой и покрутить 1 моторчик, то да код можете писать сколь угодно большим. Если сами не можете подсказать, сами не используйте чужой код чтоб другим показать, типа вы круты. вы не брат Puhlyaviy ? этот товарищь всех кругом поливает грязью, и НИКОГДА не подсажет.
у меня не только датчики будут, делать ей будет поручено много, вот и нужен код как можно меньше,
это и в работе, и на скорость тоже влияет. Я нашёл правельный алгоритм, люди подсказали, теперь сам перенёс свою программку в этот шаблон, всё работает, о чем я просил ТУТ.
и обработка идет паралельно, с другими функциями программы.
Остальным Спасибо за наводки и подсказки, Dimax и остальным, за сотрудничество. Вы помогли.
Прочитал я очень внимательно, сделал вывод - написать три строки состоящих из millis и if, как предложил Dimax, вам в лом.
Насчет чужого кода, то это стандартный пример из OneWire, который посмотреть вам тоже в лом.
Делайте выводы.
sensors.setWaitForConversion(true); отвечает за ожидание конца преобразования в sensors.requestTemperatures();
И во время "Подождать" можно заниматься чем угодно, не обязательно делать delay(750); У меня, например, реализовано все так:
В итоге во время этих 750 милисекунд можно делать что угодно + кнопкам, если они на 2 и 3 пинах можно повесить прерывания и тогда они будут обрабатываться мгновенно.
Делаю себе управление вентилятором в зависимости от максимальной температуры с 5 датчиков. Думал вывести показания на семисегментный дисплей на TM74HC595. Но пока выполняется этот код ничего еще не выполняется. Код ниже:
Думаю для начала что-нибудь полегче взять. Мне не понятно, как правильно совместить этот код, например, со скетчем из примеров Blink without delay?
Ну не нравится мне миллис!
а нравится мне библиотека SimpleTimer , с ее помощью организую псевдопроцесс, вызваемый раз в 1-5-10 секунд, где опрашиваю 18в20 и после опроса запускаю следующее определение температуры. Когда прихожу через означенное время , новая температура уже созрела.
в остальное время можно другим псевдопроцессом выводить на экран, третьим опрашивать кнопки....
опять некропостинг....
опять некропостинг....
Здесь хоть ожидаемо, очень давно уже адвентисты 750-ой миллисекунды не забредали, с год-два назад прямо косяком перли. Скоро наверно секта 50-го дня миллиса подтянется.)))
А читать все равно не желают.((((