Скетч моргалки на Ардуино Нано

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Приветствую всех!
Нужен скетч для режимов работы моргалки.
Имеем Arduino Nano. Источник питания 12 в. Тумблер 2 положения (2 режима работы). Потребитель 12 в, 12 вт.
Режим 1. Включение на 1 сек--> Пауза 10 сек --> Включение на 1 сек --> Пауза 5 сек --> Включение на 1 сек --> Пауза 1 сек --> Включение на 1 сек --> Пауза 5 сек --> Бесконечный цикл с начала, но рандомно.
Режим 2. Включение на 2 сек --> Пауза 5 сек --> Включение на 2 сек --> Пауза 5 сек --> Включение на 2 сек --> Пауза 1 сек --> Включение на 2 сек --> Пауза 1 сек --> Бесконечный цикл с начала, но рандомно.

Вопрос. Связка Arduino Nano и потребитель 12 вт рабочая, или необходимо реле?

Заранее, благодарю.

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

Ардуина не потянет ни 12V, ни 12W. "Реле" в том или ином виде нужно.

Скетч накатать недолго: wrk.sadman@gmail.com

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Подскажите, как еще можно реализовать данные функции? Может это будет и не Ардуино.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Готовое реле 680р. в Ч/Д есть. Купи и ниипи_нам_моск.

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Реле не даст данного режима работы.

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

Sakhalin пишет:
Подскажите, как еще можно реализовать данные функции? Может это будет и не Ардуино.

любой самый дешевый микроконтроллер, хоть тини13 - справится. А сигнал через реле или через мосфет. В принципе ничего сложного, когда понимаешь, что к чему.

 

Вы, кстати, разместили вопрос в платном разделе - а такое впечатление, что пытаетесь вытащить из нас консультацию бесплатно :)

Sakhalin
Offline
Зарегистрирован: 05.04.2021

)) Мне ваши консультации будут полезны в плане общего развития, так как в теме Ардуино и МК я крайне далек. Знаю что хочу получить, понимаю, что логика есть в Ардуино и на этом всё) Тему не случайно разместил в платном разделе, так как готов оплатить написание скетча, либо иную реализацию задуманного.

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Мне необходима суперкомпактная реализация, отказоустойчивая, без зависаний.

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

человек в #1 вам дал почту - напишите ему

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Да, благодарю. Уже веду переписку с этим человеком.

Yaroslav10110
Yaroslav10110 аватар
Offline
Зарегистрирован: 10.11.2020

Обсудим yaroslav.kraynov@gmail.com

renoshnik
Offline
Зарегистрирован: 11.04.2013

Sakhalin пишет:
Приветствую всех! Нужен скетч для режимов работы моргалки. Имеем Arduino Nano. Источник питания 12 в. Тумблер 2 положения (2 режима работы). Потребитель 12 в, 12 вт. Режим 1. Включение на 1 сек--> Пауза 10 сек --> Включение на 1 сек --> Пауза 5 сек --> Включение на 1 сек --> Пауза 1 сек --> Включение на 1 сек --> Пауза 5 сек --> Бесконечный цикл с начала, но рандомно. Режим 2. Включение на 2 сек --> Пауза 5 сек --> Включение на 2 сек --> Пауза 5 сек --> Включение на 2 сек --> Пауза 1 сек --> Включение на 2 сек --> Пауза 1 сек --> Бесконечный цикл с начала, но рандомно. Вопрос. Связка Arduino Nano и потребитель 12 вт рабочая, или необходимо реле? Заранее, благодарю.

Это вы зарядное устройство "моргалку" хотите сделать ?

 

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Нет. Именно моргалку)
Беру паузу на пару дней, чтобы получить Ардуинку и дополнить ТЗ.

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

Вот я долго думал и не придумал, что может означать вот эта фраза - "Бесконечный цикл с начала, но рандомно ".

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

Как будто все остальное имеет смысл... )

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

b707 пишет:

Вы, кстати, разместили вопрос в платном разделе - а такое впечатление, что пытаетесь вытащить из нас консультацию бесплатно :)


По всей видимости твоя интуиция лучше моей.

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Я никуда не сливался. Вся размещенная мной информация актуальна. Скетч будет усложнен доп.алгоритмами и кнопкой. Ардуинка есть, времени нет на покупку периферии.

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

