как задать количество выходящих импульсов светодиода

brus_o
Offline
Зарегистрирован: 11.10.2016

Привет всем.

Прошу не судить строго, только начинаю изучение данного зверя (Arduino)

Цель: получить на выходе определенное количество положительных импульсов, после чего выход должен отключиться.

За основу чудесно подойдет скетч с миганием 13 пина:

 
 
 
 
 
 
******
void loop() - работа в цикле, а мне нужно  чтоб отсчитал 100 импульсов и выход отключился
 
в моем понимании должно быть что то в таком виде:
for (int LED_pin = 1; LED_pin < 100; LED_pin++)
но как и куда его всунуть - не пойму вообще.
мах что добился - в процессе цикла идет отсчет 300 импульсов, а потом опять продолжение цикла.
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Не подходит loop() - возьмите setup()

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Поддерживаю #1 полностью, но если нужно именно в loop (по какой-то причине), то попробуй вот так:

uint8_t LED_pin = 0;

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

  LED_pin++;

  // Что-то делаете ...

  if (LED_pin == 100) {
    while (1){}
  }
}

А если еще кнопку добавить, то можно по ее нажатию повторять "процедуру" (ну что ты там делаешь).

uint8_t LED_pin = 0;
const uint8_t button_pin = 7;       // номер пина, куда подключается кнопка

void setup() {
  // put your setup code here, to run once:
  pinMode(button_pin, INPUT_PULLUP);
}

void loop() {
  // put your main code here, to run repeatedly:

  LED_pin++;

  // Что-то делаете ...

  if (LED_pin == 100) {         
    while (1){
      if (digitalRead(button_pin) == LOW){ // Если нажали кнопку
        LED_pin = 0;          // Сбросить счетчик в первоначальное положение
        break;                // выйти из цикла while (1)
      }
    }
  }
}

 

brus_o
Offline
Зарегистрирован: 11.10.2016

Спасибо. Вечером попробую

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Попробовал?))

brus_o
Offline
Зарегистрирован: 11.10.2016

большое спасибо, вечер проигрался - но у меня так ничего и не получилось.

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

в одном из роликов увидел похожую реализацию данной задачи, но на основе таймера (в котором я конечно вообще "0"). Но передрав ее и методом научного тыка подобрал нужную для меня комбинацию и остановку программы

void setup() {
  pinMode(13, OUTPUT);

}

void loop() {
  static uint32_t tmr;
  static byte counter = 0;

  if (counter < 20 && millis() - tmr >= 200) { 
    
            // 20-циклов HIGH/LOW (10 вспышек HIGH) 
            // 200 - msec - интервал между циклом HIGH
    
    tmr = millis();
    digitalWrite(13, !digitalRead(13));
        counter++;
        
 //   delay(1000);
  }
}

единственное что немного не устраивает: одинаковое время HIGH и LOW, мне нужно где то 1/4. (если кто знает как чтоб глобально не менять скетч: подскажите)

кнопки буду подвязывать чуть попозже.

если будут вопросы: подскажите....

Ученье - свет, а не ученье - чуть свет и на работу

всем еще раз СПАСИБО

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ты тролишь или шо? Я ж тебе готовый код дал, только «моргалку» присобачь и все. А если и этого не умеешь - начинай учить Си и ардуино в частности. Нет желания/времени учить - закажи код в разделе «Ищу исполнителя».

ЗЫ: Учить нужно не по «видосикам», а книги читать. Например: «Си для чайников» вполне пойдёт.

b707
Offline
Зарегистрирован: 26.05.2017

brus_o пишет:

в одном из роликов увидел похожую реализацию данной задачи, но на основе таймера

в каком месте в этом коде таймер?

brus_o
Offline
Зарегистрирован: 11.10.2016

затупил.....

brus_o
Offline
Зарегистрирован: 11.10.2016

BOOM пишет:

