19

Помогите со скетчем в ардуино!

Добрый день граждане-товарищи сочувствующие и мимо проходящие. Пытаюсь сделать свет в курятнике, типа рассвет закат. Собрал платку на симисторе. Скетч из тырнета приладил. Само медленное угасание и зажигание проблем не вызывает.  А вот управление ни в голове ни в ардуино не видится. Т.Е. Мне надо чтобы при замыкании кнопки он начал цикл рассвет и продолжал гореть пока кнопка не разомкнется и начался цикл закат и до смены . Помогите хоть советом как реализовать . Сейчас после ресета он постоянно выполняет цикл тот или этот в зависимости от состояния кнопки в момент ресета. Понятно что без рейтинга ибо очень надо. Птицы, говорят мрут от резкого включения освещения. Также не понял как вставить код не вставляя код в пост поэтому.... Простите извините минусите.

Скетч вот:


int AC_LOAD = 3; // Выход для управления семистором

int ButPin = 9;

volatile int dimming = 128; // Уровень яркости (0-128) 0 = ON, 128 = OFF

void setup()

{

pinMode(AC_LOAD, OUTPUT); // Пин на выход

attachInterrupt(0, zero_crosss_int, RISING); // Установить прерывание при переходе сетевого напряжжения через "0"

}

void zero_crosss_int() // функцию, вызываемая при пересечении нуля, для регулировки яркостью

{

// Рассчет угла включения :: 50Hz-> 10ms (1/2 цикла)

// (10000us - 10us) / 128 = 75 (приблизительно)

int dimtime = (75*dimming);

delayMicroseconds(dimtime); // Период включенного состояния

digitalWrite(AC_LOAD, HIGH); // Включаем симистор

delayMicroseconds(20); // triac On propogation delay

digitalWrite(AC_LOAD, LOW); // Выключаем симистор

}

void loop()

{

if(digitalRead(ButPin) == HIGH)

{

dimming = 120;

delay(500);

dimming = 117;

delay(500);

dimming = 115;

delay(500);

dimming = 113;

delay(500);

dimming = 110;

delay(500);

dimming = 107;

delay(500);

dimming = 106;

delay(500);

dimming = 104;

delay(500);

dimming = 102;

delay(500);

dimming = 100;

delay(500);

dimming = 98;

delay(500);

dimming = 96;

delay(500);

dimming = 94;

delay(500);

dimming = 92;

delay(500);

dimming = 90;

delay(500);

dimming = 88;

delay(500);

dimming = 86;

delay(500);

dimming = 84;

delay(500);

dimming = 82;

delay(500);

dimming = 80;

delay(500);

dimming = 78;

delay(500);

dimming = 76;

delay(500);

dimming = 74;

delay(500);

dimming = 72;

delay(500);

dimming = 70;

delay(500);

dimming = 68;

delay(500);

dimming = 66;

delay(500);

dimming = 64;

delay(500);

dimming = 62;

delay(500);

dimming = 60;

delay(500);

dimming = 58;

delay(500);

dimming = 56;

delay(500);

dimming = 54;

delay(500);

dimming = 52;

delay(500);

dimming = 50;

delay(500);

dimming = 48;

delay(500);

dimming = 46;

delay(500);

dimming = 44;

delay(500);

dimming = 42;

delay(500);

dimming = 40;

delay(500);

dimming = 38;

delay(500);

dimming = 36;

delay(500);

dimming = 34;

delay(500);

dimming = 32;

delay(500);

dimming = 30;

delay(500);

dimming = 28;

delay(500);

dimming = 26;

delay(500);

}

else

{

dimming = 26;

delay(500);

dimming = 28;

delay(500);

dimming = 30;

delay(500);

dimming = 32;

delay(500);

dimming = 34;

delay(500);

dimming = 36;

delay(500);

dimming = 38;

delay(500);

dimming = 40;

delay(500);

dimming = 42;

delay(500);

dimming = 46;

delay(500);

dimming = 48;

delay(500);

dimming = 50;

delay(500);

dimming = 52;

delay(500);

dimming = 54;

delay(500);

dimming = 56;

delay(500);

dimming = 58;

delay(500);

dimming = 60;

delay(500);

dimming = 62;

delay(500);

dimming = 64;

delay(500);

dimming = 66;

delay(500);

dimming = 68;

delay(500);

dimming = 70;

delay(500);

dimming = 72;

delay(500);

dimming = 74;

delay(500);

dimming = 76;

delay(500);

dimming = 78;

delay(500);

dimming = 80;

delay(500);

dimming = 82;

delay(500);

dimming = 84;

delay(500);

dimming = 86;

delay(500);

dimming = 88;

delay(500);

dimming = 90;

delay(500);

dimming = 92;

delay(500);

dimming = 94;

delay(500);

dimming = 96;

delay(500);

dimming = 98;

delay(500);

dimming = 100;

delay(500);

dimming = 102;

delay(500);

dimming = 103;

delay(500);

dimming = 104;

delay(500);

dimming = 106;

delay(500);

dimming = 108;

delay(500);

dimming = 112;

delay(500);

dimming = 118;

delay(500);

dimming = 122;

delay(500);

dimming = 126;

delay(500);

dimming = 128;

delay(500);

}

}

Arduino & Pi

1.5K поста20.8K подписчика

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

1
Автор поста оценил этот комментарий

https://pastebin.com/j1jEqPj5 код конечно убогий, особенно устранение дребезжания контактов, но мне лень напрягаться.

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Жду реквизиты для отправки 10% от стоимости проекта to alexs963

0
Автор поста оценил этот комментарий

Можешь еще такой код попробовать https://pastebin.com/dxRE6S4D

