Arduino барометр - барограф

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Лекс 59 пишет:

А он делал сам. Для себя. В условиях мощного тогда завода. Рукастый весьма мужик. Там все было в высшей степени продумано и профессионально...

Но лишних аккумыляторов в критических узлах, я с тех пор избегаю. Он, кстати, выявил неисправность аккумулятора очень просто и наглядно, когда несколько часов проторчал под дверью, пока не дали свет...

С час это реализовать гораздо проще и своими силами или купить готовое решение, да хоть со смартфона открывай и контролируй.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

bodriy2014 пишет:

С час это реализовать гораздо проще и своими силами или купить готовое решение, да хоть со смартфона открывай и контролируй.

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

Я много лет строил АПЛ. Там непрерывное техобслуживание, регламенты и т.п. 
И то бывает, что подводит техника. А дома? Нафик мне лишняя суета?

Не, я сторонник механики в этом смысле.

s13
Offline
Зарегистрирован: 22.05.2016

Родственник попросил барограф на батарейках, потому и ковыряюсь. От трех акков потребление 0.22ma, всплески раз в 4с меньше 1ma. Трех щелочных батареек должно хватать примерно на год, солевых на несколько месяцев. Считаю такой вариант вполне приемлемым, спасибо форуму и отдельно Лекс 69 за идею всё упростить. Вариант прямых графиков для пожилых людей поддерживаю, но мне интереснее максимальная детализация, чуткое отслеживание изменений (сразу видно что дождь кончается :). 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Ну если уж так принято здесь, приписывать мне не мои идеи, то поделюсь еще одной. Идея стоит на снимке справа от прибора. Купил вчера за 50. Прибор на штатном месте уже, подсветку не включал, тогда фото засвечевается и видно хуже. Прибор пришлось наклонить, для лучшего кадра. Штатно - просто вертикально стоит.

Частота обновления 1000 (23 часа). Практики пока мало, но прихожу к мысли, что сделаю частоту 2100 (2 суток).

Прибор в варианте последнего скетча Бодрого 2014. Для пожилого человека такой график понятнее. Для метеозависимых тоже. А версия s13 ближе к серьезным измерительным приборам. Возможно будет интересен рыбакам.

На сколько хватит этой батарейки расчитать не могу. Солевая. Не солевая дороже минимум втрое. Но по объему она больше трех пальчиков. В принципе можно и снаружи примантулить, при необходимости.

bodriy2014, это конечно не самый красивый график. Сейчас погода вроде меняется, подожду, потом переделаю период на 2100 и отсниму, что получится там. Я правильно умножаю для расчета периода на 83?

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Не уверен, что подобное обсуждение уместно в этой теме. Если оно тут лишнее, прошу Автора темы и участников меня поправить.

Проблема питания прибора. С батареями и аккумуляторами все более менее ясно (в смысле туманно), как быть с питанием от сети? Сейчас тоит у меня на прогоне зарядка от нокии. 9 вольт на выходе. Изменений пока не вносил никаких. Встречал информацию, что подобные блоки на непрерывную работу при малых токах потребления не советуют. Плохо себя ведут и даже пожароопасны. Есть у кого практика? Или размышления профессионала?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Лекс 59

3r12-это отличный вариант!

Я такими не пользовался еще с детства,

погуглил их свободно можно купить, у самых дешевых солевых емкость 0,5-0,7А.

У них большой плюс -не нужен специальный контейнер для батареек,

 можно просто припаяться или надеть клемму.

Но считаю что для использования прибора от батарейки чтоб не было напрасной траты денег нужно добавить две вещи!!

---контроль напряжения батарейки, чтоб знать когда сядет

---сон обязательно!!!

Я это все допишу в скетч, а вы пока замерьте сколько сейчас потребляет прибор без подсветки!

Потом сравним как будет с режимом сна.))

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Когда замерял на макетке было между 13 и 14 ма. Могу путать, но маловероятно. Если сейчас уточню - потеряю график. На улице ветер и дождит. Хочу увидеть момент изменения погоды. Но если надо, могу померять точно.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Лекс 59

Не стоит терять данные, перед заливкой нового скетча померяете.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Лекс 59 пишет:

Когда замерял на макетке было между 13 и 14 ма. Могу путать, но маловероятно. Если сейчас уточню - потеряю график. На улице ветер и дождит. Хочу увидеть момент изменения погоды. Но если надо, могу померять точно.

Кстати потеря данных это та еще беда, наверное буду писать их в епром, она веди есть на борту но простаивает!)

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

А вот это отличная мысль!

Измерение напруги будет полезно тоже, особенно при питании от акков. Да и с батареями не повредит. 

Хотя стоп, а промежуточные значения вы разве не в еепром пишите?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Лекс 59 пишет:

А вот это отличная мысль!

Измерение напруги будет полезно тоже, особенно при питании от акков. Да и с батареями не повредит. 

Хотя стоп, а промежуточные значения вы разве не в еепром пишите?

Нет епром это энергонезависимая память, даже если пропадет питание она сохранит записанное значение.

А сейчас массив с данными хранится в оперативной памяти, свет пропал и все данные тю-тю!)

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

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

Набросал схему в ДИПе. В первом приближении. Пока подожду с публикацией. (Кнопки? Изм. напр. бат.?)