Ты тролишь или шо? Я ж тебе готовый код дал, только «моргалку» присобачь и все. А если и этого не умеешь - начинай учить Си и ардуино в частности. Нет желания/времени учить - закажи код в разделе «Ищу исполнителя».

ЗЫ: Учить нужно не по «видосикам», а книги читать. Например: «Си для чайников» вполне пойдёт.

даже не буду спорить. Значит я затупил или многого не знаю. Глобально вникать в программирование нет времени, по этому и решаю как могу.  Не смогу сделать сам - конечно буду заказывать... Не серчай.... Ну не смог....

b707
Offline
Зарегистрирован: 26.05.2017

brus_o пишет:

Глобально вникать в программирование нет времени

с таким настроением тебе слона не продать

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ТС, ты как партизан. Написал бы по нормальному что за импульсы, для чего нужны и тд. Мошт и написали бы тебе готовый код. А то темнишь, не понятно ничего.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019
void setup() {
  pinMode(13, OUTPUT);

}

void loop() {
  static uint32_t tmr;
  static uint counter = 0;
  static byte PW = 0;
  static byte cnt = 0;

  if (counter < 1350 && millis() - tmr >= 40) { 
    tmr = millis();
    cnt++;
    PW=(digitalRead(13)?4:1);
    if(cnt>=PW){
    digitalWrite(13, !digitalRead(13));
       cnt=0;
       counter++;
    }
   }
}

 

brus_o
Offline
Зарегистрирован: 11.10.2016

Цель вообще такова:

есть импульсный насос (12/24В), который нужно настраивать на определенную дозировку (45mL).

Чтоб он дал 45mL- нужно 270 раз чтоб он сработал. 

погрешность допускается 0,5mL

Вот я и решил подачу импульсов питания (сделаю через мосфит) реализовать на основе мигания светодиода , нужно было только как то реализовать 270 раз (чтоб не считать) и СТОП.

Можно конечно поставить счетчик импульсов, но зачем городить огород, если все это можно сделать на Ардуино. 

По этому и пытался.

 

Если есть более интересные идеи (по данной реализации) и спортивный интерес - буду рад.

Пиво с меня 

 

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Получили госзаказ на производство спутника-В? :-)

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ЗЫ: мосфит - Московский Фитнесс? ))

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

 Вот  накалякано в  предыдущем сообщении - бери и делай импульс скважность 80% период 200 ms

brus_o
Offline
Зарегистрирован: 11.10.2016

Alexey_Rem пишет:

void setup() {
  pinMode(13, OUTPUT);

}

void loop() {
  static uint32_t tmr;
  static uint counter = 0;
  static byte PW = 0;
  static byte cnt = 0;

  if (counter < 1350 && millis() - tmr >= 40) { 
    tmr = millis();
    cnt++;
    PW=(digitalRead(13)?4:1);
    if(cnt>=PW){
    digitalWrite(13, !digitalRead(13));
       cnt=0;
       counter++;
    }
   }
}

 

Спасибо, все работает

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

 if (counter < 1350 && millis() - tmr >= 40) тут 40 ms-1/5 периода импульса так что можно подстроить если нужно опять же 1350/5=270 кол-во импульсов тоже подстраивается

brus_o
Offline
Зарегистрирован: 11.10.2016

Alexey_Rem пишет:

 if (counter < 1350 && millis() - tmr >= 40) тут 40 ms-1/5 периода импульса так что можно подстроить если нужно опять же 1350/5=270 кол-во импульсов тоже подстраивается

Да, спасибо, я разобрался

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Пиво сам выпей, только безалкогольное

brus_o
Offline
Зарегистрирован: 11.10.2016

Alexey_Rem пишет:

Пиво сам выпей, только безалкогольное

:-)

Green
Offline
Зарегистрирован: 01.10.2015

Alexey_Rem пишет:

Пиво сам выпей, только безалкогольное


3 литра.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

готовый скетч был, почти )))
 

// BLINK для ATtiny85
// LED_BUILTIN на D1

