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

JIEXA
Offline
Зарегистрирован: 11.02.2015

Требуется посчитать импульсы, обработать их и отправить по mqtt на сервер. Юзать планирую Wemos D1.

Посоветуйте как лучше это сделать, считать по прерыванию или задействовать хардварную 16-тиричную микруху и повесить на 8 входов ее выходы. Осцилограмма сигнала:

rkit
Онлайн
Зарегистрирован: 23.11.2016

JIEXA пишет:

считать по прерыванию или задействовать хардварную 16-тиричную микруху и повесить на 8 входов ее выходы.

Что? Откуда взялись эти заморочки?

JIEXA
Offline
Зарегистрирован: 11.02.2015

rkit пишет:

JIEXA пишет:

считать по прерыванию или задействовать хардварную 16-тиричную микруху и повесить на 8 входов ее выходы.

Что? Откуда взялись эти заморочки?

 

Как лучше сделать?

nik182
Offline
Зарегистрирован: 04.05.2015

Длительность пачки постоянная или зависит от количества импульсов? Или время между пачками одинаковое или тоже зависит?  Есть минимальные - максимальные значения времени пачек и пауз? 

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Прерывания чем не угодили ?

JIEXA
Offline
Зарегистрирован: 11.02.2015

nik182 пишет:

Длительность пачки постоянная или зависит от количества импульсов? Или время между пачками одинаковое или тоже зависит?  Есть минимальные - максимальные значения времени пачек и пауз? 

Периодическая последовательность импульсов постоянная, длительность пачки зависит от количества импульсов.

Важно принять всю пачку, при 1000 импульсов, длительность пачки 500мс. Желаемое максимальное количество импульсов при стабильной работе от 500 до 1000.

JIEXA
Offline
Зарегистрирован: 11.02.2015

Komandir пишет:

Прерывания чем не угодили ?

Вот чето не работает у меня код mqtt клиента и счетчик на прерываниях. Позже выложу код.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Прям удивляюсь... Уверен, что у 8266 есть 8 внешних прерываний ? То что можно любую ногу настроить как входную для прерываний и то что есть 8 каналов прерываний - две большие разницы. Например у еsp32 всего четыре внешних прерывания. А у 8266 больше ? Уверен ?

JIEXA
Offline
Зарегистрирован: 11.02.2015
/*
  SimpleMQTTClient.ino
  The purpose of this exemple is to illustrate a simple handling of MQTT and Wifi connection.
  Once it connects successfully to a Wifi network and a MQTT broker, it subscribe to a topic and send a message to it.
  It will also send a message delayed 5 seconds later.
*/

#include "EspMQTTClient.h"


EspMQTTClient client(
  "WIFi",
  "WIFI pass",
  "mqtt.net.ru",  // MQTT Broker server ip
  //"127.0.0.1",  //local broker
  "MQTTUsername",   // Can be omitted if not needed
  "MQTTPassword",   // Can be omitted if not needed
  "ArduinoClient",     // Client name that uniquely identify your device
  1883              // The MQTT port, default to 1883. this line can be omitted
);

const int impPin = 10; // импульсы поступают на 10 пин, куда вешается прерывание
const int stopCounting = 1000; // пауза 1 секунда после последнего импульса

volatile boolean counterFlag = 0;  // флаг счетчика
volatile unsigned long previousMillis;  // значение таймера
volatile int impCount = 0; // счетчик импульсов
unsigned long currentMillis;


void setup(){
 pinMode(impPin, INPUT);
  attachInterrupt(1, count, RISING); // 1-е прерывание вызывает функцию count() при появлении импульса

  Serial.begin(9600);

  // Optionnal functionnalities of EspMQTTClient : 
  client.enableDebuggingMessages(); // Enable debugging messages sent to serial output
  //client.enableHTTPWebUpdater(); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. These can be overrited with enableHTTPWebUpdater("user", "password").
  //client.enableLastWillMessage("TestClient/lastwill", "I am going offline");  // You can activate the retain flag by setting the third parameter to true
}

// This function is called once everything is connected (Wifi and MQTT)
// WARNING : YOU MUST IMPLEMENT IT IF YOU USE EspMQTTClient
void onConnectionEstablished()
{
  // Subscribe to "mytopic/test" and display received message to Serial
  client.subscribe("test", [](const String & payload) {
   // Serial.println(payload);
  });

 

  // Publish a message to "mytopic/test"
  client.publish("test", "Controller online"); // You can activate the retain flag by setting the third parameter to true


}

void loop(){
  client.loop();
    String val = String(impCount, DEC);
  if (counterFlag == 1) { // если счетчик запущен
    currentMillis = millis(); // получаем текущее значение millis()
    if (currentMillis - previousMillis >= stopCounting) { // и проверяем прошла ли с момента получения последнего импульса 1 секунда
      client.publish(val, "test"); 
      Serial.println("Окончание приема импульсов");//для отладки
      impCount = 0; // если прошла, то обнуляем счетчик импульсов
      counterFlag = 0; // сбрасываем флаг счетчика
    }
  }   
 }
 
 // Подсчет импульсов:
void count() {
  impCount++; // увеличиваем счетчик
  previousMillis = millis(); // и запускаем таймер счетчика
  counterFlag = 1; // взвести флаг счетчика

  Serial.println(impCount);//для отладки
}

уходит в бесконечный ребут

JIEXA
Offline
Зарегистрирован: 11.02.2015

brokly пишет:

Прям удивляюсь... Уверен, что у 8266 есть 8 внешних прерываний ? То что можно любую ногу настроить как входную для прерываний и то что есть 8 каналов прерываний - две большие разницы. Например у еsp32 всего четыре внешних прерывания. А у 8266 больше ? Уверен ?

Эти все вопросы кому?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

brokly пишет:

. Например у еsp32 всего четыре внешних прерывания.


А разве не на все GPIO можно повесить прерывания?
Во всяком случае как минимум шесть прерываний я запускал на этом МК.