Sakhalin пишет:
Ардуинка есть, времени нет на покупку периферии.

ардуино и периферия для заказа кода совсем необязательны...

Sakhalin
Offline
Зарегистрирован: 05.04.2021

По вашему мнению, я должен заказать скетч и полностью положиться на компетентность исполнителя? Т.е. проверка работоспособности кода с моей стороны не требуется?

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

всё понятно

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Я буду работать по предоплате. Проверку работоспособности кода я могу произвести лишь и использованием связки Ардуино и периферии. Что тут непонятно?

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

Когда сможете проверить?

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Планирую завершить вопрос периферии до конца этой недели.

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

хорошо.

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Вопрос с периферией решен, ведутся переговоры с sadman41 по реализации

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Заказ в работе

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ну переговоры это хорошо.

Вот "Моргалка". Платить Садману все равно придется, раз уж договорился ;)).

Собирать в 1.8.13 ;))) А то уже были прецеденты.

//ПРОВЕРЕНО В 1.8.13!!!!!!!!!!!!!!!!


//Тут задаем режимы, в каждом режиме - список пар: вкл/пауза (в миллисек)
//короткие наборы компилятор добъет до самого длинного "пустыми" парами 0-0
//в стартовом посте у ТС заданы два набора, одинаковые пары я выкинул
//я так понял ТЗ, что нужно в случайном порядке перебирать пары каждого режима
//Пары (в ТЗ) отличаются только длительностями пауз
const uint16_t Modes[][3][2] = {{
    {1000, 10000},
    {1000, 5000},
    {1000, 1000}
  }, {
    {2000, 5000},
    {2000, 1000}
  }
};

//просто для красоты записи в коде
const byte ONtime = 0;
const byte Pause = 1;

//всякие вычисления размерности массива режимов
//вычисляемые во время компиляции

constexpr byte Nmodes () {
  return sizeof (Modes) / sizeof(Modes[0]);
}

constexpr byte Nitems(byte mode) {
  return sizeof (Modes[mode]) / sizeof(Modes[mode][0]);
}


//полярность исполнительного устройства 1 - активный HIGH, 0 - LOW
const byte POLARITY = 1;

//вот тут уже ничего не менять, все задается выше - полярностью
const byte ONstate = POLARITY;
const byte OFFstate = 1 - ONstate;

//пин "тумблёра" - очень слово нравится!!! ;))
//ту не стал изголяться с полярностью, всегда можно включить иначе.
const byte SWpin = 2;

//пин исполнительного устройства, для модели - ессно - 13, встроенный светодиод.
const byte OUTpin = LED_BUILTIN;

//чтение кнопки - "тумблёра" ;)) с антидребезгом
byte getButton(byte pin) {
  //длительность защиты от дребезга
  const uint8_t dbTime = 25;

  static uint32_t om = millis();
  uint32_t nm = millis();
  static byte rbs = digitalRead(pin);
  static byte obs = digitalRead(pin);
  byte nbs = digitalRead(pin);

  if (obs == nbs and nm - om > dbTime) {
    rbs = obs;
    nm = om;
  }
  else if (obs != nbs) {
    obs = nbs;
    om = nm;
  }
  return  rbs;
}

//для удобства печати в сериал, после отладки можно выкинуть
int Wprintf(const char* __fmt, ...) {
  char s[128];
  va_list ap;
  va_start(ap, __fmt);
  int r = vsnprintf(s, 128, __fmt, ap);
  va_end(ap);
  Serial.print(s);
  return r;
}


void setup() {
  pinMode (SWpin, INPUT_PULLUP);
  pinMode(OUTpin, OUTPUT);
  digitalWrite (OUTpin, OFFstate);

  //для отладочного вывода
  Serial.begin(115200);
}