uint32_t timer;
uint16_t count = 0;
bool flag = true;
#define work_time 250  // включено
#define pause 1000     // выключено
#define impuls 270     // число импульсов
#define lim impuls*2-1 

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN,flag);
}

void loop() {
  if (millis() - timer >= (flag ? work_time : pause)) {
    timer = millis();
    flag = !flag;
    digitalWrite(LED_BUILTIN, flag);
    count++;
    if(count >= lim && !flag) while(1);
  }
}

 

AlexTLN
Offline
Зарегистрирован: 14.05.2016

brus_o пишет:

Цель вообще такова:

есть импульсный насос (12/24В), который нужно настраивать на определенную дозировку (45mL).

Чтоб он дал 45mL- нужно 270 раз чтоб он сработал. 

погрешность допускается 0,5mL

Я такую делал. Из личного опыта так работать не будет. Причина: погрешность примерно +-10%, зависит от количества жидкости в канистре/бочке и много чего еще. Сам ставил датчик HC-SR04 ультразвуковой, один насос закачивает в некую емкость, датчик меряет, после чего второй насос выкачивает из мерной емкости. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexTLN пишет:

Я такую делал. Из личного опыта так работать не будет. Причина: погрешность примерно +-10%, зависит от количества жидкости в канистре/бочке и много чего еще. Сам ставил датчик HC-SR04 ультразвуковой, один насос закачивает в некую емкость, датчик меряет, после чего второй насос выкачивает из мерной емкости. 

и чего ему не работать при дозе в 0,17мл в допустимую погрешность входит с большим запасом

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

готовый скетч был, почти )))


Обычно пишется макрос и тогда хоть кучей светодиодов управляй одновременно и ни о чём не думай.

void loop() {
  blink(LED1, 100,  500, 10);
  blink(LED2, 100, 1000,  5);
  // ...
}

 

brus_o
Offline
Зарегистрирован: 11.10.2016

Green пишет:

ua6em пишет:

готовый скетч был, почти )))


Обычно пишется макрос и тогда хоть кучей светодиодов управляй одновременно и ни о чём не думай.

void loop() {
  blink(LED1, 100,  500, 10);
  blink(LED2, 100, 1000,  5);
  // ...
}

 

да, кстати где то видел что макросами можно управлять светодиодами с разной частотой и независимыми циклами. Но увы, глубоко в это не вникал. Но как метод знаю есть...

brus_o
Offline
Зарегистрирован: 11.10.2016

Alexey_Rem пишет:

void setup() {
  pinMode(13, OUTPUT);

}

void loop() {
  static uint32_t tmr;
  static uint counter = 0;
  static byte PW = 0;
  static byte cnt = 0;

  if (counter < 1350 && millis() - tmr >= 40) { 
    tmr = millis();
    cnt++;
    PW=(digitalRead(13)?4:1);
    if(cnt>=PW){
    digitalWrite(13, !digitalRead(13));
       cnt=0;
       counter++;
    }
   }
}

 

Изменил под себя:

void setup() {
  pinMode(13, OUTPUT);

}

void loop() {
  static uint32_t tmr;
  static byte counter = 0;
  static byte PW = 0;
  static byte cnt = 0;

  if (counter < 254 && millis() - tmr >= 40) { 
            
    tmr = millis();
    cnt++;
    PW=(digitalRead(13)?1:10);
    if(cnt>=PW){
    digitalWrite(13, !digitalRead(13));
       cnt=0;
       counter++;
    }
   }
}

И уперся в несостыковку:

если меняю в строчке if (counter < 254 && millis() - tmr >= 40) {

254 меняем на 256 или выше - цикл продолжает работать

до 254 включительно - (при 254) отсчитывает 127 вспышек и цикл заканчивается.

а мне нужно установить 540 (чтоб было 270 импульсов)

что может быть?

b707
Offline
Зарегистрирован: 26.05.2017

counter описан как байт - он не может быть больше 255. Если надо больше - опишите его как инт, например

brus_o
Offline
Зарегистрирован: 11.10.2016

b707 пишет:

counter описан как байт - он не может быть больше 255. Если надо больше - опишите его как инт, например

 

спасибо, вы быстрее написали пока я разбирался

но про тип данных догадался сам.

сделал то же что вы предложили

 

спасибо

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

возьми мой скетч, там все параметры в заголовке )))