s13
Offline
Зарегистрирован: 22.05.2016

Лекс 59 пишет:

Встречал информацию, что подобные блоки на непрерывную работу при малых токах потребления не советуют. Плохо себя ведут и даже пожароопасны. Есть у кого практика? Или размышления профессионала?

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

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

s13 пишет:

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

Дело в том, что в теории я слабоват. На хорошем уровне знаю только то, что прополз на брюхе. Самоучка.

Как по вашему мнению, в обычной импульсной зарядке на одном MJE13001 стоит что-то переделать? Может добавмить какую защиту несложную? Главная опасность - пожарная. Если просто сгорит БП или прибор - не трагедия.

Сейчас он у меня молотит на прогоне с нагрузкой в 15 ма резистором. Температура корпуса ИБП на 10 градусов выше среды. Уже с полсуток.

s13
Offline
Зарегистрирован: 22.05.2016

Какую там защиту, всё там есть уже обычно. Озаботьтесь чтобы рядом небыло лекговоспламеняющихся вещей и всё. Главная опасность в таких источниках - выпрямительные диоды или сборки, при их неисправности случается кз. От кз есть или резистор на 10-30ом или предохранитель. Трансформатор там обычно намотан проводом 0.06, его подпалить нереально.

s13
Offline
Зарегистрирован: 22.05.2016

Лекс 59 пишет:

 Идея стоит на снимке справа от прибора. Купил вчера за 50. 

На сколько хватит этой батарейки расчитать не могу. Солевая. Не солевая дороже минимум втрое. Но по объему она больше трех пальчиков. 

При токе 13ма её хватит на (700ма.ч / (24часа * 13ма))  примерно 3 дня. Советую пока поберечь её. Насчет цены, в наших фикс-прайсах за 50р. блистер из 10 АА FLARX емкостью 500 - 650 ма.ч. это в 3 раза выгоднее если ставить 3 элемента. Схема работоспособна до 1.7 вольт, значит можно использовать и 2 элемента, это 5 "заправок", так что преимущество в отсутствии кейса сомнительно.

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015

Доброго времени суток. Интересный график s13. Скетчем не поделится?

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

aleksrulevoi пишет:

Доброго времени суток. Интересный график s13. Скетчем не поделится?

Рискну ответить за s13. Пост 263.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Небольшое исследование для тех, кто будет после.

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

Каждому, кто решит повторить подобный прибор, предется выяснять для себя, какой вариант прибора выбрать.

Приведу два графика. Взяты с метеосайтов.

Это разные графики. Разная местность, разное время. На втором графике цифры мелко. Но там максимальный перепад всего 2 мм.рт.ст. за сутки.

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

Первый график показывает, что в местности, где я живу вчера-сегодня. Там дискретность 1 мм. рт.ст. Мелких нюансов там нет. Но он более удобен для метеозависимых. Достаточно просто бросить взгляд на дисплей.

С прибором s13 так не получится. Там придется смотреть цифры, анализировать отображаемую разницу верхней и нижней границы, перелистывать графики.

У меня сейчас трудится вариант bodriy2014 с периодом обновления 1200 секунд (27 часов). И он сейчас просто рисует прямую. Как на первом графике, с учетом того, что включил его вчера вечером. Но не так давно я фиксировал изменение давления на десяток миллиметров за полсуток. Для метеозависимых важны именно такие колебания. Т.е. с точки зрения "бытовой прибор для фиксации крунных перепадов давления" вариант bodriy2014 считаю более предпочтительным.

Вариант прибора от s13 ближе к точным измерительным приборам. Графики он будет рисовать куда более насыщенные. Более того,  горизонтальную прямую на нем увидеть не получится. Что вполне соответствует физическим реалиям.

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

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

s13
Offline
Зарегистрирован: 22.05.2016

Обычно график не такой уж и страшный, сейчас например такой:

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015

Спасибо у меня пост 155 работает без нареканий. На меге с минимальной объвязкой. Фото 156 пост.

s13
Offline
Зарегистрирован: 22.05.2016

 

Может немного не по теме, но решил избавить родственника от возни с батарейками. Воткну от старого сотового акк и солнечную панельку.

Если кому интересно: 

http://www.ebay.com/itm/252391727337

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

Коробочки для проектов, пойдут и для барометра:

http://alireview.ru/cernb

http://alireview.ru/u4j14

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Получил заказанные ВМР180. Собрал версию s13 на макетке и поставил на долгую обкатку. Ток 260 мка и раз в несколько секунд скачки до 1,4 ма примерно. Для батарейного питания многовато все-же. Видимо придется делать сетевое, если решу остановится на этой версии для себя. Менять раз в месяц-два батарейки не вариант. Чтож, физика есть физика. А лепить туда солнечные по примеру s13 я все же не решусь пока. Хотя неплохо реализовано. Да и нет их у меня. И для моего варианта планировки квартиры не так просто отыскать штатное место для него по условиям освещенности.

Таким образом у меня сейчас два барографа молотят. Посмотрим, что приживется на практике.

s13
Offline
Зарегистрирован: 22.05.2016