void loop() {
  static byte currentMode = 0;
  static byte currentItem = 0;
  static byte currentState = OFFstate;
  static uint16_t currentInterval = 0;

  static uint32_t oldMillis = millis();
  uint32_t newMillis = millis();

  byte button = getButton(SWpin);
  
  //вот тут, если режимов захочется больше двух, можно поставить циклическое переключение
  //сейчас режим == значению свича
  
  if (currentMode != button) {
    currentMode = button;
  
    //при изменении режима сразу сбрасываем интервал в 0, чтобы не ожидать окончания текущего действия
    currentInterval = 0;
    
    currentState = OFFstate;
  }

  //собственно "моргалка"
  
  if (newMillis - oldMillis > currentInterval) {
    oldMillis = newMillis;
    
    //если текущее состояние - "включено", то вариант из режима не меняем,
    //а выключаем и устанавливаем интервал для паузы
    
    if (currentState == ONstate) {
      currentInterval = Modes[currentMode][currentItem][Pause];
      currentState = OFFstate;
    }
    // иначе меняем вариант (item) из режима, новый ВЫБИРАЕМ СЛУЧАЙНО
    //я так понял ТЗ, "бесконечный цикл, но рандомно" ;))
    else {
      currentItem = random(Nitems(currentMode));
      currentInterval = Modes[currentMode][currentItem][ONtime];
      currentState = ONstate;
  
      //отладочный вывод
      Wprintf("режим: %2d вариант: %2d вкл: %5d мс пауза: %5d мс \n",
              currentMode,
              currentItem,
              Modes[currentMode][currentItem][ONtime],
              Modes[currentMode][currentItem][Pause]);
      //---------------------------        
    }
  }
  digitalWrite(OUTpin, currentState);
}

 

 

 

Sakhalin
Offline
Зарегистрирован: 05.04.2021

-_-

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Где ты раньше был??)))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Sakhalin пишет:

-_-

Улыбка украшает человека, но если расстроишь Садмана - попадешь в ЧС заказчиков. Это я так, просто напоминаю...

Код я просто от скуки написал.

Sakhalin
Offline
Зарегистрирован: 05.04.2021

))) Не, кидать никого не планировал. Дай контакты, закину денежку.

П.С. Код уже не подойдет, хотя скопировал)) У меня там добавились режимы и кнопка. Хотя, не знаю, насколько это трудоёмко.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Граф, второй раз у тебя вижу такое

//для удобства печати в сериал, после отладки можно выкинуть
int Wprintf(const char* __fmt, ...) {
  char s[128];
  va_list ap;
  va_start(ap, __fmt);
  int r = vsnprintf(s, 128, __fmt, ap);
  va_end(ap);
  Serial.print(s);
  return r;
}


void setup() {
  pinMode (SWpin, INPUT_PULLUP);
  pinMode(OUTpin, OUTPUT);
  digitalWrite (OUTpin, OFFstate);

  //для отладочного вывода
  Serial.begin(115200);
}

Второй раз не смог пройти мимо  :) 

int ser_putchar(char AChar, FILE *AFile) {
	return Serial.print(AChar);
}


void setup(void) {
	Serial.begin(115200);
	
	stdout = fdevopen(ser_putchar, NULL);

	delay(100);

	printf("Start.\n");  // для отладки. :) 

 

Sakhalin
Offline
Зарегистрирован: 05.04.2021

))) Бляха, может после Садмана сюда код на проверку закинуть?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Sakhalin пишет:

))) Бляха, может после Садмана сюда код на проверку закинуть?

После Садмана, абычно, ничего проверять не надо. 

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Добро

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Да можно. Я как-то раз обертку написал, задолбавшись Serial.print() в кулаке гонять... и больше не думал о ней.

У тебя - красИвее! ;)) Или красивЕе?

 

Sakhalin
Offline
Зарегистрирован: 05.04.2021

Дай контакты

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DetSimen пишет:

Второй раз не смог пройти мимо  :) 

int ser_putchar(char AChar, FILE *AFile) {
	return Serial.print(AChar);
}


void setup(void) {
	Serial.begin(115200);
	
	stdout = fdevopen(ser_putchar, NULL);

	delay(100);

	printf("Start.\n");  // для отладки. :) 

 

Поигрался, изменил так:

void setup() {
  Serial.begin(115200);
  fdevopen([](char __ch) {
    return Serial.print(__ch);
  }, NULL);

  printf("Мама мыла раму.  %03d\n ", 32);
}

void loop() {}

Просто посмотрел исходник, fdevopen сам stdout и stderr определяет, ну и блямба - наше ффсё!! ;))

Теперь тока так буду! Пасибки.

Есть еще вариант - структуру FILE для stdout определить не на куче, что fdevopen() делает, а глобально. В доках к arv-libc пример есть... но это уже украшательство.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Sakhalin пишет:

Дай контакты

в телеге: собака мой ник, т.е. @wdrakula