Thank you
I decided for now using only one water meter.
I change the following water meter example from two water meters to one
https://z-uno.z-wave.me/examples/Water-Meter/
Using your guides i configure in order to use pin 7 and changed the code accordantly
https://z-uno.z-wave.me/shield/configur ... m_3=normal
No problem compiling and add to fibaro homecenter 3.
But no change at all on Fibaro homecenter 3 objects when i simulate pulses from the water meter.
Is there any problem on the code bellow? No error messages but...
#include "EEPROM.h"
// channel number
#define ZUNO_CHANNEL_NUMBER_COLD 1
#define PIN_COLD 7
#define PIN_PULSE 13
#define EEPROM_ADDR 0x800
#define EEPROM_UPDATE_INTERVAL 120000
#define TICK_VALUE 1 // in liters
struct meter_data {
unsigned long ticks_cold;
byte crc8;
};
meter_data my_meter_data;
unsigned long last_update_millis = 0;
byte data_updated = FALSE;
#define DEBOUNCE_COUNT 3
byte cold_triggered = 0;
byte cold_debounce = DEBOUNCE_COUNT;
ZUNO_SETUP_CHANNELS(ZUNO_METER(ZUNO_METER_TYPE_WATER, METER_RESET_ENABLE, ZUNO_METER_WATER_SCALE_METERS3, METER_SIZE_FOUR_BYTES, METER_PRECISION_THREE_DECIMALS, getterCold, resetterCold));
byte my_crc8(byte * data, byte count) {
byte result = 0xDF;
while(count--) {
result ^= *data;
data++;
}
return result;
}
void update_meter_data() {
my_meter_data.crc8 = my_crc8((byte*)&my_meter_data, sizeof(meter_data) - 1);
EEPROM.put(EEPROM_ADDR, &my_meter_data, sizeof(meter_data));
}
void setup() {
// Dry contacts of meters connect to these pins
pinMode(PIN_COLD, INPUT_PULLUP);
// Get last meter values from EEPROM
EEPROM.get(EEPROM_ADDR, &my_meter_data, sizeof(meter_data));
// Check data
if (my_crc8((byte*)&my_meter_data, sizeof(meter_data) - 1) != my_meter_data.crc8) {
// Invalid data - reset all
my_meter_data.ticks_cold = 0;
update_meter_data();
}
}
void loop() {
if (!digitalRead(PIN_COLD)) {
if (!cold_triggered) {
cold_debounce--;
if (!cold_debounce) {
my_meter_data.ticks_cold++;
data_updated = true;
cold_triggered = true;
zunoSendReport(ZUNO_CHANNEL_NUMBER_COLD);
}
}
} else {
cold_debounce = DEBOUNCE_COUNT;
cold_triggered = false;
}
// To save EEPROM from a lot of r/w operation
// write it once in EEPROM_UPDATE_INTERVAL if data was updated
if (data_updated && (millis() - last_update_millis) > EEPROM_UPDATE_INTERVAL) {
update_meter_data();
data_updated = false;
last_update_millis = millis();
}
delay(100);
}
void resetterCold(byte v) {
my_meter_data.ticks_cold = 0;
update_meter_data();
}
unsigned long getterCold(void) {
return my_meter_data.ticks_cold * TICK_VALUE;
}