Вижу единственный путь для перехода на полноценное батарейное питание (чтоб солевых на 2-3 года хватало) это гашение экрана. По нажатию кнопки устройство просыпается и работает как обычно, через несколько минут оно глубоко засыпает и переводит экран в режим сна. Просыпается редко, и только для обновления давления например раз в 10мин. Чтобы получилась версия для всех,  стоит добавить экран абсолютного графика (как в посте 155 или как изобрел Лекс 59) в качестве дополнительного. Прошу высказать заинтересованных свои мысли по поводу глубокого сна, содержимого экранов и пределов (или как реализовать автопределы на абс. графике).

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Мое мнение. Я очень приветствовал бы ваш вариант с абсолютным графиком (как вы это называете). Т.е. с определенной (выставляемой  в скетче) верхней и нижней границей. С масштабом равным либо близким к пиксель на миллиметр рт.ст.

Третий график на дисплее сделал бы ваш прибор универсальным. Но это другой алгоритм и хватит ли места?

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

Сейчас я несколько раз в день смотрю на дисплеи барографов. Но ведь когда-то наиграюсь и буду вспоминать о нем лишь периодически. Это, собственно, и есть нормальный режим для такого прибора.

Оптимально, на мой взгляд, два варианта. Один с жесткой экономией, второй с питанием от сети, т.е. непрерывной индикацией. Я пока не готов сказать, какой выбиру. У вас естественно может быть свое видение. И свои желания-нежелания.

С пределами на абсолютном графике не так все просто. Мало кто реально представляет диапазон для своей местности. Попытки гуглить конкретного результата не дали. Для себя я пока ориентируюсь на 730-770. Как реально - не знаю. Зимой давление растет, летом падает. Физика. Сильное расширение диапазона пагубно скажется на наглядности. Сужение... а на сколько?

Если это возможно, то скажем два пикселя на миллиметр и автоматическое изменение границ, по типу как это реализовано у вас сейчас. Но изменение границ при "касании графиком". Без изменения масштаба. Т.е. не растягиваем график по вертикали, а сдвигаем наше узкое окно вверх или вниз.

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

НО!!! Хотеть то я могу много. Немного подумать и немного по клаве постучать - цена вопроса для меня. А вам... ну не жизнь же этому посвящать, ваши трудозатраты на порядки больше.

s13
Offline
Зарегистрирован: 22.05.2016

С местом для программы проблем нет,  занята только половина. Напругу на дисплей с порта заводить не нужно, в новой версии библиотеки LCD5110_Graph есть режим enableSleep(); и disableSleep(); Можно добавить дефайн для желающих/нежелающих экономить на гашении дисплея.  Сдвижной график тоже считаю оптимальным вариантом, как будет результат покажу.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

s13

через порт отключать питание намного экономичнее , но потом нужно повторно инициализировать.

enableSleep(); и disableSleep(); -потребляют больше чем жесткое отключение.

Есть человек который провел испытание

+srukami Согласен. Провёл испытания 1 дисплей без подсветки включён, показывает значения ток = 0,884 мА.
2 дисплей погашен командой 0х24 ток = 0,630 мА.
3. вырубили питание ток = 0 мА)))))
при включении необходимы минимум 2 команды: display.begin(); display.setContrast(cont);

 

s13
Offline
Зарегистрирован: 22.05.2016

Странно, оба мои дисплея потребляют 0.23ma, а в режиме сна меньше микроампера. Похоже у человека текучий конденсатор на плате дисплея.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

s13 пишет:

Странно, оба мои дисплея потребляют 0.23ma, а в режиме сна меньше микроампера. Похоже у человека текучий конденсатор на плате дисплея.

Вы правы и так может быть, не проверял лично.

Но у меря висит на порте поэтому я лучше буду тушить полностью.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Сорри. Я тут может не настолько глубок и могу ошибаться.

Разные дисплеи. Они реально бывают разными. Получил 2 5110, взятые по разным ссылкам. Первый шел пешком 4 месяца. Тот, что по ссылке Бодрого раза в полтора тяжелее даже. Токи проверить/сравнить по ряду причин сейчас не смогу.

Жизнь, опыт, общение с теми, кто в теме, научили меня следующему: каждое выключение-включение электроники по своим разрушительным последствиям примерно сопоставимо с несколькими часами непрерывной работы. Правда мы обсуждали компы/телевизоры и другие электронагревательные приборы. С дисплеями и МК ситуация вряд ли аналогична, но по идее переходные процессы, скачки тока-напряжения и т.п должны присутствовать и там...

Для дисплея от сименса лс020, например, написано, что перед выключением дисплей должен очищаться специальной командой. Дело в том, что остаточный заряд на пикселях, вызывает электролиз и разложение жидких кристаллов. Не думаю, что в 5110 все так же запутано, не видно на нем остаточного изображения после выключения (на лс020- несколько минут (не секунд!) видно), но кто знает...

В принципе это мнение дилетанта в данной конкретной области. Возможно чушь пишу.

s13
Offline
Зарегистрирован: 22.05.2016

Не знаю точно в чем там дело, но библиотека очищает буфер данных дисплея перед входом в режим сна. Возможно на это есть причины, сам на эту тему не искал. Насчет переходных процессов при включении питания - не думаю что это сильно повредит. Ток будет ограничен выводом контроллера, а скорость нарастания конденсатором по питанию на переходной платке. К тому же как Вы и сказали, при выключении не видно остаточных пикселей. Вероятно контроллер сам их гасит при пропаже питания.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

