В общем задача такая: Есть 2 датчика (геркона) “Верхний аварийный уровень” и “Нижний аварийный уровень”. Два реле имитирующие кнопки соответственно включения и отключения. Надо чтобы по приходе сигнала на датчик единожды срабатывало реле на заданное время и отключалось. Вот что я наваял но в итоге получается последовательное переключение реле несмотря на сигнал. Помогите пожалуйста.
int VAU = 2;
int NAU = 4;
int VKL = 3;
int VYKL = 5;
bool St;
bool Sto;
void setup() {
pinMode (VAU,INPUT_PULLUP);
pinMode (NAU,INPUT_PULLUP);
pinMode(VKL,OUTPUT);
pinMode(VYKL,OUTPUT);
St = 0;
Sto = 0;
}
void loop() {
if (digitalRead(VAU) == HIGH)
{
St = 1;
St = 0;
}
else
{
St = 0;
}
if ((St) = 1);
{
Start();
}
if (digitalRead(NAU) == LOW)
{
Sto = 1;
}
else
{
Sto = 0;
}
if ((Sto) = 1)
{
Stop ();
Sto = 0;
}
}
void Start (){
digitalWrite (VKL,HIGH);
delay(3000);
digitalWrite(VKL,LOW);
}
void Stop (){
digitalWrite (VYKL,HIGH);
delay(3000);
digitalWrite(VYKL,LOW);
}
// программа обеспечивает управление насосом для подкачки в расходный бак, по включению датчика верхнего уровня насос отключается ( бак наполнен)
// при отключении датчика нижнего уровня, насос включается (достигнут нижний уровень)
// время наполнния/расходования бака много больше времени включения/ отключения ( 3 секунды)
// насос остается во включенном / отключенном состоянии после снятия сигналов VKL /VYKL (в шкафу управления насосом есть контактор с самоболкировкой во включенном/ отключенном состоянии)
#define VAU 2
#define NAU 4
#define VKL 3
#define VYKL 5
bool pumpWork;
void setup() {
pinMode (VAU, INPUT_PULLUP);
pinMode (NAU, INPUT_PULLUP);
pinMode(VKL, OUTPUT);
pinMode(VYKL, OUTPUT);
digitalWrite(VKL, LOW);
digitalWrite(VYKL, LOW);
pumpWork = false; // нужна переменная для хранения состояния насоса , чтоб его не включать/ выключать постоянно
}
void loop() {
if ( (digitalRead(VAU) == HIGH) && ( pumpWork ) ) // если верхний уровень и насос не остановлен, то останавливаем
{
Stop();
pumpWork = false;
}
if ( (digitalRead(NAU) == LOW) && ( !pumpWork ) ) // если разомкнулся уже и геркон нижнего уровня ( пройден нижний уровень), а насос не запущен, то включаем
{
Start();
pumpWork = true;
}
delay(1000); // ну можно и молотить непрерывно убрав задержку
}
void Start () {
digitalWrite (VKL, HIGH);
delay(3000);
digitalWrite(VKL, LOW);
}
void Stop () {
digitalWrite (VYKL, HIGH);
delay(3000);
digitalWrite(VYKL, LOW);
}
Во-первых, не слишком хорошая услуга для спрашивающего давать ему готовый код. Для новичка гораздо полезнее было бы найти и исправить ошибки в СВОЕМ коде.
Хотя я понимаю, каждый помогает|, как считает нужным.
Важнее другое - вы выкладываете свой код не по правилам форума, без тегов и номеров строк. Как его обсуждать? Для человека, ПОМОГАЮЩЕГО новичку - то есть предположительно более грамотного - это просто неприлично.
Пожалуйста, вернитесь обратно в свое сообщение и отредактируйте его. Или удалите неправильное и вставьте новое.
На какой датчик? Их два.
Старт и стоп одинаковые подпрограммы. Зачем две?
Если два датчика то по одному логично включать по второму выключать. И так же выключать через 3 минуты, если раньше не выключилось по верхнему датчику, для защиты.
Всем большое спасибо. Теперь работает как надо! Прошу меня простить, просто я новичек. Все замечания на будущее учту. Просто я бился с этим кодом 2 недели и по ночам тоже. Перелапатил все что возможно. Скорее всего навыков не хватает пока подстроить программу под себя. Еще раз СПАСИБО!
Я бы посоветовал вам подучить С. Например есть сайт Метанит, там кратко справочно есть по С и С++. Хотя плюсы вас пока не должны волновать. Далее надо найти какой то курс по С , например на степике и пройти его. Главное чтоб там были автоматически проверяемые задачи, ну например https://stepik.org/course/3078/promo
Что касается конкретно Ардуино и систем автоматики. Системы автоматики часто строятся как конечные автоматы ( желательно посмотреть какую то старую книжку на тему конечных автоматов, теория особая вам не нужна). Конечные автоматы имеют внутренние состояния меняющиеся по какому-то закону/алгоритму от внешних сигналов. В вашем случае такое состояние - режим насоса pumpWork- он работает или остановлен. В зависимости от внешних сигналов и состояния насоса с ним нужно делать действия ( например - включить). Наличие состояния позволяет выполнять цепочки последовательных действий в которых переход на следующий шаг ( и выбор самого шага) зависит от сигналов внешних датчиков. В тоже время не выполняются глупые действия, например зачем каждый цикл отключать насос, если он уже и так выключен.
Такое впечатление, что интуитивно вы почувствовали, необходимость иметь память о предыдущих событиях - это фактически и есть внутренне состояние конечного автомата. Понавводили переменных, ну дальше… мучительные 2 недели. Если хотите расти в этой области - расширяйте кругозор, учитесь. И начните с принципов работы систем аналоговой и дискретной автоматики.
Если моя программа вам помогла - поставьте лайк под сообщением