Alex77 писал(а):Кто на чем остановился?
Вот уже год реализую данное решение и пока пришел к таким выводам.
1. Считать импульсы можно любым кодом на любой ардуине или ESP.
Это НЕ работает по причине сброса счетчиков при зависании или открытия сериал - порта.
2. На прямую AMS считать импульсы бесполезно по этой же причине.
3. Считать сенсором с батарейным питанием ( можно в качестве резервного хотя бы на сутки ). Сенсор передает значения в AMS , тот в свою очередь в МД.
Ближе к истине , но ограничение по времени работы от батарейки.
4 Самое правильное - счетчик - 1WIRE мост DS2324. 2 счетчика , батарейки хватает на год работы.
Цена вопроса - 1200 рублей готовое изделие на 2 счетчика. Цена микрухи очень не адекватная на АЛИ. Ссылки выше.
Готовый код для сенсора AMS
Код: Выделить всё
/*
YF-S201 Hall Effect Water Flow Meter / Sensor
http://www.hobbytronics.co.uk/yf-s201-water-flow-meter
Read Water Flow Meter and output reading in litres/hour
Тупо регистрируем замыкания контактов
*/
#ifdef YFS201_FEATURE
int pin3 = 3; // 3-й цифровой пин, первое прерывание
long counter = 0; // счётчик импульсов
int pin2 = 2; // 2-й цифровой пин, 0 прерывание
long counter1 = 0; // счётчик импульсов
long vol1_last ; // полезные переменные
long vol2_last ;
void yfs201Init()
{
// Настраиваем последовательный интерфейс, для вывода информации
// Serial.begin(9600); // кажется ,это лишнее
//Настраиваем цифровой вход
pinMode(pin3, INPUT); // Сюда будем подключать подтягивающий резюк
digitalWrite(pin3, HIGH); // "Подключаем" подтягивающий резистор (реализован внутри ATmega)
attachInterrupt(1, count1, FALLING); // задаём обработчик прерывания 1 (3-й пин).
// прерывание будет при изменении уровня с HIGHT на LOW
// вызывать функицю count 1
pinMode(pin2, INPUT); // Сюда будем подключать подтягивающий резюк
digitalWrite(pin2, HIGH); // "Подключаем" подтягивающий резистор (реализован внутри ATmega)
attachInterrupt(0, count0, FALLING); // задаём обработчик прерывания 0 (2-й пин).
// прерывание будет при изменении уровня с HIGHT на LOW
// вызывать функицю count 0
}
void yfs201Works ()
{
// основной рабочий цикл
vol1 = (counter /430); //430 оборотов на литр первый счетчик
vol2 = (counter1 / 430); //430 оборотов на литр( можно подключить электросчетчик и изменить коэффициент)
// vol1 = (counter /1600); // 1600 импульсов KWT/час первый счетчик
// vol2 = (counter1 / 2000); // 2000 импульсов KWT/час второй счетчик
/*
#ifdef YFS201_FEATURE // без этого вроде работает
if (vol1NeedSend) {
sendPacket(DTA_VOL_1);
}
#endif
*/
// checkTemp(); // ?????????????????????????????????????????????????
#ifdef SERIAL_PRINT
if (vol1>vol1_last) { // выводит объем когда следуюшее значение больше предыдущего
Serial.print(F("Volume 1: "));// вывод литров . Надо дописать условие - выволить при изменении на 1 литр
Serial.println(vol1);
Serial.print(F("V_1: ")); // для проверки работы счетчика каждый импульс
Serial.println(counter);
vol1_last=vol1;
}
if (vol2>vol2_last) {
Serial.print(F("Volume 2: "));// вывод литров . Надо дописать условие - выволить при изменении на 1 литр
Serial.println(vol2);
Serial.print(F("V_2: ")); // для проверки работы счетчика
Serial.println(counter1);
vol2_last=vol2;
}
#endif
}
void count0(){
// вызывается прерыванием 0 от 2-го цифрового входа
counter++; // ясен перец, увеличиваем переменную. Утекло ещё 2 грамма
}
void count1(){
// вызывается прерыванием 1 от 3-го цифрового входа
counter1++; // ясен перец, увеличиваем переменную. Утекло ещё 2 грамма
}
#endif
Это же можно вставить напрямую в Мегу или Дую ( с прерываниями не уверен). Еще раз - в этом нет смысла.
Ну и в догонку. Внутри счетчика YFS201 стоит датчик Холла , поэтому нет дребезга контактов. Считает от 2-х грамм , видно утечку воды через кран.