Счетчик импульсов, нужен совет.
- Войдите на сайт для отправки комментариев
Ср, 10/06/2020 - 20:12
Требуется посчитать импульсы, обработать их и отправить по mqtt на сервер. Юзать планирую Wemos D1.
Посоветуйте как лучше это сделать, считать по прерыванию или задействовать хардварную 16-тиричную микруху и повесить на 8 входов ее выходы. Осцилограмма сигнала:


считать по прерыванию или задействовать хардварную 16-тиричную микруху и повесить на 8 входов ее выходы.
Что? Откуда взялись эти заморочки?
считать по прерыванию или задействовать хардварную 16-тиричную микруху и повесить на 8 входов ее выходы.
Что? Откуда взялись эти заморочки?
Как лучше сделать?
Длительность пачки постоянная или зависит от количества импульсов? Или время между пачками одинаковое или тоже зависит? Есть минимальные - максимальные значения времени пачек и пауз?
Прерывания чем не угодили ?
Длительность пачки постоянная или зависит от количества импульсов? Или время между пачками одинаковое или тоже зависит? Есть минимальные - максимальные значения времени пачек и пауз?
Периодическая последовательность импульсов постоянная, длительность пачки зависит от количества импульсов.
Важно принять всю пачку, при 1000 импульсов, длительность пачки 500мс. Желаемое максимальное количество импульсов при стабильной работе от 500 до 1000.
Прерывания чем не угодили ?
Вот чето не работает у меня код mqtt клиента и счетчик на прерываниях. Позже выложу код.
Прям удивляюсь... Уверен, что у 8266 есть 8 внешних прерываний ? То что можно любую ногу настроить как входную для прерываний и то что есть 8 каналов прерываний - две большие разницы. Например у еsp32 всего четыре внешних прерывания. А у 8266 больше ? Уверен ?
/* 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);//для отладки }уходит в бесконечный ребут
Прям удивляюсь... Уверен, что у 8266 есть 8 внешних прерываний ? То что можно любую ногу настроить как входную для прерываний и то что есть 8 каналов прерываний - две большие разницы. Например у еsp32 всего четыре внешних прерывания. А у 8266 больше ? Уверен ?
Эти все вопросы кому?
. Например у еsp32 всего четыре внешних прерывания.
А разве не на все GPIO можно повесить прерывания?
Во всяком случае как минимум шесть прерываний я запускал на этом МК.