Счетчик импульсов.

Алексей Н
Offline
Зарегистрирован: 02.01.2016

diakin, не все счетчики это умеют. А те, которые умеют, начинаются от двух тысяч. И полтора десятка счетчиков обойдется в копеечку. А импульсный выход есть у всех.

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Счетчик электроэнергии Энергомера   900 р. RS485

Но в общем-то считать импульсы ардуиной наверное проще )
Но надо через прерывания, чтобы импульсы не терялись. На DUE можно использовать прерывание с каждого цифрового входа. Там все несложно.
Что-то в таком духе.

#define pin1 1 // номер пина, на который поданы импульсы со сч 1
#define pin2 2 // номер пина, 
#define pin3 3 // номер пина, 
// итд

static int count1,count2,count3 ; // ну здесь должно быть беззнаковый тип :)

void setup()
{
// pin1 - номер пина
// IntH1 - функция обработчик прерывания для пина pin1
  attachInterrupt(pin1, IntH1, FALLING);
  attachInterrupt(pin2, IntH2, FALLING);
  attachInterrupt(pin3, IntH3, FALLING);
// итд
 }

//******************
void IntH1 ()
{count1++; // инкремент счетчика 1
}

void IntH2 ()
{count2++; // инкремент счетчика 2
}

Ну а в loop ()  делать требуемую обработку.
 

irvinru
Offline
Зарегистрирован: 16.06.2015

Не по теме

mihaser
Offline
Зарегистрирован: 05.03.2016

#include <WiServer.h>
#include <Bounce.h>
#define WIRELESS_MODE_INFRA	1
#define WIRELESS_MODE_ADHOC	2
#include <DS1307.h>
#include "Wire.h"

unsigned char local_ip[] = {192,168,0,199};	// IP address of WiShield
unsigned char gateway_ip[] = {192,168,0,200};	// router or gateway IP address
unsigned char subnet_mask[] = {255,255,255,0};	// subnet mask for the local network
const prog_char ssid[] PROGMEM = {"camera"};		// max 32 bytes



unsigned char security_type = 3;	// 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2
const prog_char security_passphrase[] PROGMEM = {"tdboyanivka"};	// max 64 characters
prog_uchar wep_keys[] PROGMEM = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,	// Key 0
				  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	// Key 1
				  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	// Key 2
				  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	// Key 3
				};
unsigned char wireless_mode = WIRELESS_MODE_INFRA;
unsigned char ssid_len;
unsigned char security_passphrase_len;

char* data1;
int but_pin = 7; // кнопка
int led_pin = 6; // лампочка импульсов
//int led1 = 2; // дежурная лампочка
Bounce but = Bounce (but_pin, 5); // конпка принудительной отправки на 7

Bounce act_in = Bounce (A1, 5); // фото акт
Bounce react_in = Bounce (3, 5); // фото реакт

int act_time = 1;
int act_imp = 0; int react_imp = 0;
int P_act = 0; int P_react = 0;
int count_send = 0;
//int led2 = A2; 
int led3 = 4;

//long interval = 15000; // 15 секунд
//long interval = 5000; // 5 секунд
//long interval = 30000;  // 30 секунд
//long interval = 60000;  // 1 минута
//long interval = 300000;  // 5 минут
//long interval = 3600000; // 1 час
long interval =   1800000;// 30 мин

long currentMillis, previousMillis;
String url; 
char charBuf[130];
int rtc[7];
int hr, mint, sec; //year, month, day, 
long updateTime = 0;


//uint8 ip[] = {54,86,132,254}; // IP адресс data.sparkfun.com
uint8 ip[] = {213,186,33,19}; // IP адресс api.pushingbox.com
void check_imp(){
   if (act_in.update()) {  // проверка фото актив.
            if (act_in.read() == LOW){
                   digitalWrite(led_pin, HIGH);
              act_imp++; P_act = act_imp*16;  //Serial.println(act_imp);
                }}
   
    if (react_in.update()) {  // проверка фото реактив.
            if (react_in.read() == LOW){
                   digitalWrite(led_pin, HIGH);
              react_imp++; P_react = react_imp*16;  
                }}
   
}

void rtc_to_int(){
//  year = rtc[6];
//  month = rtc[5];
//  day = rtc[4];
  hr = rtc[2];
  mint = rtc[1];
  sec = rtc[0];
}
void get_clock(){
  RTC.SetOutput(DS1307_SQW32KHZ);
  RTC.get(rtc,true);
}

void setup() {
  act_time = 3;
  DDRC|=_BV(2) |_BV(3);  // POWER:Vcc Gnd
  PORTC |=_BV(3);  // VCC PINC3

  pinMode(but_pin, INPUT);pinMode(led_pin, OUTPUT);//pinMode(led1, OUTPUT);pinMode(led2, OUTPUT);


  WiServer.init(NULL);
  Serial.begin(57600);
  WiServer.enableVerboseMode(true);
  interval =   1800000;// 30 мин
  digitalWrite (led3, HIGH);
}

void printData(char* data, int len) {
  while (len-- > 0) {
    Serial.print(*(data++));
  } 
}