PS он кстати работает на любой ардуине, где есть индикаторный светодиод, хоть nano хоть DigiSpark...

brus_o
Offline
Зарегистрирован: 11.10.2016

ua6em пишет:

возьми мой скетч, там все параметры в заголовке )))

PS он кстати работает на любой ардуине, где есть индикаторный светодиод, хоть nano хоть DigiSpark...

а если нужно на несколько пинов разбросить? то как быть? 

а на один еще и инверторный...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

brus_o пишет:

ua6em пишет:

возьми мой скетч, там все параметры в заголовке )))

PS он кстати работает на любой ардуине, где есть индикаторный светодиод, хоть nano хоть DigiSpark...

а если нужно на несколько пинов разбросить? то как быть? 

а на один еще и инверторный...

Очевидно как-то так:

uint32_t timer;
uint16_t count = 0;
bool flag = true;

#define work_time 250  // включено
#define pause 1000     // выключено
#define impuls 270     // число импульсов
#define lim impuls*2-1

/*
   Выходные пины описаны ниже:
*/
const uint8_t OUTPUT_PIN1 = 2;          // Прямой выход
const uint8_t OUTPUT_PIN2 = 3;          // Прямой выход
const uint8_t OUTPUT_PIN3 = 4;          // Прямой выход
const uint8_t INVERSE_OUTPUT_PIN1 = 5;  // Инверсный выход

void setup() {
  pinMode(OUTPUT_PIN1, OUTPUT);
  digitalWrite(OUTPUT_PIN1, flag);
  pinMode(OUTPUT_PIN2, OUTPUT);
  digitalWrite(OUTPUT_PIN2, flag);
  pinMode(OUTPUT_PIN3, OUTPUT);
  digitalWrite(OUTPUT_PIN3, flag);
  pinMode(INVERSE_OUTPUT_PIN1, OUTPUT);
  digitalWrite(INVERSE_OUTPUT_PIN1, flag);
}

void loop() {
  if (millis() - timer >= (flag ? work_time : pause)) {
    timer = millis();
    flag = !flag;
    digitalWrite(OUTPUT_PIN1, flag);
    digitalWrite(OUTPUT_PIN2, flag);
    digitalWrite(OUTPUT_PIN3, flag);
    digitalWrite(INVERSE_OUTPUT_PIN1, !flag);
    count++;
    if (count >= lim && !flag) {
      while (1);
    }
  }
}
Скетч использует 798 байт (9%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 17 байт (1%) динамической памяти, оставляя 1007 байт для локальных переменных. Максимум: 1024 байт.

 

Green
Offline
Зарегистрирован: 01.10.2015

Ужос! Сравни с №26

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ну он же у ua6em спрашивал (я так понял по его коду), по его коду я и сделал.))

brus_o
Offline
Зарегистрирован: 11.10.2016

BOOM пишет:

Ну он же у ua6em спрашивал (я так понял по его коду), по его коду я и сделал.))

все работает, вопросов нет.

спасибо

Green
Offline
Зарегистрирован: 01.10.2015

ОК. Как насчёт пива?

brus_o
Offline
Зарегистрирован: 11.10.2016

Green пишет:

Ужос! Сравни с №26

да, возможно у тебя вариант (с макросами) может быть более перспектвный, но он не расписан....

дописать его я не могу....

Ребята дали реально рабочие скетчи

им БОЛЬШОЕ СПАСИБО

 

да и вообще, СПАСИБО ВСЕМ !!!

brus_o
Offline
Зарегистрирован: 11.10.2016

Green пишет:

ОК. Как насчёт пива?

Да не вопрос, 

могу только на карту,

потому как мы все друг от друга очень далеко

