Помогите написать скетч

Привествую.
Ардуиной занимался лет 6-7 назад, дальше мигалок и простого управления моторчиками дело не зашло…естественно всё наглухо забыл. Но тут товарищ подкинул задачу, имеется 4 двери, на них 4 геркона(возможно они и не понадобятся) и 4 электрозамка. Есть 4 кнопки. Нужно, чтобы при нажатии кнопки открывался только один замок, а остальные в это время оставались закрытыми(остальные кнопки не должны быть активными). Есть ардуино уно и релейный шилд.
Попытался сам склепать скетч, но наглухо всё забыл. Получается по первой кнопке в скетче всё работает как надо, а при нажатии второй и последующих все предыдущие остаются активными.
Скетч пока подгрузить не смогу - комп на котором его делал на работе.

Вот только выдумывать не надо. Ты не “попытался сам”, а разместил заказ на Гайверфоруме, где уже дня три-четыре ведешь переговоры. Ну так и продолжал бы там же… а строить из себя новичка не надо.

Ну “заказчики”… за 300 руб удавится готовы.

Да на гайверфоруме тоже размещал заказ. Просто на туда написал, нужно в помощь, а я в заказ написал.

так от нас что хочешь? Помощи - выкладывай скетч

Ничего не понял. 4 замка, 4 кнопки, ну и … ардуина-то зачем? Каждая кнопка подаёт 12В (или сколько там замку надо) на свою дверь. Бинго! Нет?

Вечно вы находите оптимальное решение, а ардуину куда приткнуть чтобы бабосиков заработать?

2 лайка

Я так понял, основное - чтобы при срабатывании одного любого канала остальные блокировались.

В условии - невозможность открыть другие двери, пока активен замок на любой из них.

ардуина и шилд мои личные…отдаю бесплатно!!! как раз таки в полном отсутствии бюджета проблема. Есть вариант этой схемы на транзисторе(чтоб герконы не палить ) и рэс 22(позволяют блокировать как раз таки три другие цепи, при работе одной основной) . Но в наличии есть либо ардуина, либо сигнал 20м(этот вариант тоже отпал, тоже нет блокировки, до момента сработки геркона)

Оказываю помощь: излагаю алгоритм работы.

  • опрашиваются кнопки,
  • если какая-либо нажата, открывается соответствующая дверь и программа останавливается (while(1);).
int regim=1;
 int flag=0;