void set_url(){
/*
url = "/input/NJWdNQ74DEiRVZZzMOvG?private_key=5dP8VXwx07CWAKKnDdXV&adate=";
url+=String(day); url+="."; url+=String(month); url+="."; url+= String(year);
url += "&btime="; url+= String(hr); url+= ":"; url+= String(mint); url+=":"; url+= String(sec);
url += "&cactive=";url += String(P_act);//"7777";
url += "&dreactive=";url += String(P_react);//"9876";
*/
//url = "/pushingbox?devid=v9142A????8B5A&p1=test&p2=test2&p3=test3";

url = "/pushingbox?devid=v9142A11????18B5A&p1=";
url+= String(hr); url+= ":"; url+= String(mint); //url+=":"; url+= String(sec);
url += "&p2=";url += String(P_act);//"7777";
url += "&p3=";url += String(P_react);//"9876";
int url_len = url.length() + 1; 
url.toCharArray(charBuf, url_len) ;
}


void led_off(){
    if (millis() >= updateTime) {
    digitalWrite(led_pin, LOW);
    updateTime += 150;
  }
}



void loop(){
  currentMillis = millis(); 
  get_clock();rtc_to_int();//check_data();
  check_imp();led_off();
//  set_url(); GETrequest data1(ip, 80, "data.sparkfun.com", charBuf);    
set_url(); GETrequest data1(ip, 80, "api.pushingbox.com", charBuf);    


if ((count_send <= 1)&&(currentMillis - previousMillis > 30000)){  // Принудительная отправка запроса при включении
   previousMillis = currentMillis; 
   count_send++;
    Serial.println("OK"); Serial.println(charBuf);
    data1.submit();  data1.setReturnFunc(printData);
    act_imp = 0; react_imp = 0;
}

 if (currentMillis - previousMillis > interval) { // Отправка запроса по времени
    Serial.println("OK"); Serial.println(charBuf);
    data1.submit();  data1.setReturnFunc(printData);
    act_imp = 0; react_imp = 0; 
    previousMillis = currentMillis; 
  }

if (but.update()) {  // проверка нажатия кнопки на принудительную отправку
    if (but.read() == HIGH){
    Serial.println("OK"); Serial.println(charBuf);
    data1.submit();  data1.setReturnFunc(printData);
    act_imp = 0; react_imp = 0; 
  }
}

  WiServer.server_task();
  
  delay(10);
}

 

apeplov
Offline
Зарегистрирован: 08.04.2017

Датчик тока. В цикле опрашиваем датчики. Все остальное - математика. Это не сильно точно, но не хуже идеи с подсчетом импульсов и точно дешевле.

mihaser
Offline
Зарегистрирован: 05.03.2016

В моем скетче продуман подсчет импульсов из двух светодиодов (активная и реактивная нагрузка), умножение на коефициент транс.тока(в даном случае на 80) из расчета, что на счетчике написано 5000 имп - 1 кВт.... + Передача на сервер. Пример на www.boyanivka.tk

 

kkirill72
Offline
Зарегистрирован: 26.11.2014

Здравствуйте помогите с программой  для ардуинки нано . 

 Есть счетчик воды в который вставлен дачик хола цифровой

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

 Возвожно ли такое и какова цена программы?

  Зарание спасибо

sadman41
Offline
Зарегистрирован: 19.10.2016

kkirill72 пишет:

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

 Возвожно ли такое и какова цена программы?

Ошиблись вы разделом. По моему скромному мнению стоимость такой разработки посторонним человеком с SD, RTC и пока что непонятно какой статистикой стартанет от $100. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

kkirill72 пишет:

Здравствуйте помогите с программой  для ардуинки нано . 

 Есть счетчик воды в который вставлен дачик хола цифровой

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

 Возвожно ли такое и какова цена программы?

  Зарание спасибо

"вывести сигнал работы счетчика" - куда вывести? В Serial, на Марс, телеграммой в Уфу? По остальному - сделать реально, нижняя планка цены - $50.

kkirill72
Offline
Зарегистрирован: 26.11.2014

СПАСИБО

 

Honey
Offline
Зарегистрирован: 01.10.2020

dimax пишет:

Алексей Н, вы не обольщайтесь выводами JasKo, скетч то писать Вам, и сколько процессорного времени у вас уйдёт на побочные расходы - никому сейчас не известно. Информацию нужно читать,хранить, выводить  на дисплей, и всё это складывается в единицы и десятки миллисекунд. Может в какой нибудь библе запросто стоять скрытый delay и мешать алгоритму,  а то ещё и сами влепите delay, и всей конструкции крышка.  А главное когда вы через месяц пользования подобъёте сумму всех счётчикв и она сильно не сойдётся с основным -то искать где у вас идут потери будет просто нереально. А если вы будете читать специализированный счётчик через RS485 то всего этого гарантированно можно избежать :)

Один МК можно выделить специально для подсчета импульсов со стольких счетчиков, сколько у него хватит ног, и добавить ему очень простой коммуникационный протокол, например UART только на TX по внешнему запросу, чтобы гарантировано не было никаких скрытых delay. Хранить все в оперативной памяти и питать от батарейки. При использовании глубокого сна и прерываниях по изменению уровня, батарейки хватит на годы. Вторым МК или ПК по мере необходимости подавать запрос и получать значения всех счетчиков.