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 запрещен)

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

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

Вы смотрите срез комментариев. Показать все
20
Автор поста оценил этот комментарий
Мне надо чтобы при замыкании кнопки он начал цикл рассвет и продолжал гореть пока кнопка не разомкнется и начался цикл закат и до смены .

1. Текущая яркость = 0

2. Желаемая яркость = 0.

3. Шаг = позитивное число на ваш выбор.

3. Повторяем вечно:

3.0 Начало цикла

3.1. Отправляем текущую яркость в лампочку.

3.2. Если кнопка нажата, желаемая яркость = 128. Иначе желаемая яркость = 0.

3.3. Если желаемая яркость больше текущей, увеличиваем текущую яркость на шаг. Если после этого текущая яркость больше желаемой, то текущая яркость = желаемая яркость.

3.4. Если желаемая яркость меньше текущей, уменьшаем текущую яркость на шаг. Если после этого текущая яркость меньше желаемой, то текущая яркость = желаемая ярокость.

3.5. Спим несколько миллисекунд.

3.6. Конец блока цикла. Возврат к пункту 3.

-----


А ещё. Вот за это в нашем деле бьют и увольняют с позором.


dimming = 26;
delay(500);
dimming = 28;
delay(500);
dimming = 30;
Такое ВСЕГДА делается циклом.

раскрыть ветку (12)
Автор поста оценил этот комментарий
Там нету постоянно включённого состояния, со считыванием условия, и постоянно выключенного. Там четыре цикла должно быть { /} {|||} {\} {...}это рисунок
Do{петля кода} while(проверка условий)
и дребезг контакта считывания условия, устраняется с помощью конденсатора и резистора.
P. S. Сам не очень-то умный.
раскрыть ветку (10)
0
Автор поста оценил этот комментарий
Там нету постоянно включённого состояния

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

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

----------

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

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

---------

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

раскрыть ветку (9)
1
Автор поста оценил этот комментарий
Я не претендую, да и я не вам это хотел рассказать. Т.к. не прффесионал.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ок, понял.


ЗЫ. Подумал и вспомнил, что автор поста получает уведомления о всех комментариях, а не только корневых.

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

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

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

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

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


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


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


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


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


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

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

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

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

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


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

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

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

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

Вы либо решили проблему, либо нет.


Если решили, какой смысл дальше о ней спорить?


А, и за 15 лет желательно было научиться программировать. Хоть чуть чуть.

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

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

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

Сейчас после ресета он постоянно выполняет цикл тот или этот в зависимости от состояния кнопки в момент ресета.


setup()
{
// твой код

char x = digitalRead(ButPin);
while(x == digitalRead(ButPin))
{
// ждем изменения состояния кнопки
}
}//конец setup

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку