Не знаю где ошибка, должен инвертироваться выход, но этого не происходит


#define button1 7 // кнопка1
#define button2 9 // кнопка2
#define button3 8 // кнопка3
#define relay1 3 // реле1
#define relay2 5  // реле2
#define relay3 6  // реле3
shButton btn1(button1);
shButton btn2(button2);
shButton btn3 (button3);

void setup()
{
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);\
   pinMode(relay3, OUTPUT);
}

void loop()
{
  switch (btn1.getButtonState())
  {
    case BTN_DOWN:
      digitalWrite(relay1, HIGH);
      break;
  }
  switch (btn2.getButtonState())
  {
    case BTN_DOWN:
      digitalWrite(relay1, HIGH);
   
     break;
    case BTN_UP:
      digitalWrite(relay1, LOW);
      break;
  switch (btn3.getButtonState())
{
  case BTN_DOWN:
    digitalWrite(relay3, !digitalRead(relay3));
    break;
}
  }
 }

При нажатии кнопки1 выключается реле1 ( в моем случае транзистор1) но при этом не включается при повторном нажатии. Что делать не знаю( Все тоже самое с остальными двумя, 0 изменений

В какой строчке оно включаться должно?

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

1 лайк

Честно говоря не знаю, это честно украденный код из под старого ютуб видоса, но парадокс в том что у автора это работало именно так как я описал,а у меня нет( Я минимально понимаю, но моего понимания хватило лишь на адаптацию и добавление 3 кнопки и реле

Понимания не хватило. Вы изначальную программу запускали? Работает?

Обманул автор наивного зрителя. Ничерта оно работать не должно так, как описывается.

а может подскажете как сделать что бы работало как описывается? :slight_smile:

Два варианта:

  1. Изучить язык си.
  2. Сходить в раздел возмездных услуг.
2 лайка

Могу подсказать: строка #38 инвертирует выход, а остальные - нет.

Судя по коду при нажатии первой кнопки реле 1 выключается (если HIGH - это выключение), других действий не предусмотрено, вторая кнопка - при нажатии реле 1 выключается, а при отпускании включается, и только третья кнопка при каждом клике меняет состояние реле 3. Реле 2 вообще ни чем не управляется. Как написано, так и работает

Не, думаю, что это ТС так “адаптировал” :slightly_smiling_face:

Что-то подсказывает мне что и 3-е реле не работает толком как надо, а при каждом отпускании кнопки встаёт в некое Случайное состояние.
Ибо Др-р-ребезг

что за некрофил?
алигер проснулся, али еще кто?

2 лайка

Не я новый.
Не поверишь за неделю вижу уже третий раз такой нерабочий код.
А перфекционизм внутря не любит не закрытые темы с примитивными задачками.

Похожую задачу когда-то решал кодом

#define G1 5  // button on 5
#define G2 6  // button on 6
#define G3 7  // button on 7
#define G4 8  // button on 8

#define TLED1 A0  // Led on A0
#define TLED2 A1  // Led on A1
#define TLED3 A2  // Led on A2
#define TLED4 A3  // Led on A3

boolean Sens1 = LOW;
boolean Sens2 = LOW;
boolean Sens3 = LOW;
boolean Sens4 = LOW;

boolean door1_closed = true; //false
boolean door2_closed = true; //true
boolean door3_closed = true; //true
boolean door4_closed = true; //true

void setup() {
  pinMode(G1, INPUT_PULLUP);
  pinMode(G2, INPUT_PULLUP);
  pinMode(G3, INPUT_PULLUP);
  pinMode(G4, INPUT_PULLUP);
  
  pinMode(TLED1, OUTPUT);
  digitalWrite(TLED1, LOW);  
  pinMode(TLED4, OUTPUT);
  digitalWrite(TLED4, LOW);
  pinMode(TLED2, OUTPUT);
  digitalWrite(TLED2, LOW);  
  pinMode(TLED3, OUTPUT);
  digitalWrite(TLED3, LOW);
}

// the loop routine runs over and over again forever:
void loop() {
  Sens1 = digitalRead(G1);  // Читаем состояние каждого
  Sens2 = digitalRead(G2);
  Sens3 = digitalRead(G3);
  Sens4 = digitalRead(G4);

  if (Sens1 == HIGH){
    if (door1_closed == true){
      digitalWrite(TLED1, HIGH);
      door1_closed = false;   
      // do some job
      delay(1000);
      digitalWrite(TLED1, LOW); 
    }      
  }else{
    if (door1_closed == false){
      door1_closed = true;
    }
  }

  if (Sens2 == HIGH){
    if (door2_closed == true){ 
      digitalWrite(TLED2, HIGH);
      door2_closed = false; 
      // do some job    
      delay(1000);
      digitalWrite(TLED2, LOW);
    }      
  }else{
    if (door2_closed == false){
      door2_closed = true; 
    }
  }
 
  if (Sens3 == HIGH){
    if (door3_closed == true){
      digitalWrite(TLED3, HIGH);   
      door3_closed = false;  
      // do some job       
      delay(1000);
      digitalWrite(TLED3, LOW); 
    }      
  }else{
    if (door3_closed == false){ 
      door3_closed = true;
    }
  }
 
  if (Sens4 == HIGH){
    if (door4_closed == true){ 
      digitalWrite(TLED4, HIGH); 
      door4_closed = false;  
      // do some job       
      delay(1000);
      digitalWrite(TLED4, LOW); 
    }      
  }else{
    if (door4_closed == false){
      door4_closed = true;
    }
  }
delay(100);
}

Примитивщина, но может сгодится ещё кому

А если сенсоров будет 20 - будет 20 одинаковых блоков кода?

очень похоже.
Мне сразу что-то подобное примерещилось.

слушайте, а нет возможности добавить, обладающим неким уровнем, просмотр ипишника(ов) пользователя в профиле?
я понимаю, в век VPN и прочих инструментов мало эффективно, но все же.

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

По теме был задан простейший вопрос, о путанице с инверсией бинарного состояния, 3х кнопок.

Можно это написать и через !предыдущего значения
Но мой опыт показывает, что подобная запись не очевидна и плохо читаема новичками

В то же время в моих запасах нашёлся подходящий легко читаемый и понимаемый образец, на 4ре кнопки.
Не знаю как вам, но от меня не убудет поделиться, авось ещё кого занесёт, в тему посмотреть как подобное решается.

Кроме длинны записей ещё претензии к коду есть?

А смысл? Увидев IP, даже если он у него “белый” (вероятность доли процента) - ты узнаешь за ним кого-то знакомого? Ты все их IP знаешь наизусть?
А далее - даже если ты доказал, что это Алегир - и что???

Думаю, в ближайшие сутки и так все станет ясно. Люди типа Алегира молчать не умеют, им всегда есть что сказать - так что он очень быстро достигнет своего “уровня некомпетентности” и с шумом сядет в лужу.

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