int button1 = 2;
int led1 = 8;
int button2 = 3;
int led2 = 9;
int button3 = 4;
int led3 = 10;
int button4 = 5;
int led4 = 11;
void setup() {
pinMode(led1, OUTPUT);
pinMode(button1, INPUT);
pinMode(led2, OUTPUT);
pinMode(button2, INPUT);
pinMode(led3, OUTPUT);
pinMode(button3, INPUT);
pinMode(led3, OUTPUT);
pinMode(button3, INPUT);
}
void loop(){
 if(digitalRead(2)==HIGH&&flag==0)//1 кн
  {
regim=1;  
flag=1;
if(digitalRead(3)==HIGH&&flag==0)//2кн
  {
regim=2;  
flag=1;
if(digitalRead(4)==HIGH&&flag==0)//3кн
  {
regim=3;  
flag=1;
if(digitalRead(5)==HIGH&&flag==0)//4кн
  {
regim=4;  
flag=1;
}
if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
flag=0;
}
if(regim==1)//первый режим
{
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
}
if(regim==2)//второй режим
{
digitalWrite(1,LOW);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
}
if(regim==3)//третий режим
{
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
}
if(regim==4)
{
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
}
}
``` симулятор ругается, что нет скобки конца кода...сейчас все 4 кнопки и реле(светодиоды пока) прописал
int regim=1;
 int flag=0;
int button1 = 2;
int led1 = 8;
int button2 = 3;
int led2 = 9;
int button3 = 4;
int led3 = 10;
int button4 = 5;
int led4 = 11;
void setup() {
pinMode(led1, OUTPUT);
pinMode(button1, INPUT);
pinMode(led2, OUTPUT);
pinMode(button2, INPUT);
pinMode(led3, OUTPUT);
pinMode(button3, INPUT);
pinMode(led3, OUTPUT);
pinMode(button3, INPUT);
}
void loop(){
 if(digitalRead(2)==HIGH&&flag==0)//1 кн
{
regim=1;  
flag=1;
if(digitalRead(3)==HIGH&&flag==0)//2кн
regim=2;  
flag=1;
if(digitalRead(4)==HIGH&&flag==0)//3кн
regim=3;  
flag=1;
if(digitalRead(5)==HIGH&&flag==0)//4кн
regim=4;  
flag=1;
if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
flag=0;
}
if(regim==1)//первый режим
{
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
}
if(regim==2)//второй режим
{
digitalWrite(1,LOW);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
}
if(regim==3)//третий режим
{
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
}
if(regim==4)
{
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
}
}

а если вот так закончить скетч?

        if (regim == 4)
        {
          digitalWrite(1, LOW);
          digitalWrite(2, LOW);
          digitalWrite(3, LOW);
          digitalWrite(4, HIGH);
        }
      }
    }
  }
}
 

Тема перенесена в песочницу

int regim=1;
 int flag=0;
int button1 = 2;
int led1 = 8;
int button2 = 3;
int led2 = 9;
int button3 = 4;
int led3 = 10;
int button4 = 5;
int led4 = 11;
void setup() {
pinMode(led1, OUTPUT);
pinMode(button1, INPUT);
pinMode(led2, OUTPUT);
pinMode(button2, INPUT);
pinMode(led3, OUTPUT);
pinMode(button3, INPUT);
pinMode(led3, OUTPUT);
pinMode(button3, INPUT);
}
void loop(){
 if(digitalRead(2)==HIGH&&flag==0)//1 кн
{
regim=1;  
flag=1;
if(digitalRead(3)==HIGH&&flag==0)//2кн
regim=2;  
flag=1;
if(digitalRead(4)==HIGH&&flag==0)//3кн
regim=3;  
flag=1;
if(digitalRead(5)==HIGH&&flag==0)//4кн
regim=4;  
flag=1;
if(digitalRead(1)==LOW&&flag==1)
if(digitalRead(2)==LOW&&flag==1)
if(digitalRead(3)==LOW&&flag==1)
if(digitalRead(4)==LOW&&flag==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
flag=0;
}
if(regim==1)//первый режим
{
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
}
if(regim==2)//второй режим
{
digitalWrite(1,LOW);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
}
if(regim==3)//третий режим
{
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
}
if(regim==4)
{
digitalWrite(1,LOW);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
}
}Код грузится в ардуино...но вообще не работает=(

Скажи честно, зачем ты объявляешь переменные в начале скетча, но потом их нигде не используешь?

1 лайк

И зачем писать значения во входы?

Кроме кнопок нужны еще датчики открытия двери, a то можно будет кнопку отпустить, а дверь оставить приоткрытой

еще бы, бредятина написана

Держите, проверяйте

byte button[] = {2, 3, 4, 5};
byte led[] = {8, 9, 10, 11};

void setup() {
  for (byte i = 0; i < 4; i++) {
    pinMode(led[i], OUTPUT);
    pinMode(button[i], INPUT);
  }
}

void loop() {
  byte result[4] = {0};
  byte summ = 0;
  for (byte i = 0; i < 4; i++) {
    result[i] = digitalRead(button[i]);
    summ += result[i];
  }
  if (summ == 1)  {
    for (byte i = 0; i < 4; i++) digitalWrite(led[i], button[i]);
  }
  else {
    for (byte i = 0; i < 4; i++) digitalWrite(led[i], LOW);
  }
  delay(1000);
}

симулятор выдаёт сработку всех выходов по одной кнопке и отключение по другой