s13

Похоже вы были правы относительно кварца. Прибор повесился. Рисует график или нет не в курсе пока, но на кнопку не реагирует. Чтож, попробую с кварцем. МК в программатор и просто перешью фьюзы.

....................................

Померял ток дисплея по линии питания. 160 мка. Это только по питанию. Без учета тока сигнальных линий.  Второй дисплей пока не хочу впаивать штыри, на случай использования в макимально плоском приборе. Позже возможно припаяю гребенку проводами, тогда померяю. Но второй и выглядит куда лучше и тяжелее раза в полтора. Гребенки с двух сторон, в отличие от первого. Первый - как будто собран немытой бомжихой в загаженном подвале. Даже со следами ржавчины.

Кстати, некоторое время назад, при испытании дисплея 3310 (они аналогичны, кроме разводки), наткнулся на такой эффект: дисплей функционировал при отключеной линии питания. При питании ардуино от 5 вольт, дисплей через переходник-адаптор. Я просто воткнул питание в соседнюю линейку на макетной панели. Заметил не сразу. Проверил на другом дисплее - аналогично. Опасно это для дисплея или нет - не в курсе.

Андрей1963
Андрей1963 аватар
Offline
Зарегистрирован: 24.01.2015

Было уже .....  Посты 38-56..... Солевых батареек АА должно хватить где то на год.... 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Андрей1963 пишет:

Было уже .....  Посты 38-56..... Солевых батареек АА должно хватить где то на год.... 

Понятно. Разбирусь с этими вариантами, возможно попробую. Я, собственно уже пробовал некоторые скетчи, еще в самом начале. И какие-то у меня не пошли. А поскольку опыта я набираюсь постепенно, не обессутьте...

Что касается s13 и bodriy2014, думаю, люди создают свое. Развиваются и на месте не стоят. Это тоже позиция достойная уважения.

Для s13.

Пробовал раскомментировать установку контрастности. темноват мой дисплейчик. И при компиляции выдало ошибку. Компилировал для про-мини 3,3 вольта 8 мгц.

..............................

Немного поблуждал во фьюзах. Блин, пару тройку месяцев перерыв и уже не помнишь, что и где...

Запустил снова с кварцем 16 мгц. Только галку оставил делителя на 8. ХЗ надо снимать-не надо. Практика покажет.

s13
Offline
Зарегистрирован: 22.05.2016

Лекс 59 пишет:

Пробовал раскомментировать установку контрастности. темноват мой дисплейчик. И при компиляции выдало ошибку. Компилировал для про-мини 3,3 вольта 8 мгц.

myGLCD.setContrast(cont); //регулировка контраста при необходимости

Именно в строке 64 ошибку даёт ?

 

Проверьте строку 23  #define cont 65 //контрастность

Попробуйте обновить библиотеку дисплея: http://www.rinkydinkelectronics.com/library.php?id=48

Андрей1963
Андрей1963 аватар
Offline
Зарегистрирован: 24.01.2015

........Понятно. Разбирусь с этими вариантами, возможно попробую. Я, собственно уже пробовал некоторые скетчи, еще в самом начале. И какие-то у меня не пошли. А поскольку опыта я набираюсь постепенно, не обессутьте...

Да  просто понять как загонять в сон и будить дуинку для экономии энергии (по прикидкам солевых АА должно хватить где то на год). Я где то надыбал статью про функции сна и сторожевого таймера и использовал их ....  Скорее всего есть куча других вариантов (как и вариантов вывода нужной информации на дисплей). 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Была моя ошибка, не раскомментировал вторую строку. Но результат прежний. Ошибка. если дело в библиотеке, пока не буду ее заменять. Запутаюсь нафиг.

Barograf_S13_2:23: error: 'define' does not name a type

C:\Documents and Settings\Admin\Мои документы\Arduino\Barograf_S13_2\Barograf_S13_2.ino: In function 'void setup()':

Barograf_S13_2:62: error: 'cont' was not declared in this scope

Barograf_S13_2:72: error: 'wakeUpPin' was not declared in this scope

Разобрался. Не было решетки перед дефайн. Сейчас попробую.

.............................

Да, доставшийся мне дисплейчик далек от совершенства. С третьего раза подобрал контрастность, но изображение не идеальное. При 60 бледновато, при 65 видно полосы и рамку. Ну да для опытов пойдет.

..........................................

Припаял проводки к дислею, взятому по ссылке от Бодрого. При питании 3,3 вольта в режиме теста дисплея потребление по шине питания 280-340 мка. Подсветка инверсная (на землю надо подключать). Дисплей на порядок более качественный. И подсветка ровнее и изображение без всяких недочетов. Но он более прожорлив.

Не все ёгурты одинаково полезны...

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Лекс 59 пишет:

....Припаял проводки к дислею, взятому по ссылке от Бодрого. При питании 3,3 вольта в режиме теста дисплея потребление по шине питания 280-340 мка. Подсветка инверсная (на землю надо подключать). Дисплей на порядок более качественный. И подсветка ровнее и изображение без всяких недочетов. Но он более прожорлив.

Не все ёгурты одинаково полезны...

