Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.98/44: Рейтинг темы: голосов - 44, средняя оценка - 4.98
Tohym
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
1

Алгоритм и реализация автоматического учета расхода воды

16.09.2016, 13:21. Просмотров 7955. Ответов 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;
}
}
2. Как учитывать данные, если сервер может быть выключен, и сама atmega тоже может быть обесточена? Писать в EEPROM (я пока про него ничего не знаю)?

Алгоритмы, пока русским языком, второму вопросу:
Если импульсов нет в течении 10000ms {
Считать текущие данные EEPROM;
Добавить к ним значения текущих переменных;
записать новые значения EEPROM;
обнулить текущие переменные;
}
Если пришел запрос от сервера{
передать текущие значения из EEPROM;
}

Если от сервера получено подтверждение в получении данных{
обнулить данные EEPROM;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2016, 13:21
Ответы с готовыми решениями:

Создать устройство автоматического наполнения воды в ёмкости с 1 концевым датчиком
Доброго времени суток! Хочу создать устройство автоматического наполнения воды в ёмкости с 1...

датчик расхода воды
Коллеги, съел уже весь мозг (яндекс+гугл). Необходим датчик расхода воды (до 0-30мл на импульс)....

Преобразование расхода воды в перемещение заслонки
Подскажите пожалуйста. У меня задание по проектированию системы автоматического управления:...

Реализация прихода и расхода в БД Склад
В данной БД Склад компонентов и приборов необходимо реализовать функцию прихода и расхода...

Реализация автоматического обновления
Добрый день. мне необходимо реализовать такую вещь: есть выгрузка, которая формирует csv файл и...

21
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
16.09.2016, 13:38 2
Ititma есть выход геркон, а есть какой-то НАМУР. Что это за НАМУР такой - не в курсе ?
0
mrKyrytt
0 / 0 / 0
Регистрация: 16.04.2010
Сообщений: 767
16.09.2016, 15:02 3
Цитата Сообщение от x893
Ititma есть выход геркон, а есть какой-то НАМУР. Что это за НАМУР такой - не в курсе ?
Ну вот только принято его писать в латинице "namur".
Ничего особо примечательного. Если у обычного датчика есть 2 состояния - "замкнуто/разомкнуто", то у "namur" еще 2 дополнительных "обрыв линии/КЗ в линии".
Реализуется это резисторами и контролем тока в линии.
0
Tohym
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
17.09.2016, 11:22 4
В моем случае это банальный геркон. Хотелось бы комментариев по теме.
Немного почитал про EEPROM (кол-во циклов перезаписи) и теперь сомневаюсь, что запись каждые 10сек. это хорошая идея.
Видимо при отсутствии сигналов в течении 10 сек нужно попытаться отправить данные на "сервер", и если удалось, то обнулить их.
0
Zutiy
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 65
17.09.2016, 18:30 5
Вы уверены, что вам PCINT будет хорошо? Два импульса могут одновременно прийти?
Я бы по таймеру с заданным интервалом сделал проверку пинов.
0
kytikot
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
17.09.2016, 20:26 6
1. Если питания не будет на АтМеге - то всё, никаких чтения/записи в EEPROM не сделаешь.
2. Если волнует количество перезаписей в EEPROM МК - то есть отдельные микросхемы памяти, типа AT24 - там, кажется, кол-во перезаписи больше в разы.

Цитата Сообщение от Zutiy
Вы уверены, что вам PCINT будет хорошо?
Он ни в чем не уверен, он новичок, о чём и написал. Эти моменты нужно разъяснять.
0
Tohym
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
17.09.2016, 21:58 7
Цитата Сообщение от Zutiy
Вы уверены, что вам PCINT будет хорошо? Два импульса могут одновременно прийти?
Так вроде в "быдлокоде" я по прерыванию оба пина проверяю. Даже если придут одновременно, все должно быть учтено.
Цитата Сообщение от Zutiy
1. Если питания не будет на АтМеге - то всё, никаких чтения/записи в EEPROM не сделаешь.
Вопрос в другом. Например "сервер" в течении дня/недели/месяца не включался, все накопленные сведения хранятся в оперативке Атмеги, а потом бац! и перебой по питанию.. и потеряно огромное кол-во данных. Поэтому я хотел бы делать промежуточные сохранения...
0
SimiryOM
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 12
18.09.2016, 14:18 8
Вот пример реализации NUMUR со стороны датчика.

{del}
0
pitrpts
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
18.09.2016, 15:03 9
NAMUR - это токоограниченный для взрывоопасных применений вариант электрического стандарта токовой петли (4-20 мА), которым можно определять как логическое состояние датчика, так и электрическое состояние проводов на обрыв (ток = 0 мА), коротун (ток больше определённого значения - для разных подвидов).
Есть смысл намурить геркон домашнего водосчётчика ?
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
18.09.2016, 15:19 10
Поставьте FROM память. Стоит не так много, кол-во циклов неограничено, нулевое время записи. Хоть годами пишите.
0
pitrpts
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
18.09.2016, 15:45 11
Цитата Сообщение от Hotd
Поставьте FROM память. Стоит не так много, кол-во циклов неограничено, нулевое время записи. Хоть годами пишите.
Используй малопотребляющую версию Атмела picoPower или STM8L/STM32T и плата буде жить долго на одной батарейке с просыпанием по событию от геркона
0
SimiryOM
0 / 0 / 0
Регистрация: 15.09.2016
Сообщений: 12
18.09.2016, 15:46 12
Цитата Сообщение от pytrpts
Есть смысл намурить геркон домашнего водосчётчика ?
В системах учета воды это применяется для контроля за обрывом либо замыканием линии связи учетного узла с счетчиком воды.
(Для того чтобы "умники" не обманывали учетный узел откинув контакты либо их замкнув)
Если делается для себя то никакого смысла нет.
0
Tohym
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
18.09.2016, 22:03 13
Цитата Сообщение от Hotd
Поставьте FROM память. Стоит не так много, кол-во циклов неограничено, нулевое время записи. Хоть годами пишите.
Что это (коды микрух подскажете)? Оно действительно необходимо? Как его связать с Мегой?
Цитата Сообщение от pytrpts
Используй малопотребляющую версию Атмела picoPower или STM8L/STM32T и плата буде жить долго на одной батарейке с просыпанием по событию от геркона
У меня есть 12V в необходимой точке, зачем мне батарейка? А! кажется понял, можно будет не парится с сохранением данных...
Хотя с сохранением можно делать разбивку по времени, что поможет контролировать потерю данных. Допустим сохранять значения каждый час, если за какой-либо час отсутствуют данные - сообщать об ошибке и необходимости ручной коррекции..

Хотелось бы ближе к теме. я про Си почти ничего не знаю, и еще меньше знаю про микроконтроллеры. Мой говнокод кто-нибудь открывал? Насколько там все плохо? Может кто-то знает готовые примеры из которых можно скопитырить нужный функционал?
0
stritsh
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
19.09.2016, 00:23 14
Цитата Сообщение от Tohym
Хотелось бы ближе к теме. я про Си почти ничего не знаю, и еще меньше знаю про микроконтроллеры. Мой говнокод кто-нибудь открывал? Насколько там все плохо? Может кто-то знает готовые примеры из которых можно скопитырить нужный функционал?
По поводу вашего кода. Ваша программа может словить ложное срабатывание из-за "дребезга" в момент размыкания контактов геркона. Объясню где косяк (к примеру для холодного водомера): после того, как в основном цикле вы присваиваете (Cold_Count = 2; //ставим флаг в состояние "учтено") может произойти так, что в момент размыкания геркона в обработчике прерывания PCINT программа пойдет по условию (if ((PINB & (1 << PB0)) == 0 && Cold_Count == 2)) и из-за дребезга сработает еще раз прерывание PCINT в момент замыкания контакта (это будет ложным срабатыванием).Может как-то сумбурно объяснил, но обратите внимание на моменты, когда контакт геркона размыкается.
Можно попробовать так:
Код
Код
#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
yiv91
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
19.09.2016, 00:58 15
Если требования к бесперебойности высокие, то лучше применить отдельный аппаратный счетчик, и опрашивать и сбрасывать его программно по необходимости. Счетчики есть 12-разрядные КМОП 74HC4040 со сбросом, можно запитать его от маленькой батарейки, ее хватит на годы. Можно питать от литиевого аккумулятора, а заряжать от сигнала линии связи, или отдельным проводом. Входной сигнал с геркона нужно очистить от дребезга с помощью ФНЧ на RC-цепи и желательно оцифровать любым КМОП элементом, а можно попробовать подать непосредственно на счетный вход. Многие микросхемы КМОП имеют входы с гистерезисом. Разрядность легко наращивается последовательным соединением счетчиков.
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
19.09.2016, 08:58 16
FROM - например FM25V10, 128кбайт памяти. Управляется легко, по SPI, код аналогичен флеш памяти - AT25. полностью совместима по пинам. Есть и попроще памяь, вам по сути надо с десяток байт. Можно взять FM25L04B, 4 кбайта памяти, вам за глаза.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
19.09.2016, 11:04 17
Tohym рассматривайте датчик как обычную кнопку. Все, что вам нужно так это учесть дребезг контактов. Сделать это можно по разному. Самый простой способ это без всяких прерываний при обнаружении "нажатия" сделать паузу (_delay_ms()) и после паузы проверить состояние, если кнопка все еще нажата, считаем, что она нажата, если нет, то это дребезг. В вашем случае пауза от 400 до 1000мсек мне думается подойдет.

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

В интернете полно статей и готовых библиотек по работе с кнопками

Вам стоит подумать об автономном питании чтобы даже при пропадании электричества не терять сигналы о расходе воды. Eeprom может быть нужен, а может и нет в зависимости от логики работы датчика. Eeprom точно не заменит автономное питание, т.е. Не поможет отследить расход воды на время отсутствия электричества
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
19.09.2016, 11:44 18
Ну ... можно сделать и "иначе". Поставить КМОП счетчик, завести на него сигнал с геркона и поставить li батарейку. Оно будет просто считать - долго, надежно, не зависимо от сети, годами. Если к нему сбоку привесить считывалку на ARM (или, брр, AVR), то можно уменьшить емкость счетчика до, скажем 8 разрядов.
Или еще более иначе. С геркона сигнал пропустить через RC и получить импульс включения MCU. Т.е. геркон будет не "датчиком", а устройством, которое включает питание. По появлению питания MCU выполняет сложнейшие математические рассчеты по увеличению счетчика на 1 и далее выключается отключает собственное питание. Потреблять такой девайс будет мизер, батарейки хватит на год(ы).
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
19.09.2016, 14:31 19
Все это только потому, что нет доверия к ТС?)
У автора как я понял есть доступ к электросети, батарея это лишь резерв на котором атмега328 при пробуждении по прерыванию из power down может жить много месяцев
Не вижу резона городить вокруг МК еще что то
Отказаться от МК нельзя по условию задачи

Здесь разве что заменить атмегу на esp8266, сразу получим доступ к серверу через wifi
0
Tohym
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 43
19.09.2016, 22:23 20
Спасибо всем за участие. Если никого не обидит, то я предпочел бы обращение ко мне на "ты".
Требования к бесперебойности низкие. Я плачу за воду в кубометрах, +/- 10 срабатываний в месяц меня не сильно расстроят. Душ при свечах я тоже вряд ли буду принимать, поэтому в отсутствии электричества расход будет равен нулю.
Поэтому защита нужна именно от кратковременных пропаданий электропитания.
на меге еще будут висеть около 4 реле, и возможно фоторезистор, поэтому ESP8266 в голом виде не пойдет..
Цитата Сообщение от stritsh
Ваша программа может словить ложное срабатывание из-за "дребезга" в момент размыкания контактов геркона.
Ага, осознал, спасибо!

Цитата Сообщение от stritsh
Можно попробовать так
А я правильно понимаю, что если вначале такого кода инициировать PCINT, а в конце основного цикла прописать, что-то вроде :

C
1
2
3
4
5
count_cycles++;
if (count_cycles>16);{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
}
То это будет похоже на работу по прерыванию? Ну то есть геркон пробудил мегу, она все посчитала, и через 16 основных циклов благополучно уснула...

Тогда возник еще вопрос:
Если питать мегу от конденсатора, и завести сигнал через делитель на int1, а обработчике прерывания сделать запись в eeprom. То есть писать данные только при пропаже электропитания.Насколько "толстый" конденсатор нужен?
0
19.09.2016, 22:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2016, 22:23

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

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru