Скетч моргалки на Ардуино Нано
- Войдите на сайт для отправки комментариев
Пнд, 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 ;))) А то уже были прецеденты.
001
//ПРОВЕРЕНО В 1.8.13!!!!!!!!!!!!!!!!
002
003
004
//Тут задаем режимы, в каждом режиме - список пар: вкл/пауза (в миллисек)
005
//короткие наборы компилятор добъет до самого длинного "пустыми" парами 0-0
006
//в стартовом посте у ТС заданы два набора, одинаковые пары я выкинул
007
//я так понял ТЗ, что нужно в случайном порядке перебирать пары каждого режима
008
//Пары (в ТЗ) отличаются только длительностями пауз
009
const
uint16_t Modes[][3][2] = {{
010
{1000, 10000},
011
{1000, 5000},
012
{1000, 1000}
013
}, {
014
{2000, 5000},
015
{2000, 1000}
016
}
017
};
018
019
//просто для красоты записи в коде
020
const
byte
ONtime = 0;
021
const
byte
Pause = 1;
022
023
//всякие вычисления размерности массива режимов
024
//вычисляемые во время компиляции
025
026
constexpr
byte
Nmodes () {
027
return
sizeof
(Modes) /
sizeof
(Modes[0]);
028
}
029
030
constexpr
byte
Nitems(
byte
mode) {
031
return
sizeof
(Modes[mode]) /
sizeof
(Modes[mode][0]);
032
}
033
034
035
//полярность исполнительного устройства 1 - активный HIGH, 0 - LOW
036
const
byte
POLARITY = 1;
037
038
//вот тут уже ничего не менять, все задается выше - полярностью
039
const
byte
ONstate = POLARITY;
040
const
byte
OFFstate = 1 - ONstate;
041
042
//пин "тумблёра" - очень слово нравится!!! ;))
043
//ту не стал изголяться с полярностью, всегда можно включить иначе.
044
const
byte
SWpin = 2;
045
046
//пин исполнительного устройства, для модели - ессно - 13, встроенный светодиод.
047
const
byte
OUTpin = LED_BUILTIN;
048
049
//чтение кнопки - "тумблёра" ;)) с антидребезгом
050
byte
getButton(
byte
pin) {
051
//длительность защиты от дребезга
052
const
uint8_t dbTime = 25;
053
054
static
uint32_t om = millis();
055
uint32_t nm = millis();
056
static
byte
rbs = digitalRead(pin);
057
static
byte
obs = digitalRead(pin);
058
byte
nbs = digitalRead(pin);
059
060
if
(obs == nbs and nm - om > dbTime) {
061
rbs = obs;
062
nm = om;
063
}
064
else
if
(obs != nbs) {
065
obs = nbs;
066
om = nm;
067
}
068
return
rbs;
069
}
070
071
//для удобства печати в сериал, после отладки можно выкинуть
072
int
Wprintf(
const
char
* __fmt, ...) {
073
char
s[128];
074
va_list ap;
075
va_start(ap, __fmt);
076
int
r = vsnprintf(s, 128, __fmt, ap);
077
va_end(ap);
078
Serial
.print(s);
079
return
r;
080
}
081
082
083
void
setup
() {
084
pinMode (SWpin, INPUT_PULLUP);
085
pinMode(OUTpin, OUTPUT);
086
digitalWrite (OUTpin, OFFstate);
087
088
//для отладочного вывода
089
Serial
.begin(115200);
090
}
091
092
093
094
void
loop
() {
095
static
byte
currentMode = 0;
096
static
byte
currentItem = 0;
097
static
byte
currentState = OFFstate;
098
static
uint16_t currentInterval = 0;
099
100
static
uint32_t oldMillis = millis();
101
uint32_t newMillis = millis();
102
103
byte
button = getButton(SWpin);
104
105
//вот тут, если режимов захочется больше двух, можно поставить циклическое переключение
106
//сейчас режим == значению свича
107
108
if
(currentMode != button) {
109
currentMode = button;
110
111
//при изменении режима сразу сбрасываем интервал в 0, чтобы не ожидать окончания текущего действия
112
currentInterval = 0;
113
114
currentState = OFFstate;
115
}
116
117
//собственно "моргалка"
118
119
if
(newMillis - oldMillis > currentInterval) {
120
oldMillis = newMillis;
121
122
//если текущее состояние - "включено", то вариант из режима не меняем,
123
//а выключаем и устанавливаем интервал для паузы
124
125
if
(currentState == ONstate) {
126
currentInterval = Modes[currentMode][currentItem][Pause];
127
currentState = OFFstate;
128
}
129
// иначе меняем вариант (item) из режима, новый ВЫБИРАЕМ СЛУЧАЙНО
130
//я так понял ТЗ, "бесконечный цикл, но рандомно" ;))
131
else
{
132
currentItem = random(Nitems(currentMode));
133
currentInterval = Modes[currentMode][currentItem][ONtime];
134
currentState = ONstate;
135
136
//отладочный вывод
137
Wprintf(
"режим: %2d вариант: %2d вкл: %5d мс пауза: %5d мс \n"
,
138
currentMode,
139
currentItem,
140
Modes[currentMode][currentItem][ONtime],
141
Modes[currentMode][currentItem][Pause]);
142
//---------------------------
143
}
144
}
145
digitalWrite(OUTpin, currentState);
146
}
-_-
Где ты раньше был??)))
-_-
Улыбка украшает человека, но если расстроишь Садмана - попадешь в ЧС заказчиков. Это я так, просто напоминаю...
Код я просто от скуки написал.
))) Не, кидать никого не планировал. Дай контакты, закину денежку.
П.С. Код уже не подойдет, хотя скопировал)) У меня там добавились режимы и кнопка. Хотя, не знаю, насколько это трудоёмко.
Граф, второй раз у тебя вижу такое
01
//для удобства печати в сериал, после отладки можно выкинуть
02
int
Wprintf(
const
char
* __fmt, ...) {
03
char
s[128];
04
va_list ap;
05
va_start(ap, __fmt);
06
int
r = vsnprintf(s, 128, __fmt, ap);
07
va_end(ap);
08
Serial
.print(s);
09
return
r;
10
}
11
12
13
void
setup
() {
14
pinMode (SWpin, INPUT_PULLUP);
15
pinMode(OUTpin, OUTPUT);
16
digitalWrite (OUTpin, OFFstate);
17
18
//для отладочного вывода
19
Serial
.begin(115200);
20
}
Второй раз не смог пройти мимо :)
01
int
ser_putchar(
char
AChar, FILE *AFile) {
02
return
Serial
.print(AChar);
03
}
04
05
06
void
setup
(
void
) {
07
Serial
.begin(115200);
08
09
stdout = fdevopen(ser_putchar, NULL);
10
11
delay(100);
12
13
printf(
"Start.\n"
);
// для отладки. :)
))) Бляха, может после Садмана сюда код на проверку закинуть?
))) Бляха, может после Садмана сюда код на проверку закинуть?
После Садмана, абычно, ничего проверять не надо.
Добро
Да можно. Я как-то раз обертку написал, задолбавшись Serial.print() в кулаке гонять... и больше не думал о ней.
У тебя - красИвее! ;)) Или красивЕе?
Дай контакты
Второй раз не смог пройти мимо :)
01
int
ser_putchar(
char
AChar, FILE *AFile) {
02
return
Serial
.print(AChar);
03
}
04
05
06
void
setup
(
void
) {
07
Serial
.begin(115200);
08
09
stdout = fdevopen(ser_putchar, NULL);
10
11
delay(100);
12
13
printf(
"Start.\n"
);
// для отладки. :)
Поигрался, изменил так:
01
void
setup
() {
02
Serial
.begin(115200);
03
fdevopen([](
char
__ch) {
04
return
Serial
.print(__ch);
05
}, NULL);
06
07
printf(
"Мама мыла раму. %03d\n "
, 32);
08
}
09
10
void
loop
() {}
Просто посмотрел исходник, fdevopen сам stdout и stderr определяет, ну и блямба - наше ффсё!! ;))
Теперь тока так буду! Пасибки.
Есть еще вариант - структуру FILE для stdout определить не на куче, что fdevopen() делает, а глобально. В доках к arv-libc пример есть... но это уже украшательство.
Дай контакты
в телеге: собака мой ник, т.е. @wdrakula