Я больше скажу у меня много дисплеев 3310/5110 с телефонов, так они еще качественнее.

Это может и субьективное наблюдение, но мне кажется пиксели четче отрисовываются.

s13
Offline
Зарегистрирован: 22.05.2016

   Прошу протестировать новый вариант, нужны советы по улучшению. Код не причесан, но работает.

- новые библиотеки, ссылки в коде.

- Добавлен сдвижной график 10мм со сдвигом на 5мм в случае выхода за предел с приоритетом последних изменений.

- опция (#define zapolnen) если график1 нужен заполненный.

- через 5 минут опрос происходит только 1 раз за 5 минут для экономии питания.

- при включенной опции компиляции (#define gasim_lcd) через 15 минут дисплей уходит в сон до нажатия на кнопку.

- опция (#define SeaLevel) у меня например с коррекцией к уровню моря данные не совпадают с местной метеостанцией, эономим 1к памяти если коррекция не нужна.

- опция (#define debug) ускоряет цикл, потенциометер на вход а1 - задатчик для графиков. (потом уберу)

- опция (#define cont 67) топерь в условной компиляции, если нужна коррекция контраста.

#include <LCD5110_Graph.h>    //  rinkydinkelectronics.com/library.php
#include <Wire.h>
#include <Adafruit_BMP085.h>  //  github.com/adafruit/Adafruit-BMP085-Library
#include <LowPower.h>         //  github.com/rocketscream/Low-Power

Adafruit_BMP085 dps;

// ********** Опции компиляции **************
//#define SeaLevel            // разкоментировать для коррекции на высоту
//#define debug               // для тестирования графиков (ан.вход a1 как задатчик давления)
//#define cont 67             // для изменения раскоментировать эту строку (70 по умолчанию)
#define zapolnen            // Заполнение графика 1
//#define gasim_lcd           // если экономим батарейки гашением LCD


long P_win = 165 * 133.3;    // Верхняя граница абс. графика по умолчанию до сдвига (600 + 165) = 765мм

#if defined (SeaLevel)  // если не включена коррекция, экономим память
float Alt_corr = 32.4;  // Коррекция высоты в метрах.
#endif

uint32_t Pressure; 
unsigned char sotki ;    // сотые для давления
unsigned char p_count, p2;
long P_Min, P_Max, P_Dt, P_Mid; 
uint16_t P_Mem[217]; //-79980 = 600мм (3 day 20min memory, 72 per 24 hour) 
signed char x, y, last_x, last_y;
// nokia 5110 connect
// pin d3 - Serial clock out (SCLK)
// pin d4 - Serial data out (DIN)
// pin d5 - Data/Command select (D/C)
// pin d6 - LCD reset (RST)
// pin d7 - LCD chip select (CS)

LCD5110 myGLCD(3, 4, 5, 6, 7);


// bmp180 connect
// sda  - a4
// scl  - a5

// Use pin 2 as wake up pin
const char wakeUpPin = 2; // d2 для кнопки
const char lightPin1 = 11; // d11 подсветка дисплея
const char lightPin2 = 12; // d12 инверсная подсветка дисплея
const char batPin = 0;    // a0 - ан. вход для контроля батареи 220к/51к

char scr_num = 0;          // Номер экрана для отображения
boolean key_pressed = false; // Признак что кнопку жали
boolean Refresh = true;      // Признак что нужно обновить отрисовку (для экономии батарей)
boolean Lcd_On = true;      // Признак что дисплей включен
char light_on = 4;         // длительность подсветки при включении 4*4 = 16с. 

extern unsigned char SmallFont[];  // внешние шрифты
extern unsigned char BigNumbers[];
extern unsigned char TinyFont[];    
unsigned char tik = 0;           // счетчики для времени
unsigned char Count_Minute = 0; 
uint32_t Son_count    = 0;

//******************************** START ***************************************
void setup() {
  
  
  myGLCD.InitLCD();
#if defined (cont)
  myGLCD.setContrast(cont); //регулировка контраста при необходимости
#endif
  myGLCD.setFont(SmallFont);
  Wire.begin();
  
  analogReference(INTERNAL); //1.1v internal op.source
  pinMode(batPin,INPUT);     //Вход для контроля батареи
  
#if defined (debug) 
  pinMode(1,INPUT);  // а1 - задание давления
  analogRead(1);
#endif  
    
  LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);

  //dps.begin(BMP085_ULTRALOWPOWER);
  //dps.begin(BMP085_STANDARD);
  dps.begin(BMP085_HIGHRES);
  //dps.begin(BMP085_ULTRAHIGHRES);
 

  pinMode(wakeUpPin, INPUT);  // Configure wake up pin as input.  
  digitalWrite(wakeUpPin, 1); // pullup
  
  pinMode(lightPin1, OUTPUT);// lcd light pin as output;
  pinMode(lightPin2, OUTPUT);// lcd light inv pin as output;
  
#if defined (SeaLevel)
  Pressure = dps.readSealevelPressure(Alt_corr); // с коррекцией на уровень моря
#else
  Pressure = dps.readPressure();                 // без коррекции к уровню моря
#endif

  P_Mid = Pressure - 79980; // (79980 = 600mm) отсекаем лишнее
  P_Mem[p_count] = P_Mid; // заносим в память первое значение давления для правильной работы усреднения

//  Serial.begin(9600);
//  while (!Serial) ; // wait for Arduino Serial Monitor
//  delay(200); 
}



void loop() {          // ***************************************************************************************************************

  // Allow wake up pin to trigger interrupt on low.
#if defined (debug)
#else
if ((Son_count < 5)||((!(Son_count % 5))&&(tik==0))) {    // через 5 минут активности, не заходим в тело по 5 минут
#endif

//  Serial.print("S=");Serial.print(Son_count);Serial.print(" %=");Serial.println(Son_count % 5);

#if defined (SeaLevel)
  Pressure = dps.readSealevelPressure(Alt_corr); // с коррекцией на уровень моря
#else
  Pressure = dps.readPressure();                 // без коррекции к уровню моря
#endif

#if defined (debug) 
  Pressure = map(analogRead(1),0,1023,730*133.3,790*133.3);  // для отладки резистор на а1 - задатчик давления
#endif    
 // для экранов с инверсным подсветом использовать lightPin2
  if  (light_on > 0) {
    digitalWrite(lightPin1, 1);digitalWrite(lightPin2, 0);
    light_on--;
  }
  else {digitalWrite(lightPin1, 0);digitalWrite(lightPin2, 1);} // lcd light on/off
  
 


  if (Pressure > 79900){  // 600mm
    P_Mid = (P_Mid + (Pressure - 79980))/2; // усреднение замеров, отбрасываем показания ниже 600мм.(сбоит бывает)
  }
#if defined (debug)
    if (Count_Minute >= 2){ Refresh = true;  // раз в секунду
#else
    if (Count_Minute >= 20){ Refresh = true; // каждые 20 мин. запоминаем усредненное значение в память и обновляем графики
#endif 

 
    if (p_count == 216) {
      for (int i = 0; i < 216; i++) // сдвигаем если буфер полон
      {
        P_Mem[i] = P_Mem[i+1];
      }
    } 
    else {
      p_count++;
    }
    P_Mem[p_count] = P_Mid; 
    if (Pressure > 79980){
      P_Mid = Pressure - 79980; // новый старт усреднения
    }
    Count_Minute = 0;
  }


#if defined (gasim_lcd)
    if ((Son_count < 15)&&(!Lcd_On)) {myGLCD.disableSleep(); Lcd_On = true;}   // Если разрешено, гасим дисплей через 15 мин.
    if ((Son_count >= 15)&&(Lcd_On)) {myGLCD.enableSleep(); Lcd_On = false;}
#endif
//  Отображение экранов
if (Lcd_On) {switch (scr_num)
  {
  case 0:  // summary screen
    Refresh = true;          // Обновить отрисовку каждый цикл
//    temp3 = dps.readTemperature();
 
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(BigNumbers);

    //Давление с BMP180
    myGLCD.printNumI(Pressure / 133.3, 15, 5, 3); //рассчет атмосферного давления
    myGLCD.setFont(SmallFont);
    myGLCD.print(".", 60, 22);
    sotki = ((Pressure / 133.3)-int(Pressure / 133.3))*100;
    myGLCD.printNumI((sotki / 10), 66, 22, 1);// десятые 
    myGLCD.printNumI((sotki % 10), 72, 22, 1);// сотые
    myGLCD.print("t=", 20, 35);
    myGLCD.printNumF(dps.readTemperature(), 1, 32, 35);  //температура
    break;

  case 1:  // график давления c фиксированным масштабом    *****************************************************
     if (Refresh){    // Рисуем если разрешено обновить
     
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }
    P_Dt = 10 * 133.3;  // Размах графика 10мм
    for (int i=p2; i<p_count ; i++) {   // ищем окно графика
      if (P_win < P_Mem[i]) {
        P_win = P_win + P_Dt/2;         // сдвиг графика на половину текущего размера
      } 
      if ((P_win - P_Dt)> P_Mem[i]) {
        P_win = P_win - P_Dt/2;
      } 
    }    
    P_Max = P_win ;
    P_Min = P_Max - P_Dt;
    
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов 
        
    x=72;
   
      for (int i=p_count; i>p2 ; i--) {
        y = map (P_Mem[i],P_Max,P_Min,8,48);
        if (y < 8) {y = 8;}
        if (y > 47) {y = 47;} 
#if defined (zapolnen)        
        myGLCD.drawLine(x, y, x, 47);
#else        
        if (x == 72) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
             
        last_x = x; 
        last_y = y;
#endif        
        x--;
      }
   

    myGLCD.printNumF(Pressure/ 133.3, 2, 5, 0);    
    myGLCD.printNumF(dps.readTemperature(), 1, 60, 0);  //температура
    
    myGLCD.setFont(TinyFont);
    myGLCD.printNumI(((P_win + 79980)/133.3)-699.5 , 76, 8, 2);
    myGLCD.printNumI(((P_win + 79980 - P_Dt/2)/133.3)-699.5 , 76, 25, 2);
    myGLCD.printNumI(((P_win + 79980 - P_Dt)/133.3)-699.5 , 76, 42, 2);
//    myGLCD.print("24 Abs", RIGHT, 0);
//    myGLCD.print("Dt:", LEFT, 42); 
//    myGLCD.printNumF(P_Dt / 133.3, 2, 20, 42);  
//    myGLCD.printNumF(Pressure / 133.3, 2, 50, 42); 
 
 
  
    }
    break;

  case 2:  // график давления за сутки с масштабированием
    if (Refresh){    // Рисуем если разрешено обновить
    
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    if (p_count < 72) {
      p2 = 0;
    } 
    else {
      p2 = p_count - 72;
    }

    for (int i=p_count; i>p2 ; i--) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 
    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>p2 ; i--) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }
        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
    myGLCD.print("24 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
    }
    break;

  case 3:  // график давления за трое суток  
    if (Refresh){    // Рисуем если разрешено обновить
    P_Min = P_Mem[p_count]; 
    P_Max = P_Min; // сбросить значения
    for (int i=p_count; i>0 ; i = i - 3) { 
      if (P_Min > P_Mem[i]) {
        P_Min = P_Mem[i];
      } 
      if (P_Max < P_Mem[i]) {
        P_Max = P_Mem[i];
      } 
    }
    P_Dt = P_Max - P_Min;      // макс. разница

    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(TinyFont); // Установка набора символов 

    x=77;
    if (P_Dt > 0){
      for (int i=p_count; i>0 ; i = i - 3) {
        y = ((36 * (P_Max - P_Mem[i]))/P_Dt)+6;  
        if (x == 77) {
          myGLCD.setPixel(x, y);
        } 
        else {
          myGLCD.drawLine(last_x, last_y, x, y);
        }

        last_x = x; 
        last_y = y; 
        x--;
      }
    }

    myGLCD.print("Max:", LEFT, 0);
    myGLCD.printNumF((P_Max +79980)/ 133.3, 2, 20, 0);
    myGLCD.print("72 Zoom", RIGHT, 0);
    myGLCD.print("Min:", LEFT, 42); 
    myGLCD.printNumF((P_Min+79980) / 133.3, 2, 20, 42);
    }
    break;   

  case 4: // напряжение аккумулятора для контроля
    Refresh = true;          // Обновить отрисовку каждый цикл
    myGLCD.clrScr(); // Очистка экрана
    myGLCD.setFont(SmallFont); // Установка набора символов
    myGLCD.print("Bat:", LEFT, 15);    
    myGLCD.printNumF(analogRead(batPin)/176.6, 2, 24, 15);  //напр.батареи (коэфф. подобрать при желании)
    break;
  }

  if (Refresh) {myGLCD.update(); Refresh = false;} // Вывод вместимого буфера на дисплей и сброс признака обновления
} // if (Lcd_On)



#if defined (debug)
#else
    }  // скобка для условия сна в начале цикла в отладке не спим
#endif


  attachInterrupt(0, wakeUp, LOW); // Проснемся от кнопки


  //    Отключить питание на 4с
#if defined (debug)
     LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); 
 #else    
     LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); 
#endif   

   if (!key_pressed) {tik++;} else {key_pressed = false; Son_count = 0;} // в зачёт 4с. если не тыкали кнопку
   
#if defined (debug)
    if (tik >=1) {Count_Minute++; Son_count++; tik = 0;} // минута натикала
#else    
    if (tik >=15) {Count_Minute++; Son_count++; tik = 0;} // минута натикала
#endif   
} // Конец цикла


void wakeUp() // прерывание сна по нажатию кнопки
{
  // Just a handler for the pin interrupt.
  detachInterrupt(0); 
  if (light_on > 0) {scr_num++;} // Первый тычок только подсвет
  light_on = 2;            // после нажатия на кнопку подсветка 2*4 = 8с.
  Refresh = true;        // Обновить отрисовку
  key_pressed = true;   // кнопку жали
    if (scr_num > 4) {
      scr_num = 0;
    }
    LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); //антидребезг
    attachInterrupt(0, wakeUp, LOW); // восстановить прерывания от кнопки
} 





 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Ваш предыдущий вариант работает уже потора суток после установки кварца.

