Вышел я из возраста, на слабО и писькометрии. Любой, желающий поплеваться желчью, может это сделать, если хотя-бы равен оппоненту по уровню. А Архатовщина, еще два года назад достала. В результате оставил код от Петра.
Влад, твой последний пост тоже зачистил, захочет разобраться, сам найдет. ИМХО.
Написал проверочный код. Самые первые действия идут через 40, 60, 80 мс, а дальше каждое действие строго через 100 мс.
При переполнении currMillis интервалы сохраняют свое значение в 100 мс.
Где кошмар??
Спасибо. Это важное замечание, особенно если требуется строгая очередность действий.
В проверочном коде выше я специально оставил как есть, чтоб видно было.
вот целиком
01
const
int
ledPin = 13;
02
int
State = LOW;
03
unsigned
long
previousMillis;
04
const
long
interval_1 = 1000;
05
const
long
interval_2 = 10000;
06
void
setup
() {
07
pinMode(ledPin, OUTPUT);
08
}
09
void
loop
() {
10
unsigned
long
currentMillis = millis ( );
11
if
( State == LOW ) {
12
if
( currentMillis - previousMillis >= interval_1 ) {
13
previousMillis = currentMillis;
14
State = HIGH;
15
digitalWrite (ledPin, State );
16
}}
17
if
( State == HIGH ) {
18
if
( currentMillis - previousMillis >= interval_2 ) {
19
previousMillis = currentMillis;
20
State = LOW;
21
digitalWrite ( ledPin, State );
22
}
23
}
24
}
вот целиком
Работает.
Вот такой код тоже работает.
1
if
( currentMillis - previousMillis >= interval ) {
2
previousMillis = currentMillis;
3
boolState = !boolState;
4
digitalWrite ( sveha, boolState );
5
interval = 11000-interval;
6
}
itar. вы настолько криворукий. что даже готовый код не в состоянии использовать?
Для наглядности добавил вывод в Сериал:
01
const
int
ledPin = 13;
02
int
State = LOW;
03
unsigned
long
previousMillis;
04
const
long
interval_1 = 1000;
05
const
long
interval_2 = 2000;
06
void
setup
() {
07
pinMode(ledPin, OUTPUT);
08
Serial
.begin(9600);
09
}
10
void
loop
() {
11
unsigned
long
currentMillis = millis ( );
12
if
( State == LOW ) {
13
if
( currentMillis - previousMillis >= interval_1 ) {
14
previousMillis = currentMillis;
15
State = HIGH;
16
Serial
.print(
" Go to High "
);
17
Serial
.println(currentMillis);
18
digitalWrite (ledPin, State );
19
}}
20
if
( State == HIGH ) {
21
if
( currentMillis - previousMillis >= interval_2 ) {
22
previousMillis = currentMillis;
23
State = LOW;
24
Serial
.print(
" Go to Low "
);
25
Serial
.println(currentMillis);
26
digitalWrite ( ledPin, State );
27
}
28
}
29
}
А вот результат работы
1
Go to High 1000
2
Go to Low 3000
3
Go to High 4000
4
Go to Low 6000
5
Go to High 7000
6
Go to Low 9000
7
Go to High 10000
Вот такой код тоже работает.
не забудьте только правильно указать типы данных - а то ТС сам не справится. У него, заметьте - интервал типа long
Если наоборот.
вот в таком виде действительно получилось,то что и требовалось.
01
const
int
ledPin = 13;
02
int
State = LOW;
03
unsigned
long
previousMillis;
04
const
long
interval_1 = 10000;
05
const
long
interval_2 = 1000;
06
void
setup
() {
07
pinMode(ledPin, OUTPUT);
08
Serial
.begin(9600);
09
}
10
void
loop
() {
11
unsigned
long
currentMillis = millis ( );
12
if
( State == LOW ) {
13
if
( currentMillis - previousMillis >= interval_1 ) {
14
previousMillis = currentMillis;
15
State = HIGH;
//потушили
16
Serial
.print(
" Go to High "
);
17
Serial
.println(currentMillis);
18
digitalWrite (ledPin, State );
19
}}
20
if
( State == HIGH ) {
21
if
( currentMillis - previousMillis >= interval_2 ) {
22
previousMillis = currentMillis;
23
State = LOW;
//включили
24
Serial
.print(
" Go to Low "
);
25
Serial
.println(currentMillis);
26
digitalWrite ( ledPin, State );
Спасибо.
Если наоборот.
вот в таком виде действительно получилось,то что и требовалось.
Ну слава богу - заказчик принял работу :)
itar, так в чем выражалось "не работает" ? - то что я в примере поставил интервал 2 сек вместо нужных Вашему Сиятельству 10-ти? :)
Офигеть - уже и значения констант в готовом скетче сами поменять не могут.
Офигеть - уже и значения констант в готовом скетче сами поменять не могут.
Не царское это дело! Взялся, так будь любезен не халтурить, а выставлять все константы как надо! Совсем помогатели распустились, блин!
я не знаю почему вариант ven-tilа не работал . светодиод просто горел.
я не знаю почему вариант ven-tilа не работал
причем тут вариант ven-tilа - я спрашиваю про свой код - который ваш скетч из #51
Столько агрессии.я же не утверждал, что я специалист.
приобрел плату месяц назад, это весь мой опыт.
ваш код работал .только я местами поменял интервалы и все.
Столько агрессии.я же не утверждал, что я специалист.
приобрел плату месяц назад, это весь мой опыт.
Они тут такие.

всего пару дней поплевали. Зато результат.
И на том спасибо.
всего пару дней поплевали. Зато результат.
И на том спасибо.
Просто кто-то наплевательски отнесся к вразумительной подаче ответов.
Часто так строю loop()
01
void
loop
(){
02
carrMillis = millis();
03
if
(carrMillis - prevMillis >= 10){
//10ms
04
prevMillis += intervalMs;
05
// делаем три действия каждые 100 мс, но со сдвигом "по фазе" в 20 мс
06
if
(((countCycle + 13) % 10) == 0){
//кажд.100 мс
07
//действие 1
08
}
09
if
(((countCycle + 15) % 10) == 0){
//кажд.100 мс
10
//действие 2
11
}
12
if
(((countCycle + 17) % 10) == 0){
//кажд.100 мс
13
//действие 3
14
}
15
switch
(countCycle){
16
case
0 ... (TOTAL_STR -1):
//TOTAL_STR - всего строк
17
if
(menu == 0) printLCD(countCycle);
//выводим по одной строке за луп
18
break
;
//раз в сек
19
20
case
5:
21
if
((second % 3) == 0) tempAer = getDS();
//кажд.3 сек. В сот *С
22
23
break
;
24
case
6:
25
if
((second % 3) == 2) startDS();
break
;
//за 1 сек до чтения
26
case
7:
27
tempKot = readTempKTY81(PIN_KTY_KOTEL);
//в сотых *С каждую сек
28
break
;
29
case
8:
30
//действие 4
31
break
;
32
case
40:
33
if
(!menu && !startStroka) { lcd.setCursor(2, startStroka); lcd.print(
' '
); }
//мигает ":" на часах
34
break
;
35
case
80:
36
tempOil = readTempKTY81(PIN_KTY_OIL);
//в сотых *С
37
38
break
;
39
}
40
if
(++countCycle >= 100){
//прошла 1 сек
41
countCycle = 0;
42
}
43
}
44
}
//END loop()
Часто так строю loop()
01
void
loop
(){
02
carrMillis = millis();
03
if
(carrMillis - prevMillis >= 10){
//10ms
04
prevMillis += intervalMs;
05
// делаем три действия каждые 100 мс, но со сдвигом "по фазе" в 20 мс
06
if
(((countCycle + 13) % 10) == 0){
//кажд.100 мс
07
//действие 1
08
}
09
if
(((countCycle + 15) % 10) == 0){
//кажд.100 мс
10
//действие 2
11
}
12
if
(((countCycle + 17) % 10) == 0){
//кажд.100 мс
13
//действие 3
14
}
15
switch
(countCycle){
16
case
0 ... (TOTAL_STR -1):
//TOTAL_STR - всего строк
17
if
(menu == 0) printLCD(countCycle);
//выводим по одной строке за луп
18
break
;
//раз в сек
19
20
case
5:
21
if
((second % 3) == 0) tempAer = getDS();
//кажд.3 сек. В сот *С
22
23
break
;
24
case
6:
25
if
((second % 3) == 2) startDS();
break
;
//за 1 сек до чтения
26
case
7:
27
tempKot = readTempKTY81(PIN_KTY_KOTEL);
//в сотых *С каждую сек
28
break
;
29
case
8:
30
//действие 4
31
break
;
32
case
40:
33
if
(!menu && !startStroka) { lcd.setCursor(2, startStroka); lcd.print(
' '
); }
//мигает ":" на часах
34
break
;
35
case
80:
36
tempOil = readTempKTY81(PIN_KTY_OIL);
//в сотых *С
37
38
break
;
39
}
40
if
(++countCycle >= 100){
//прошла 1 сек
41
countCycle = 0;
42
}
43
}
44
}
//END loop()
Спасибо за пример. Маленькое замечание. У вас нумерация действий идет в обратном порядке. Сначала выполнится 3 потом 2 потом 1.
1
if
(((countCycle + 13) % 10) == 0){
//кажд.100 мс
2
//действие 1
3
}
4
if
(((countCycle + 15) % 10) == 0){
//кажд.100 мс
5
//действие 2
6
}
7
if
(((countCycle + 17) % 10) == 0){
//кажд.100 мс
8
//действие 3
9
}
1
if
(((countCycle + 15) % 10) == 0){
//кажд.100 мс
И получаешь не пропуски так повторы. Кошмар.
1
if
(((countCycle + 15) % 10) == 0){
//кажд.100 мс
И получаешь не пропуски так повторы. Кошмар.
rkit, почему кошмар? Обычный быдлокод ардуинщика.
Сейчас проверить не могу, покажи, если не трудно, код где видны пропуски и повторы.
Вышел я из возраста, на слабО и писькометрии. Любой, желающий поплеваться желчью, может это сделать, если хотя-бы равен оппоненту по уровню. А Архатовщина, еще два года назад достала. В результате оставил код от Петра.
Влад, твой последний пост тоже зачистил, захочет разобраться, сам найдет. ИМХО.
можно и через миллис, но нужно ли?
{
digitalWrite(LED,HIGH);
delay(1000);
digitalWrite(LED,LOW);
delay(10000);
}
1
if
(((countCycle + 15) % 10) == 0){
//кажд.100 мс
И получаешь не пропуски так повторы. Кошмар.
Написал проверочный код. Самые первые действия идут через 40, 60, 80 мс, а дальше каждое действие строго через 100 мс.
При переполнении currMillis интервалы сохраняют свое значение в 100 мс.
Где кошмар??
01
void
setup
() {
02
Serial
.begin(115200);
03
}
04
05
void
loop
(){
06
static
word prevMillis=0, intervalMs=10, interval_100ms = 100;
07
static
byte
countCycle = 0;
08
word currMillis = (word)millis();
09
static
word prevMs_1 = currMillis, prevMs_2 = currMillis, prevMs_3 = currMillis;
10
11
if
(currMillis - prevMillis >= intervalMs){
//10ms
12
prevMillis += intervalMs;
13
// делаем три действия каждые 100 мс, но со сдвигом "по фазе" в 20 мс
14
if
(((countCycle + 13) % 10) == 0){
//кажд.100 мс. ЭТО ДЕЙСТВИЕ ПОСЛЕДНЕЕ!!
15
if
(prevMs_1 != currMillis){
16
Serial
.print(
"ERROR "
);
17
}
else
{
18
Serial
.print(
"do1="
);
//Serial.println(currMillis);
19
}
20
prevMs_1 = currMillis + interval_100ms;
21
Serial
.println(currMillis);
22
Serial
.println();
//разделитель между тремя действиями
23
}
24
if
(((countCycle + 15) % 10) == 0){
//кажд.100 мс
25
if
(prevMs_2 != currMillis){
26
Serial
.print(
"ERROR "
);
27
}
else
{
28
Serial
.print(
"do2="
);
//Serial.println(currMillis);
29
}
30
prevMs_2 = currMillis + interval_100ms;
31
Serial
.println(currMillis);
32
}
33
if
(((countCycle + 17) % 10) == 0){
//кажд.100 мс
34
if
(prevMs_3 != currMillis){
35
Serial
.print(
"ERROR "
);
36
}
else
{
37
Serial
.print(
"do3="
);
//Serial.println(currMillis);
38
}
39
prevMs_3 = currMillis + interval_100ms;
40
Serial
.println(currMillis);
41
}
42
43
if
(++countCycle >= 100){
//прошла 1 сек
44
countCycle = 0;
45
}
46
}
47
}
//END loop()
Маленькое замечание. У вас нумерация действий идет в обратном порядке. Сначала выполнится 3 потом 2 потом 1.
1
if
(((countCycle + 13) % 10) == 0){
//кажд.100 мс
2
//действие 1
3
}
4
if
(((countCycle + 15) % 10) == 0){
//кажд.100 мс
5
//действие 2
6
}
7
if
(((countCycle + 17) % 10) == 0){
//кажд.100 мс
8
//действие 3
9
}
Спасибо. Это важное замечание, особенно если требуется строгая очередность действий.
В проверочном коде выше я специально оставил как есть, чтоб видно было.
Я бы таким как ты пасть зашивал, чтобы лаял меньше