Основные технические характеристики
Цена одного импульса, м³/имп | 0,01 |
Тип выхода счета | открытый исток с цепью NAMUR |
Тип выхода саботажа | открытый исток |
Максимальная частота следования импульсов (типовая при 4 м³/ч ) | 2 (0,11) |
Минимальная длительность импульсов, мс | 500 |
Рабочий диапазон напряжения питания, В | 2,5 – 3,5 пост. |
Максимальный выходной ток, мА | 1 |
Электрическое сопротивление выхода счета, кОм: – магнитное поле есть – магнитного поля нет – обрыв кабеля связи – замыкание кабеля связи | 1,6 5,6 >30 <0,68 |
Электрическое сопротивление выхода саботажа, кОм: – обрыв (норма) – замыкание (воздействие внешнего магнитного поля) | >30 <0,68 |
Условия эксплуатации: – температура воздуха, °С – относительная влажность, %, при 25 °С | -40 … 55 80 |
Потребляемый ток, мкА, не более | 20 |
Степень защиты оболочки по ГОСТ 14254-96 | IP20 |
Габаритные размеры, мм, не более | 30х21х6 |
Масса, кг, не более | 0,01 |
Средняя наработка на отказ, ч, не менее | 60000 |
Средний срок службы, лет | 12 |
Самодельный датчик импульсов газового или водяного счетчика
* Author: Istomin Evgeny / aka Gena
* 01.12.2022
* Use: – Hall Effect Switches Sensor IC: U18 http://www.utc-ic.com/uploadfile/2022/0331/20220331125747992.pdf
* – (optional) Temperature sensor IC: DS18B20 http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
* – Arduino board Pro Micro (atmega32u4) https://www.arduino.cc/en/Main/ArduinoBoardMicro
*/
// _______
#define OUT 2 // —-| | //
#define GND 3 // —-| U18 | |
#define VCC 4 // —-|_______|/
#define BAUDRATE 115200
#define DS18B20 0 // use DS18B20
#define LOWPOW 0 // not use library LowPower for atmega32u4. Just for 328p
#define LOOP_PERIOD_MS 60 // must be equal LOOP_PERIOD
#if LOWPOW
#include < LowPower.h >
#define LOOP_PERIOD SLEEP_60MS
#endif
#if DS18B20
#define TEMP_PERIOD_MS 1000
#define TEMP_MAX_PERIOD_MS 15*60*1000 // 15 min
// _______
#define DS18B20_GND 5 // —————-| | //
#define DS18B20_OUT 6 // —–*———-| 18B20 | |
#define DS18B20_VCC 7 // —| |–[4k7]-*-|_______|/
// |__________|
#define TEMP_BIT 0x7F // 12 bit
#define TEMP_H 0xFF
#define TEMP_L 0x00
#define WRITESCRATCH 0x4E // Write to EEPROM
#define SKIPROM 0xCC // Skip ROM
#define STARTCONVO 0x44 // Tells device to take a temperature reading and put it on the scratchpad
#define READSCRATCH 0xBE // Read EEPROM
#include < OneWire.h >
OneWire ds(DS18B20_OUT);
uint32_t dTime = 0;
#else
#define TEMP_AVERAGE_COUNT 3
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
// Set the internal reference 2.56 and mux[5:0] = 100111 for atmega32u4
#define ADC_ADMUX ((1<<REFS1) | (1<<REFS0) | (1<<MUX2)| (1<<MUX1)| (1<<MUX0))
// http://www.atmel.com/Images/Atmel-8108-Calibration-of-the-AVR’s-Internal-Temperature-Reference_ApplicationNote_AVR122.pdf
#define T_OFFSET 266.17
#define T_K 0.807
#else // for 328p
// Set the internal reference 1.1 V
#define ADC_ADMUX ((1<<REFS1) | (1<<REFS0) | (1<<MUX3))
#define T_OFFSET 324.31
#define T_K 0.819
#endif
#endif
uint32_t T=0;
uint32_t imp_count=0;
float Temperature=0;
void wait()
{
#if LOWPOW
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
LowPower.idle(LOOP_PERIOD, ADC_OFF, TIMER4_OFF, TIMER3_OFF, TIMER1_OFF,
TIMER0_OFF, SPI_OFF, USART1_OFF, TWI_OFF, USB_OFF);
#else // works on 88 / 168 / 328
LowPower.idle(LOOP_PERIOD, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF,
SPI_OFF, USART0_OFF, TWI_OFF);
#endif
#else
delay(LOOP_PERIOD_MS);
#endif
T ;
}
void mprintf(String s)
{
Serial.begin(BAUDRATE);
while (!Serial); // wait for serial port to connect. Needed for native USB port only
Serial.println(s);
Serial.flush();
Serial.end();
}
void setup() {
pinMode(VCC, OUTPUT);
pinMode(GND, OUTPUT);
pinMode(OUT, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(VCC, HIGH);
digitalWrite(GND, LOW);
digitalWrite(OUT, HIGH);
#if DS18B20
pinMode(DS18B20_GND, OUTPUT);
pinMode(DS18B20_VCC, OUTPUT);
pinMode(DS18B20_OUT, INPUT);
digitalWrite(DS18B20_GND, LOW);
digitalWrite(DS18B20_VCC, HIGH);
digitalWrite(DS18B20_OUT, HIGH);
ds.reset();
ds.write(SKIPROM);
ds.write(WRITESCRATCH);
ds.write(TEMP_H);
ds.write(TEMP_L);
ds.write(TEMP_BIT); // set maximum resolution 12 bit
#endif
ADMUX = ADC_ADMUX;
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADCSRB |= (1 << MUX5);
#endif
ADCSRA |= (1<<ADEN); // enable the ADC
PRR0 |= (1 << PRTIM2)|(1 << PRTIM1)|(1 << PRTIM2)|(1 << PRTWI)|(1 << PRSPI)|(1 << PRADC)|(0 << PRUSB); //
PRR1 |= (1 << PRTIM3)|(1 << PRUSART1);
mprintf(“Vm3tdTsectTsectTemp”);
}
void loop() {
uint16_t dt=T;
while (digitalRead(OUT) == 1) wait();
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
imp_count ;
GetTemp();
while (digitalRead(OUT) == 0) wait();
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
String s = String(imp_count * 0.01) char(9) String((T-dt)*LOOP_PERIOD_MS/1000.0) char(9)
String(T/1000.0*LOOP_PERIOD_MS) char(9) String(GetTemp());
mprintf(s);
}
float GetTemp()
{
#if DS18B20
if ((T-dTime)*LOOP_PERIOD_MS >= TEMP_PERIOD_MS) {
if ((T-dTime)*LOOP_PERIOD_MS < TEMP_MAX_PERIOD_MS) {
ds.reset();
ds.write(SKIPROM);
ds.write(READSCRATCH);
byte data[2];
data[0] = ds.read();
data[1] = ds.read();
Temperature=((data[1]<< 8) data[0]) * 0.0625; // one bit = 0,0625 celsius
dTime=T;
}
ds.reset();
ds.write(SKIPROM);
ds.write(STARTCONVO);
}
#else
// To use the built-in temperature sensor you need to use LowPower library,
// because it is a measurement of core temperature (plus ~10°C to the air temperature).
PRR0 &= ~(1<<PRADC);
wait();
ADCSRA |= (1<<ADSC); // Start the ADC
while ((ADCSRA & (1<<ADSC)) != 0); // Detect end-of-conversion
uint16_t wADC = ADCW; // Reading register “ADCW” takes care of how to read ADCL and ADCH.
Temperature = Temperature * (TEMP_AVERAGE_COUNT-1)/TEMP_AVERAGE_COUNT
((float)wADC – T_OFFSET ) * T_K / TEMP_AVERAGE_COUNT;
PRR0 |= (1<<PRADC);
#endif
return Temperature;
}