Green
Offline
Зарегистрирован: 01.10.2015

brus_o пишет:

да, возможно у тебя вариант (с макросами) может быть более перспектвный, но он не расписан....

дописать его я не могу....

Ну, тогда есть домашнее задание? Или - или. 

Green
Offline
Зарегистрирован: 01.10.2015

brus_o пишет:

Да не вопрос, 

могу только на карту,

потому как мы все друг от друга очень далеко


ОК, это проверка на вшивость. Я тут не участник.)

brus_o
Offline
Зарегистрирован: 11.10.2016

Green пишет:

brus_o пишет:

Да не вопрос, 

могу только на карту,

потому как мы все друг от друга очень далеко


ОК, это проверка на вшивость. Я тут не участник.)

мы тут все участники!! и при необходимости поможем друг-другу как минимум советом

 

Green
Offline
Зарегистрирован: 01.10.2015

brus_o, хотите подробностей, напишите htpicc@gmail.com

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

ОК. Как насчёт пива?

не гуманно заставлять человека выпить три литра пива, особенно если он пиво не пьёт )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Ужос! Сравни с №26

ну так это уже будет совсем другая программа )))

PS кстати, ты предлагаешь последовательное выполнение, если уж писать так сложно то параллельное )))
PPS Параллельная работа, можно добавить запуск от кнопки )))

test.ino
 

// BLINK для ATtiny85
#include "Blink.h"

uint8_t myled_pin = 13;
uint16_t work_time = 250;  // включено
uint16_t pause = 1000;     // выключено
uint16_t impuls = 27;     // число импульсов

Blink Blink(myled_pin, work_time, pause, impuls);

void setup() {
  Blink.start();
}

void loop()
{
  Blink.myrun();
}

Blink.h
 

#pragma once
#include <Arduino.h>

// описание класса
class Blink {   // Blink
  public:
    Blink(uint8_t led_pin, uint16_t led_on, uint16_t led_off, uint16_t count);
    void start();
    void myrun();
  private:
    uint32_t _mymillis;
    uint8_t _led_pin;
    uint16_t _led_on;
    uint16_t _led_off;
    uint16_t _count;
    bool _flag;
    bool _ends;
};


// реализация методов
Blink::Blink(uint8_t led_pin, uint16_t led_on, uint16_t led_off, uint16_t count)
{
  pinMode(led_pin, OUTPUT);
  _led_pin = led_pin;
  _led_on = led_on;
  _led_off = led_off;
  _count = count * 2 - 1;
  _flag = true;
  _ends = false;
}

void Blink::start()
{
  _mymillis = millis();
  _ends = false;
  _flag = true;
  digitalWrite(_led_pin, _flag);
}

void Blink::myrun()
{
  if (!_ends && millis() - _mymillis >= (_flag ? _led_on : _led_off)) {
    _mymillis = millis();
    _flag = !_flag;
    digitalWrite(_led_pin, _flag);
    _count--;
    if (_count == 0 && !_flag) _ends = true;
  }
}

Да! Это мой первый пробный шар, два экземпляра не взлетело, что не так пните!!!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

не гуманно заставлять человека выпить три литра пива, особенно если он пиво не пьёт )))

Ну должен же распробовать?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

ua6em пишет:

не гуманно заставлять человека выпить три литра пива, особенно если он пиво не пьёт )))

Ну должен же распробовать?

а вдруг это будет начало пути под откос?

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

не гуманно заставлять человека выпить три литра пива, особенно если он пиво не пьёт )))


Ну так должен же человек понять насколько это просто!
Соответствует ли эти 3 литра друдозатратам? Вопрос риторический.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ua6em пишет:

Это мой первый пробный шар, два экземпляра не взлетело, что не так пните!!!

А как не взлетело то? Не понял...

Green
Offline
Зарегистрирован: 01.10.2015

BOOM пишет:

А как не взлетело то? Не понял...


А пофигу! Ляпнул, а вы тренируйтесь.)