Протестировать готов. Библиотеки обязательно заменять? Или будет работать со старыми? Я в этой области пока дилетант, прошу извинить, не все понял пооткрывав кучу ссылок (открываются кстати не все).

s13
Offline
Зарегистрирован: 22.05.2016

Библиотеки обновить, потестировать лучше (быстрее)  с опцией debug и переменным резистором на а1. Ссылки всего 3:

http://www.rinkydinkelectronics.com/library.php?id=48

https://github.com/adafruit/Adafruit-BMP085-Library

https://github.com/rocketscream/Low-Power

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Попробовал скомпилировать со старыми библиотеками. Вроде норм.

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

Переменный резистор. Номинал? Один конец питание, второй земля третий на А1?

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

Хекс в том виде, как я его снял (со старыми библиотеками), имеет смысл заливать в мегу? Я тогда прерву прогон.

"с опцией debug"... я пока зелен. Не вьехал, сорри...

s13
Offline
Зарегистрирован: 22.05.2016

Лекс 59 пишет:

Попробовал скомпилировать со старыми библиотеками. Вроде норм.

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

Лекс 59 пишет:

Переменный резистор. Номинал? Один конец питание, второй земля третий на А1?

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

Хекс в том виде, как я его снял (со старыми библиотеками), имеет смысл заливать в мегу? Я тогда прерву прогон.