он не должен блокировать МК постоянно, так что можно еще задач на него навешать.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Предыдущий скетч вполне приемлемо работает и устройство уже радует перепелов.  Вы благодарность будете принимать? Или ограничимся спасибо за помощь и по кругу типа помоги другому потом?

показать ответы
1
Автор поста оценил этот комментарий

у меня так sonoff через IFTTT работает свет во дворе включает.   очень удобно

5
Автор поста оценил этот комментарий

Какой индусский код...
dimming = 26;

delay(500);

=>
(в цикл)
for i=26 to 128 step 2 do // i = 128 downto 26 step 2

begin

dimming = i;
delay(500);
end
endfor



Поставьте генератор (из схемы часов любых) и вообще по времени включайте/выключайте.
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Я похоже вообще не вдупляю. Это оптимизация кода? Но не решение. За решение могу отблагодарить (не сочтите за грубость) мне тоже кажется, что Я иногда индус. 

показать ответы
Автор поста оценил этот комментарий

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

Нажимаем кнопку. Начинается закат. При этом пока цикл закат не закончится, реакции на изменение состояния кнопки отсутствует. 

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Причем я увеличил delay до 1200 и шаг уменьшил до  "1". закат рассвет длится 5 минут

0
Автор поста оценил этот комментарий

Не компилируется. Ругается на 46 строку

Exit status

'i' was not declared in this scope

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Нашел! переменная int не была объявлена

0
Автор поста оценил этот комментарий

С этим все просто 220 вольт через резисторы и диодный мост приходит на оптопару pc817. Ну а так уже садит на землю пин 50 раз в секунду

показать ответы
1
Автор поста оценил этот комментарий

https://pastebin.com/j1jEqPj5 код конечно убогий, особенно устранение дребезжания контактов, но мне лень напрягаться.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Не компилируется. Ругается на 46 строку

Exit status

'i' was not declared in this scope

показать ответы
0
Автор поста оценил этот комментарий

кнопку на прерывание, резисторы подтяжки шоб наводку убрать, дребезг кнопки програмно отсечь.
ШИМ проще через analogWrite сделать
У вас возможно внешнее прерывание 0 на втором порту ловит помеху и срабатывает как хочет
зачем использовать if(digitalRead(ButPin) == HIGH) если уже используете прерывание?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Резисторы подтяжки стоят. Кнопка в данном предприятии это реле времени

5
Автор поста оценил этот комментарий

Какой индусский код...
dimming = 26;

delay(500);

=>
(в цикл)
for i=26 to 128 step 2 do // i = 128 downto 26 step 2

begin

dimming = i;
delay(500);
end
endfor



Поставьте генератор (из схемы часов любых) и вообще по времени включайте/выключайте.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Генератор поставить не могу. Там стоит реле времени на дин рейке. Им хозяева умеют менять время дня и ночи в зависимости от сезона

показать ответы
0
Автор поста оценил этот комментарий
Там нету постоянно включённого состояния

Читаем запрос внимательно:

Мне надо чтобы при замыкании кнопки он начал цикл рассвет и продолжал гореть пока кнопка не разомкнется и начался цикл закат и до смены

----------

Там четыре цикла должно быть

Достаточно одного цикла, что я и предложил.

---------

Вопросу два дня, спорить по нему смысла нет, так как ТС улетел в закат. Спорить "а как лучше сделать" тоже особо смысла нет, т.к. проблема по типу fizzbuzz.

раскрыть ветку (1)
Автор поста оценил этот комментарий

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

Нажимаем кнопку. Начинается закат. При этом пока цикл закат не закончится, реакции на изменение состояния кнопки отсутствует. 

показать ответы
0
Автор поста оценил этот комментарий

Генератор поставить не могу. Там стоит реле времени на дин рейке. Им хозяева умеют менять время дня и ночи в зависимости от сезона

раскрыть ветку (1)
Автор поста оценил этот комментарий

И времени нет на приобретение материалов дополнительных

показать ответы
2
Автор поста оценил этот комментарий
Сейчас код не имеет dimming и delay.

Телепаты, которые смогут угадать как сейчас код выглядит - в отпуске.


Подключите к ардуино часы и считайте яркость по времени суток. Есть часовые и сетевые модули.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Вот зачем так? Alexs963 предложил мне готовое решение ввиде ссылки на код. И он идеально подошел.  Только тайминги поменял. Все работает.  Rtc прокручивать нет смысла,  потому что реле времени уже есть и самое главное, хозяин умеет им управлять. И он иногда хочет менять время закатов рассветов.  15 лет работы с частными лицами научили меня, что нужно делать не так как лучше и прогрессивней, а так как удобно клиенту.

показать ответы
2
Автор поста оценил этот комментарий

Вы мой комментарий прочли? Почитайте. Для вас писалось.


А реакции у вас нет из-за того, что вы пошаговое изменения в яроксти не запихнулись в цикл, и там нет проверок что состояние кнопки изменилось.


Как только программа зайдёт вот в это безобразие:


dimming = 120;
delay(500);
dimming = 117;
delay(500);
Она не будет реагировать на ваши действия, пока не закончит выполнять всё, что было в ветке. Что занимает вроде как 30 секунд.


Код выполняется строчка за строчкой. У вас каждой второй строчкой идёт "спать пол секунды", и нет ни одной проверки кнопки.


Конечно, не будет реагировать.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Сейчас код не имеет dimming и delay.  Реакция на кнопку и не нужна. Так как солнце, оно такое,  ничто не может ему помешать вставать и садиться).   Между циклами проходит 10 часов и нет необходимости их прерывать.

показать ответы