Скетч моргалки на Ардуино Нано
- Войдите на сайт для отправки комментариев
Пнд, 05/04/2021 - 13:14
Приветствую всех!
Нужен скетч для режимов работы моргалки.
Имеем 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 вт рабочая, или необходимо реле?
Заранее, благодарю.
Ардуина не потянет ни 12V, ни 12W. "Реле" в том или ином виде нужно.
Скетч накатать недолго: wrk.sadman@gmail.com
Подскажите, как еще можно реализовать данные функции? Может это будет и не Ардуино.
Готовое реле 680р. в Ч/Д есть. Купи и ниипи_нам_моск.
Реле не даст данного режима работы.
любой самый дешевый микроконтроллер, хоть тини13 - справится. А сигнал через реле или через мосфет. В принципе ничего сложного, когда понимаешь, что к чему.
Вы, кстати, разместили вопрос в платном разделе - а такое впечатление, что пытаетесь вытащить из нас консультацию бесплатно :)
)) Мне ваши консультации будут полезны в плане общего развития, так как в теме Ардуино и МК я крайне далек. Знаю что хочу получить, понимаю, что логика есть в Ардуино и на этом всё) Тему не случайно разместил в платном разделе, так как готов оплатить написание скетча, либо иную реализацию задуманного.
Мне необходима суперкомпактная реализация, отказоустойчивая, без зависаний.
человек в #1 вам дал почту - напишите ему
Да, благодарю. Уже веду переписку с этим человеком.
Обсудим yaroslav.kraynov@gmail.com
Это вы зарядное устройство "моргалку" хотите сделать ?
Нет. Именно моргалку)
Беру паузу на пару дней, чтобы получить Ардуинку и дополнить ТЗ.
Вот я долго думал и не придумал, что может означать вот эта фраза - "Бесконечный цикл с начала, но рандомно ".
Как будто все остальное имеет смысл... )
Вы, кстати, разместили вопрос в платном разделе - а такое впечатление, что пытаетесь вытащить из нас консультацию бесплатно :)
По всей видимости твоя интуиция лучше моей.
Я никуда не сливался. Вся размещенная мной информация актуальна. Скетч будет усложнен доп.алгоритмами и кнопкой. Ардуинка есть, времени нет на покупку периферии.
ардуино и периферия для заказа кода совсем необязательны...
По вашему мнению, я должен заказать скетч и полностью положиться на компетентность исполнителя? Т.е. проверка работоспособности кода с моей стороны не требуется?
всё понятно
Я буду работать по предоплате. Проверку работоспособности кода я могу произвести лишь и использованием связки Ардуино и периферии. Что тут непонятно?
Когда сможете проверить?
Планирую завершить вопрос периферии до конца этой недели.
хорошо.
Вопрос с периферией решен, ведутся переговоры с sadman41 по реализации
Заказ в работе
ну переговоры это хорошо.
Вот "Моргалка". Платить Садману все равно придется, раз уж договорился ;)).
Собирать в 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); }-_-
Где ты раньше был??)))
-_-
Улыбка украшает человека, но если расстроишь Садмана - попадешь в ЧС заказчиков. Это я так, просто напоминаю...
Код я просто от скуки написал.
))) Не, кидать никого не планировал. Дай контакты, закину денежку.
П.С. Код уже не подойдет, хотя скопировал)) У меня там добавились режимы и кнопка. Хотя, не знаю, насколько это трудоёмко.
Граф, второй раз у тебя вижу такое
//для удобства печати в сериал, после отладки можно выкинуть 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"); // для отладки. :)))) Бляха, может после Садмана сюда код на проверку закинуть?
))) Бляха, может после Садмана сюда код на проверку закинуть?
После Садмана, абычно, ничего проверять не надо.
Добро
Да можно. Я как-то раз обертку написал, задолбавшись Serial.print() в кулаке гонять... и больше не думал о ней.
У тебя - красИвее! ;)) Или красивЕе?
Дай контакты
Второй раз не смог пройти мимо :)
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