"с опцией debug"... я пока зелен. Не вьехал, сорри...

Да, с резистором всё верно, номинал любой от 1к и больше. Он будет работать вместо сенсора если разкоментировать строку (#define debug), если оставить как есть, то код будет рабочий и под нормальный датчик.

Прогон это можно, но долго. Лучше оцените с резистором.

 

 

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Понял так:

Заливать в мегу можно и со старыми библиотеками. Просто чуть больше потребление будет. А резистор - иммитация изменения давления . Метки создавать.

Сейчас попробую залить. Резистор ставить не буду. График по вашему алгоритму  и без того очень далек от прямой линии, запутаться трудно. А если бежит один график, значит бежит и другой.

Dimanoss
Offline
Зарегистрирован: 29.05.2016

делаю что-то подобное.  Скажем так - первый проект на ардуино, чисто чтобы руку набить.  Задача - сбор метеоданных с некоторой периодичностью (раз в 10 минут), пересылка их по WLAN на сервер, обработка на сервере.

Из модулей-датчиков: температурный/влажности (AM2301 на DHT21) и - давления (присмотрел BMP180).  Позже хотелось бы собирать данные о ветре (сила, направление) и интенсивности осадков.  Как додумаю механику (флюгера-анемометры), так буду расширять функционал.

Теперь вопрос к тем, кто делал уже подобное.  Где и как размещать прибамбас, какой корпус лучше.  Питание, думаю, автономным не получится сделать, но бросить проводок за окно - если и проблема, то только эстетического плана.  Но как ардуина (пока что, кстати, - Leonardo) себя на улице ведёт?  У нас где-то 12-15 ниже нуля бывает, и влажность высокая.  Если контроллер дома держать, лишь датчики наружу выводить - не падает ли точность измерений?  С AM2301 более-менее понятно всё, он в outdoor-корпусе, но как "паковать" остальные?  Да и AM2301 - надо ли его как-то разворачивать, от дождя укрывать, или можно тупо "решёткой" вверх прикрутить...

В общем - интересно практиков выслушать... :-)

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Dimanoss пишет:

 Если контроллер дома держать, лишь датчики наружу выводить - не падает ли точность измерений?  С AM2301 более-менее понятно всё, он в outdoor-корпусе, но как "паковать" остальные?  Да и AM2301 - надо ли его как-то разворачивать, от дождя укрывать, или можно тупо "решёткой" вверх прикрутить...

