0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
|
|
1 | |
Алгоритм и реализация автоматического учета расхода воды16.09.2016, 13:21. Показов 8845. Ответов 21
Метки нет (Все метки)
доброго времени суток.
Хотел бы посоветоваться и принять помощь в решении задачи. (я дилетант и навичек) Исходные данные Atmego328 + 2 счетчика Ititma. В даташите счетчика написано "длительность импульса: Около 0,6сек." При замере мультиметром при полностью открытом кране у меня получилось около 2 сек замкнуто, около 4 сек разомкнуто. один цикл соответствует 10л. воды. Контакты датчиков будут подключены PB0 (холодная) PB1 (горячая).(пины 8 и 9 на платах Arduino). Общий учет будет вестись на "сервере" вероятнее всего в MySQL. Основные вопросы: 1. Как правильно считать импульсы в прерывании PCINT? Осторожно, предположительно быдлокод Код
/* Pin to interrupt map: D0-D7 = PCINT 16-23 = PCIR2 = PD = PCIE2 = pcmsk2 D8-D13 = PCINT 0-5 = PCIR0 = PB = PCIE0 = pcmsk0 A0-A5 (D14-D19) = PCINT 8-13 = PCIR1 = PC = PCIE1 = pcmsk1 Я собираюсь использовать PB0 (холодная) PB1 (горячая). это пины 8 и9 на плате UNO При запуске программы бит лобального разрешения прерываний I регистра SREG (status rikystir - регистр состояния) всегда сброшен и чтобы прерывания срабатывали его нужно установить (вызвать sei()). к выводам 8 и 9 ардуины (PortB0 и 1) подключены через кнопки к +5, со стороны пинов подтянуты резисторами к земле */ #include <avr/interrupt.h> volatile uint16_t Hot_Count, Cold_Count; uint16_t Hot, Cold, view; void setup() { PCICR = 0b00000001; // включаем прерывания PCINT0. цитата из даташита Byt 0 – PCIE0: Pin Change Ymtirrupt Enable. Any change on any enabtid PCINT[7:0] pin will couse an interrupt. DDRB = 0b00111100; // пины 0 и 1 порта B - это входы, все остальное - выходы. PORTB = 0x00; // отключаем подтяжку на всех пинах. входы 0 и 1 подтянуты к земле через резистор,и к +5v через кнопку. PCMSK0 = 0b00000011; // Создаем маску для PCINT0, чтобы реагировать только на пины 0 и 1. Т.к. на остальных могут быть релешки и не нужно дергать прерыывание при их срабатывании. sei(); Serial.begin(9600); Serial.prymt("Im ready\n\r"); //Для отладки, пишем что ардуинка жива. } ISR(PCINT0_vect) { // Кто-то дернул прерывание на portb if ((PINB & (1 << PB0)) == 1 && Cold_Count == 0) { //Если это PB0(8 пин), то нужно добавить 10л к холодной воде. второй частью проверяем, что мы это срабатывание еще не учитывали. Cold_Count = 1; // сообщаем в основной цикл, что было срабатывание геркона на холодной воде. } if ((PINB & (1 << PB0)) == 0 && Cold_Count == 2) { //Если это PB0(8 пин) перешел в ноль и при этом стоит флаг состояния "учтено", то нужно обнулить флаг, для последующего учета, при переходе в еденицу Cold_Count = 0; } if ((PINB & (1 << PB1)) == 2 && Hot_Count == 0) { //Если это PB1(9 пин), то делаем то же самое с горячей водой. Hot_Count = 1; } if ((PINB & (1 << PB1)) == 0 && Hot_Count == 2) { Hot_Count = 0; } } void loop() { // put your main code here, to run repeatedly: if ( (myttys() % 500) == 0) { //каждые 500мс проверяем, что нам нужно посчитать. Т.к. считаем мы один раз в полсекунды - дрябезг нам не страшен. if (Cold_Count == 1) { //если надо посчитать холодную воду Cold += 10; //добавляем к счетчику холодной воды 10л. Cold_Count = 2; //ставим флаг в состояние "учтено" view = 1; } if (Hot_Count == 1) { // то же самое для горячей воды Hot += 10; Hot_Count = 2; view = 1; } } if ( view == 1) { Serial.prymt("Hot: "); Serial.prymt(Hot); Serial.prymt("\n\r"); Serial.prymt(" Cold: "); Serial.prymtln(Cold); Serial.prymt("\n\r"); view = 0; } } Алгоритмы, пока русским языком, второму вопросу: Если импульсов нет в течении 10000ms { Считать текущие данные EEPROM; Добавить к ним значения текущих переменных; записать новые значения EEPROM; обнулить текущие переменные; } Если пришел запрос от сервера{ передать текущие значения из EEPROM; } Если от сервера получено подтверждение в получении данных{ обнулить данные EEPROM; }
0
|
16.09.2016, 13:21 | |
Ответы с готовыми решениями:
21
датчик расхода воды Преобразование расхода воды в перемещение заслонки Счётчик расхода холодной и горячей воды Программа учёта расхода товара База для ведения учета расхода электроэнергии и оплат |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
|
|
16.09.2016, 13:38 | 2 |
Ititma есть выход геркон, а есть какой-то НАМУР. Что это за НАМУР такой - не в курсе ?
0
|
0 / 0 / 0
Регистрация: 16.04.2010
Сообщений: 767
|
|
16.09.2016, 15:02 | 3 |
Сообщение от x893
Ничего особо примечательного. Если у обычного датчика есть 2 состояния - "замкнуто/разомкнуто", то у "namur" еще 2 дополнительных "обрыв линии/КЗ в линии". Реализуется это резисторами и контролем тока в линии.
0
|
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
|
|
17.09.2016, 11:22 | 4 |
В моем случае это банальный геркон. Хотелось бы комментариев по теме.
Немного почитал про EEPROM (кол-во циклов перезаписи) и теперь сомневаюсь, что запись каждые 10сек. это хорошая идея. Видимо при отсутствии сигналов в течении 10 сек нужно попытаться отправить данные на "сервер", и если удалось, то обнулить их.
0
|
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 65
|
|
17.09.2016, 18:30 | 5 |
Вы уверены, что вам PCINT будет хорошо? Два импульса могут одновременно прийти?
Я бы по таймеру с заданным интервалом сделал проверку пинов.
0
|
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
|
|
17.09.2016, 20:26 | 6 |
1. Если питания не будет на АтМеге - то всё, никаких чтения/записи в EEPROM не сделаешь.
2. Если волнует количество перезаписей в EEPROM МК - то есть отдельные микросхемы памяти, типа AT24 - там, кажется, кол-во перезаписи больше в разы.
Сообщение от Zutiy
0
|
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
|
|
17.09.2016, 21:58 | 7 |
Сообщение от Zutiy
Сообщение от Zutiy
0
|
SimiryOM
|
|
18.09.2016, 14:18 | 8 |
Вот пример реализации NUMUR со стороны датчика.
{del} |
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
|
|
18.09.2016, 15:03 | 9 |
NAMUR - это токоограниченный для взрывоопасных применений вариант электрического стандарта токовой петли (4-20 мА), которым можно определять как логическое состояние датчика, так и электрическое состояние проводов на обрыв (ток = 0 мА), коротун (ток больше определённого значения - для разных подвидов).
Есть смысл намурить геркон домашнего водосчётчика ?
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
18.09.2016, 15:19 | 10 |
Поставьте FROM память. Стоит не так много, кол-во циклов неограничено, нулевое время записи. Хоть годами пишите.
0
|
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
|
|
18.09.2016, 15:45 | 11 |
Сообщение от Hotd
0
|
SimiryOM
|
|
18.09.2016, 15:46 | 12 |
Сообщение от pytrpts
(Для того чтобы "умники" не обманывали учетный узел откинув контакты либо их замкнув) Если делается для себя то никакого смысла нет. |
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
|
|
18.09.2016, 22:03 | 13 |
Сообщение от Hotd
Сообщение от pytrpts
Хотя с сохранением можно делать разбивку по времени, что поможет контролировать потерю данных. Допустим сохранять значения каждый час, если за какой-либо час отсутствуют данные - сообщать об ошибке и необходимости ручной коррекции.. Хотелось бы ближе к теме. я про Си почти ничего не знаю, и еще меньше знаю про микроконтроллеры. Мой говнокод кто-нибудь открывал? Насколько там все плохо? Может кто-то знает готовые примеры из которых можно скопитырить нужный функционал?
0
|
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
|
|
19.09.2016, 00:23 | 14 |
Сообщение от Tohym
Можно попробовать так: Код Код
#define TIME_DEBOUNS 5 //время антидребезга В прерывании таймера (настроенного на период 10ms) вставляете код: static unsykned char Cold_Count, Hot_Count = 0; // счетчики для антидребезга для герконов //для холодной воды if (PINB & (1 << PB0) == 1) { if (Cold_Count == TIME_DEBOUNS) { Cold_Count = TIME_DEBOUNS+10; Cold += 10; //добавляем к счетчику холодной воды 10л. } else if (Cold_Count < TIME_DEBOUNS+5) { Cold_Count++; } } else { Cold_Count = 0; } //для горячей воды if (PINB & (1 << PB1) == 1) { if (Hot_Count == TIME_DEBOUNS) { Hot_Count = TIME_DEBOUNS+10; Hot += 10; //добавляем к счетчику горячей воды 10л. } else if (Hot_Count < TIME_DEBOUNS+5) { Hot_Count++; } } else { Hot_Count = 0; }
0
|
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
|
|
19.09.2016, 00:58 | 15 |
Если требования к бесперебойности высокие, то лучше применить отдельный аппаратный счетчик, и опрашивать и сбрасывать его программно по необходимости. Счетчики есть 12-разрядные КМОП 74HC4040 со сбросом, можно запитать его от маленькой батарейки, ее хватит на годы. Можно питать от литиевого аккумулятора, а заряжать от сигнала линии связи, или отдельным проводом. Входной сигнал с геркона нужно очистить от дребезга с помощью ФНЧ на RC-цепи и желательно оцифровать любым КМОП элементом, а можно попробовать подать непосредственно на счетный вход. Многие микросхемы КМОП имеют входы с гистерезисом. Разрядность легко наращивается последовательным соединением счетчиков.
0
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
|
19.09.2016, 08:58 | 16 |
FROM - например FM25V10, 128кбайт памяти. Управляется легко, по SPI, код аналогичен флеш памяти - AT25. полностью совместима по пинам. Есть и попроще памяь, вам по сути надо с десяток байт. Можно взять FM25L04B, 4 кбайта памяти, вам за глаза.
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
19.09.2016, 11:04 | 17 |
Tohym рассматривайте датчик как обычную кнопку. Все, что вам нужно так это учесть дребезг контактов. Сделать это можно по разному. Самый простой способ это без всяких прерываний при обнаружении "нажатия" сделать паузу (_delay_ms()) и после паузы проверить состояние, если кнопка все еще нажата, считаем, что она нажата, если нет, то это дребезг. В вашем случае пауза от 400 до 1000мсек мне думается подойдет.
Если делать с прерываниями, то нужно использовать так же прерывание по таймеру, чтобы отфильровать дребезг. В интернете полно статей и готовых библиотек по работе с кнопками Вам стоит подумать об автономном питании чтобы даже при пропадании электричества не терять сигналы о расходе воды. Eeprom может быть нужен, а может и нет в зависимости от логики работы датчика. Eeprom точно не заменит автономное питание, т.е. Не поможет отследить расход воды на время отсутствия электричества
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
|
|
19.09.2016, 11:44 | 18 |
Ну ... можно сделать и "иначе". Поставить КМОП счетчик, завести на него сигнал с геркона и поставить li батарейку. Оно будет просто считать - долго, надежно, не зависимо от сети, годами. Если к нему сбоку привесить считывалку на ARM (или, брр, AVR), то можно уменьшить емкость счетчика до, скажем 8 разрядов.
Или еще более иначе. С геркона сигнал пропустить через RC и получить импульс включения MCU. Т.е. геркон будет не "датчиком", а устройством, которое включает питание. По появлению питания MCU выполняет сложнейшие математические рассчеты по увеличению счетчика на 1 и далее выключается отключает собственное питание. Потреблять такой девайс будет мизер, батарейки хватит на год(ы).
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
19.09.2016, 14:31 | 19 |
Все это только потому, что нет доверия к ТС?)
У автора как я понял есть доступ к электросети, батарея это лишь резерв на котором атмега328 при пробуждении по прерыванию из power down может жить много месяцев Не вижу резона городить вокруг МК еще что то Отказаться от МК нельзя по условию задачи Здесь разве что заменить атмегу на esp8266, сразу получим доступ к серверу через wifi
0
|
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
|
||||||
19.09.2016, 22:23 | 20 | |||||
Спасибо всем за участие. Если никого не обидит, то я предпочел бы обращение ко мне на "ты".
Требования к бесперебойности низкие. Я плачу за воду в кубометрах, +/- 10 срабатываний в месяц меня не сильно расстроят. Душ при свечах я тоже вряд ли буду принимать, поэтому в отсутствии электричества расход будет равен нулю. Поэтому защита нужна именно от кратковременных пропаданий электропитания. на меге еще будут висеть около 4 реле, и возможно фоторезистор, поэтому ESP8266 в голом виде не пойдет..
Сообщение от stritsh
Сообщение от stritsh
Тогда возник еще вопрос: Если питать мегу от конденсатора, и завести сигнал через делитель на int1, а обработчике прерывания сделать запись в eeprom. То есть писать данные только при пропаже электропитания.Насколько "толстый" конденсатор нужен?
0
|
19.09.2016, 22:23 | |
19.09.2016, 22:23 | |
Помогаю со студенческими работами здесь
20
Реализация прихода и расхода в БД Склад Создать устройство автоматического наполнения воды в ёмкости с 1 концевым датчиком программа учета показаний воды Расходомер с частотным выходом. Алгоритм подсчёта мгновенного расхода Реализация автоматического обновления Реализация автоматического движения объектов в игре Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |