http://arduino.ru/forum/programmirovani ... ent-192717Владимир Arhat109 рекомендует (продолжение):Цитата:
Похоже я сильно поторопился, объединив в одной проверке несколько разных условий ДРАКОН-схемы. Давайте вернемся чут-чуть назад к ДРАКОН-схеме:
Код:
001
// Схема "Силуэт", состоящая из нескольких ветвей. Правила:
002
// а) Чем ветка проще и чаще тем левее она на схеме (тут выше - схема повернута "сверху-вниз")
003
// б) Каждая ветка начинается со своего условия и оно одно.
004
// в) Переход на следующую ветку - просто завершение блока по if().
005
// г) Схема перенумерована. Разные датчики - подветки 1,2 соответственно.
006
007
// ветка1. "Царская дорога" (самое просто и 3/5 суточного исполнения): Если светло - выходим.
008
// *прим.: тут надо ещё добавить код, выключающий лампы, если они были ещё включены.
009
if( isDayNow() ){ /*выключить всё*/ return; }
010
011
// ветка2.1 "Темно" - ждем датчик1:
012
if( digitalRead(pirPin1) ){
013
isGo1 = 1; // датчик1 сработал: переключаем на ветку 3.1 и подготавливаем данные
014
lamp1=0; // включение от меньшей к большей, яркость по +1 (isGo1)
015
max1 = MAX_LED;
016
}
017
018
// ветка2.2 "Темно" - ждем датчик2:
019
if( digitalRead(pirPin2) ){
020
isGo2 = 1; // датчик2 сработал: переключаем на ветку 3.2 ..
021
lamp2=MAX_LED-1; // включение от большей к меньшей, яркость по +1 (isGo2)
022
max2 = -1;
023
}
024
025
// Разделяем эти условия на отдельные ветки, дабы не путаться:
026
027
// ветка 3.1 поштучно включаем лампы от меньшей к большей:
028
if( isGo1 == 1 ){
029
030
// подветка 3.1.1 "текущая лампа уже включена? перейти к следующей"
031
if( fades[lamp1].bright == 255 ){
032
lamp1++;
033
}else{
034
// ветка "нет" 3.1.1: "добавлять яркость по isGo1, каждые WAIT_1 мсек"
035
fadeLED(lamp1, isGo1);
036
}
037
}
038
039
// ветка 3.2. поштучно включаем лампы от большей к меньшей:
040
if( isGo2 == 1 ){
041
042
// подветка 3.2.1 "текущая лампа уже включена? перейти к следующей" порядок обратный! "--"
043
if( fades[lamp2].bright == 255 ){
044
lamp2--;
045
}else{
046
// ветка "нет" 3.2.1: "добавлять яркость по isGo2, каждые WAIT_1 мсек"
047
fadeLED(lamp2, isGo2);
048
}
049
}
050
051
// Ветка 4.1 "Лампы для датчика1 - включили все"? Включаем паузу и переходим к ветке 5.1
052
if( isGo1 == 1 && lamp1 == max1 ) // мы включали лампы И прошли все?
053
{
054
// подветка "ДА" 4.1: "включаем паузу заново, переходим к ветке выключение1"
055
startedPause = millis(); // фиксируем начало отсчета паузы
056
isGo1 = -1; // .. после паузы будем выключать (5.1) - меняем направление яркости и шаг
057
lamp1= 0; // .. снова в порядке от меньшей к большей
058
max1 = MAX_LED;
059
}
060
061
// Ветка 4.2 "Лампы для датчика2 - включили все"? Включаем паузу и переходим к ветке 5.2
062
if( isGo2 == 1 && lamp2 == max2 ) // мы включали лампы И прошли все?
063
{
064
// подветка "ДА" 4.2: "включаем паузу заново, переходим к ветке выключение1"
065
startedPause = millis(); // фиксируем начало отсчета паузы
066
isGo2 = -1; // .. после паузы будем выключать - меняем направление и шаг
067
lamp2= MAX_LED-1; // .. снова в порядке от большей к меньшей
068
max2 = -1;
069
}
070
071
// Обе подветки ожидания выключения работают от одной паузы, фиксируем время тут:
072
curTime = millis();
073
074
// Ветка 5 "прошла пауза?"
075
if( curTime - startedPause >= WAIT_PAUSE )
076
{
077
// подветка 5.1 "Выключение ламп датчика1"
078
if(
079
(isGo1 == -1)
080
){
081
// Подветка 5.1.1 "Текущая лампа УЖЕ выключена?"
082
if( fades[lamp1].bright == 0 ){
083
lamp1++; // "ДА" переходим к следующей (к большей!):
084
}else{
085
fadeLED(lamp1, isGo1); // уменьшаем яркость на isGo1 каждые WAIT_1 мсек:
086
}
087
}
088
089
// Ветка 5.2 "Выключение ламп датчика2"
090
if(
091
(isGo2 == -1)
092
){
093
// Подветка 5.2.1 "Текущая лампа УЖЕ выключена?"
094
if( fades[lamp2].bright == 0 ){
095
lamp2--; // "ДА" переходим к следующей (к меньшей!):
096
}else{
097
fadeLED(lamp2, isGo2); // уменьшаем яркость на isGo2 каждые WAIT_1 мсек:
098
}
099
}
100
101
// Подветка 5.3 "Все лампы датчика1 выключены?"
102
if( isGo1 == -1 && lamp1 == max1 ){
103
isGo1 = 0; // .. ну и ладушки, всё погасло
104
}
105
106
// Подветка 5.4 "Все лампы датчика2 выключены?"
107
if( isGo2 == -1 && lamp2 == max2 ){
108
isGo2 = 0; // .. ну и ладушки, всё погасло.
109
}
110
} // конец ветки сработавшей паузы
Цитата:
То, что я вам написал сразу (теперь вижу, что поторопился), просто
есть "оптимизация" этой ДРАКОН-схемы. Можете обнаружить что значительная часть исполнения или повторяется почти одинаково или является дополнением else.
Рекомендую сравнить тот код, который у вас работал с одним датчиком и эту ДРАКОН-схему и самостоятельно найти КАК происходили преобразования.
Ну и тут видна уже "засада"
(вот он ДРАКОН!), а именно: Пауза задержки изменения яркости WAIT_1 считается в одном месте, а икон "Вставка" - 4шт! Соответственно, при одновременном попадании в ветки по isGo1 И isGo2 .. эта пауза будет срабатывать "не так как хотелось". Для каждого датчика надо иметь свою паузу. Это можно решить, если проверку паузы вынести изнутри fadeLED() в вызывающий код "обратно", оставив внутри функции только само изменение .. но можно пойти иным путем ..
Разбирайтесь пока с предыдущей программой, в части КАК были выполнены преобразования и свернута
ДРАКОН-схема для 1 датчика. Владимир Arhat109 показывает технологию работы с ДРАКОНом. Это очень хорошо.
Но есть и недостаток. Сама ДРАКОН-схема осталась за кадром. Она не показана. Ее нельзя увидеть. Это плохо.
Желательно вживую показать ДРАКОН-схему в формате png.
==========================
Впрочем, чуть дальше живые ДРАКОН-схемы все-таки появляются. И это хорошо.
В целом, Владимир Arhat109 показал себя как прекрасный педагог.