dontsovcmc / waterius

Передача показаний воды по Wi-Fi. Watermeter Wi-Fi transmitter.
https://waterius.ru
GNU Lesser General Public License v3.0
560 stars 108 forks source link

Намур (Берегун) #76

Closed OloloevReal closed 5 years ago

OloloevReal commented 5 years ago

Добрый день!

При подключении счетчика ГВС Берегун обнаружил проблему

При нажатии на кнопку происходит изменение величины считываемой со входов. Например, если состояние входа NAMUR_CLOSED, в моем случае значение 149, и происходит нажатие кнопки, то значение на входе изменяется со 149 на 224

12437 [D]: 149
12437 [D]: 149
12437 [D]: 224 <- изменение, фактически NAMUR_CLOSED -> NAMUR_OPEN
37883 [I]: Data:
37910 [I]: 13
37933 [I]: 0

Это приводит к ложным увеличениям счетчика импульсов, т.е. при каждой принудительной отправке показаний кнопкой происходит +1 счетчика.

dontsovcmc commented 5 years ago

Так. Константа 170 разделяет положение открыт/закрыт, ОК. Что вы называете "нажатие кнопки"? Той,что для отправки/настройки?

Можете подробнее описать.

Это странно,т.к. она на линии i2c сидит. В коде где то проблема.

OloloevReal commented 5 years ago

Да, та кнопка что для отправки/настройки

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

    bool is_close()
    {
        //bool value = digRead();
        //state = value2state(value ? 1024 : 0);
        uint16_t value = aRead();
        LOG_DEBUG(value);
        state = value2state(value);
        return state == CounterState_e::CLOSE || state == CounterState_e::NAMUR_CLOSE;
    }

Временно вышел из положения таким образом:

inline void counting() {

    power_adc_enable(); //т.к. мы обесточили всё а нам нужен компаратор
    adc_enable();       //после подачи питания на adc

    if(button.digBit() == LOW){
        adc_disable();
                power_adc_disable();
        LOG_DEBUG(F("Skip!"));
        return;
    }
.....

Т.е. откидывая значение если кнопка нажата перед чтением данных со входов.

Мне кажется это как-то связанно с тем что контроллер находится power save, а нажатие кнопки просаживает напряжение

dontsovcmc commented 5 years ago

Хм... Не понимаю. Это же разные пины и они не должны влиять друг на друга.

  1. Странно, что лог работает, мне казалось LOG_BEGIN всегда после пробуждения нужно делать.

  2. А как увеличивается значение value? Оно всегда плавает - это же компаратор от 0 до 1023.

    uint16_t value = aRead();
    LOG_DEBUG(value);
  3. А можете протестировать вызов counting() в условии, вместо изменения ее содержимого:

        while ( wdt_count > 0 ) {
            noInterrupts();
    
            if (button_pressed()) { 
                interrupts();  // Пользователь нажал кнопку
                break;
            } else  {
                    counting(); //Опрос входов
                interrupts();
                sleep_mode();  // Спим (WDTCR)
            }
        }
OloloevReal commented 5 years ago

А как увеличивается значение value? Оно всегда плавает - это же компаратор от 0 до 1023.

При постоянном значении нагрузки на входах значение плавает +- 1 А вот так оно меняется при нажатии на кнопку: 0: 109 -> 188 1.6 кОм: 143 -> 220 5.6 кОм: 221 -> 290 обрыв: 1020 -> 1023

А можете протестировать вызов counting() в условии, вместо изменения ее содержимого:

С таким кодом работает корректно, ложных срабатываний не фиксируется

23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23808 [I]: Data:
23832 [I]: 4
23853 [I]: 0
24379 [D]: wake up for transmitting
dontsovcmc commented 5 years ago

Я сейчас попробовал у себя - у меня вообще нет этой ошибки.. Придется вам код показать, а то не ясно, что вы переделали =(

dontsovcmc commented 5 years ago

Проверьте, что включен компаратор в том месте. Потому что в readVcc он выключается и я удивился, когда увидел другое значение сразу после вызова функции.

OloloevReal commented 5 years ago

Проверяю на v0.8, стоковой версии, все отличия это активированный лог, уменьшенный таймер #define WAIT_ESP_MSEC 5000UL и добавленный принтаут в функцию is_close() Записал лог, в нем видно что при нажатии кнопки посылки показаний происходит скачек значения и счетчик импульсов увеличивает значение

ESP отключена, нагрузка на Input_0 подключена 1.6 кОм log.log

OloloevReal commented 5 years ago

Пробовал убирать из кода запрос напряжения
//info.voltage = readVcc(); // Текущее напряжение ни на что не повлияло, проблема сохраняется

dontsovcmc commented 5 years ago

Упс. WAIT_ESP_MSEC надо вернуть. Я вставляю печать в is_close и нет никакой разницы в показаниях. Т.е. кнопка нажата,нет. Нет разницы. У вас она есть. пришлите кусок кода где вы нажимаете кнопку, пожалуйста.

OloloevReal commented 5 years ago

WAIT_ESP_MSEC ставлю небольшим значением что бы проблему отлавливать быстрее - проблема проявляется когда Attiny в повер сейве и выходит из него. Если она уже проснулась, и например, ждет ESP, то жми, не жми кнопку результат стабильный, изменений не происходит.

Вот все изменения сделанные поверх master версии, все сток diff

dontsovcmc commented 5 years ago

да, да. я также сделал. у меня нет разницы в aRead(). Слушайте, а на плате у вас нет замыкания какого-нибудь? Ну если код одинаковый, МК тоже, то только плата осталась...

OloloevReal commented 5 years ago

Не похоже на замыкание, померил ток: 0.01 mA - power save 1.56 mA - кнопка нажата, attiny проснулась и ждет ESP

Очень странно, ладно, видимо нужно собирать еще одну тестовую плату, на новом МК

dontsovcmc commented 5 years ago

Второй человек сегодня отписал об этой проблеме... Мне не сложно перенести counting() в условие, но это костыль, а нужно понять причину. Я смотрел в сторону AREF - опорное напряжение компаратора, но этот пин SDA, а кнопка замыкает SLK.

dontsovcmc commented 5 years ago

о! я проверял без ESP всунутой. А ведь она может как-то влиять. У вас ошибка без ESP воспроизводится?

OloloevReal commented 5 years ago

Я проверяю без ESP, ошибка воспроизводится без ESP

dontsovcmc commented 5 years ago

Я проверяю без ESP, ошибка воспроизводится без ESP

А! Подтверждаю, есть ошибка =(

dontsovcmc commented 5 years ago

Оставил пока так:

{
interrupts();  // Пользователь нажал кнопку
break;
} else {
    counting(); //Опрос входов
    interrupts();
    sleep_mode();  // Спим (WDTCR)
}