В общем - интересно практиков выслушать... :-)

По этой части я  практик лишь частично. Но что точно:

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

Нет. Возрастает. Ардуино на улицу, может и допустимо, но не целесообразно. Иначе нужен герметичный корпус. Раница температур и конденсат на пользу ей не пойдут.

Паковать датчики не затрудняя тепло/газо обмен(влажность), НЕ (!!!) на прямом солнце. Подальше, особенно датчики температуры, от любых поверхностей, которые могут нагреваться на солнце. Защита от влаги сверху, и сетчатая конструкция от пыли/насекомых. Некоторые датчики (давления и температуры, можно в герметичный бокс. Но датчики температуры тогда должны иметь неплохой тепловой контакт с ним. В принципе эти два можно загнать в скотч-лок (пакетики с застежками) или просто пакетики, провода наружу и скотчем закупорить. И от пыли и от влаги.

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Для s13

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

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

Для s13

Действительно интересный и наглядный график получается. Автоматически уже перешел на предел ниже. Пока график неполный, фото выложу чуть позже. Ваш вариант и Бодрого 2014.

Правда сразу должен предупредить, что в некоторых случаях именно абсолютный график будет малоинформативен. При резких перепадах давления (я пока не знаю, какими они бывают) график может казаться полностью заполненым, кроме одного пикселя или полностью пустым, тоже кроме одного пикселя. Но на этот случай есть два других графика, сутки и трое, которые сомнения полностью разъяснят.

Вопрос. Не скажете, автоматическое изменение пределов работает только в узком диапазоне плюс-минус 5 мм, или оно будет и дальше шагать при смене времени года и значительного изменения диапазона давлений?

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

.................................................................

Ага, выложил фото. Пошел фотографировать, неосторожное движение и нет графика. Макетка есть макетка. А сейчас как раз давление довольно сильно меняется.

s13
Offline
Зарегистрирован: 22.05.2016

Лекс 59 пишет:

Для s13

Вопрос. Не скажете, автоматическое изменение пределов работает только в узком диапазоне плюс-минус 5 мм, или оно будет и дальше шагать при смене времени года и значительного изменения диапазона давлений?

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

Шагать будет сколько нужно и вверх и вниз, причем с приоритетом правой (новой) части графика. В скетче можно настроить и размер и на сколько сдвигать если уходит из окна. Полностью заполненным или пустым он оказаться не сможет, сдвинется.

s13
Offline
Зарегистрирован: 22.05.2016

Лекс 59 пишет:

Ага, выложил фото. Пошел фотографировать, неосторожное движение и нет графика. Макетка есть макетка. А сейчас как раз давление довольно сильно меняется.

Вчера тоже макетку уронил :) хорошо дисплей выжил. График по новой, ну почти сутки. Чуток контраст великоват, для тестов сойдёт. Кроме батарейного: