Выход arduino mega buzzer

arduino-mega input digital-in

У меня есть проект от Arduino mega , который имеет 22 входа и 22 выхода, а также кнопки сброса зуммера и сброса выхода, он имеет два состояния

  1. если вход высокий(не непрерывный), то выход будет включен и зуммер будет включен , если нажать кнопку сброса выхода, то выход будет выключен, если нажать кнопку сброса зуммера, то зуммер будет выключен.
  2. если вход всегда высокий (непрерывный высокий сигнал на входе ), то выход будет включен и зуммер будет включен, в этом случае мы не будем сбрасывать выход , даже если кнопка сброса выхода нажата, и мы сможем сбросить(выключить) зуммер кнопкой сброса зуммера, и дождитесь, пока входное состояние снова не изменится на высокое, чтобы повторить процедуру

помогите мне с редактированием моего кода


    //int input[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,23,24}; //входные контакты (23 для сброса ,24 для сброса зуммера)
//int output[] = {26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 24, 34, 44, 45, 46, 47, 48,49}; //выходные контакты (49 для зуммера)

int in1 =     2;  

int in25 =   26;// for output reset
int in26 =   27;// for buzzer reset

///////////////

int out1 = 28   ;

int out24= 51   ;
int out25= 52   ; // output for buzzer

////////////////////////////////////

int buttonState1 =  0;    

int buttonState24 =  0;    
int buttonState25 =  0; //for  reset
int buttonState26 =  0; //for buzzer reset

//unsigned long previousMillis = 0;        // будет хранить последнее обновление зуммера
//const long interval = 10000;           // интервал срабатывания зуммера (миллисекунды)
//int buzzerState = LOW;             // buzzerState используется для установки зуммера


void setup() {


  pinMode(in1 , INPUT);
 
  pinMode(in24 , INPUT);
  pinMode(in25 , INPUT);
  pinMode(in26 , INPUT);

///////////////////////////

pinMode(out1, OUTPUT);
pinMode(out2, OUTPUT);

pinMode(out24, OUTPUT);
pinMode(out25, OUTPUT);

digitalWrite(out25, LOW); // buzzer LOW

}

void loop() {
  buttonState1 = digitalRead(in1);
  if (buttonState1 == HIGH) {
    digitalWrite(out1, LOW);
    //digitalWrite(out25, LOW);
    //delay(10000);
    //digitalWrite(buzzer, LOW);
  }

  buttonState25 = digitalRead(in25); //считывание состояния кнопки сброса с входа (25) pin 26
  if (buttonState25 == HIGH )

  {
    digitalWrite(out1, HIGH); //reset out1
    //digitalWrite(buzzer, LOW);
  }
  
  //else {
   // buttonState26 = digitalRead(in26); //считывание состояния кнопки сброса зуммера с входного (26)контакта 27
   // if (buttonState26 == HIGH) {
    //  digitalWrite(out25, HIGH);

   // }
  //}

    //   while (digitalRead(input1) == HIGH);
    //digitalWrite(buzzerrelay, LOW);




    ////////////////////////////////////////////////////////////

 buttonState2 = digitalRead(in2);
  if (buttonState2 == HIGH) {
    digitalWrite(out2, LOW);
   // digitalWrite(out25, LOW);
    //delay(10000);
    //digitalWrite(buzzer, LOW);
  }

  buttonState25 = digitalRead(in25); //read reset button state
  if (buttonState25 == HIGH )

  {
    digitalWrite(out2, HIGH); //сброс выходного сигнала
    //digitalWrite(buzzer, LOW);
  }
  
 // else {
  //  buttonState26 = digitalRead(in26); //считывание состояния кнопки сброса зуммера
    //if (buttonState26 == HIGH) {
    //  digitalWrite(out25, HIGH);

    //}
 // }

    
   //////////////////////////////////////////////////////////////
     
 
  //  }
 // }


  
  }

, 👍1

Обсуждение

ваш код определенно слишком повторяющийся ... почему вы решили не использовать массивы, такие как первые две строки вашего кода, которые вы закомментировали? ... определенно проще использовать in [1], "in [2]" и т. Д., Потому что вы можете использовать цикл for" для доступа к переменным... вы не можете использовать цикл для in1, in2` и т. Д. таким образом, вы вынуждены повторять один и тот же код несколько раз, @jsotola

В чем проблема с вашим кодом? Разве это не работает? Если да, пожалуйста, объясните, чего вы ожидали и что он на самом деле делает, @chrisl

я пытался использовать массивы, но они не работали должным образом, потому что я новичок в Arduino и массивах, и теперь я сосредоточен на решении проблемы зуммера, @eng.hamza

он работает поставил часть зуммера не работает, проблема в том, что если вход спорный, то зуммер не может быть сброшен и все еще включен до тех пор, пока вход не станет низким, после этого я могу сбросить зуммер, @eng.hamza

Вы опубликовали более 850 строк кода. Нереально ожидать, что ваши читатели будут просматривать и публиковать предложения по такому большому количеству кода. Вам нужно упростить и сузить свой вопрос, а также предоставить небольшой пример проекта, который иллюстрирует то, с чем вы боретесь., @Duncan C

я упростил код;), @eng.hamza

пара вопросов ... в чем разница между непрерывным высоким входом и непрерывным высоким входом ................... re. # 2 если входной сигнал постоянно высок, то как вы можете "ждать, пока входное состояние снова не изменится на высокое`?, @jsotola


2 ответа


2

Каждый раз, когда одна и та же последовательность кода повторяется снова и снова с небольшими вариациями, это "запах кода" (признак того, что вы, возможно, используете неправильный подход).

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

Не пытайтесь решить подобную проблему, не изучив необходимые навыки и концепции. Ты сказал "...Я новичок в Arduino и массивах , и теперь я сосредоточен на решении проблемы зуммера". Это ошибка. Код, подобный тому, который вы опубликовали, трудно писать, трудно читать и гораздо труднее поддерживать.

,

0

Вот ваш упрощенный код. (непроверено)

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

Например, вы можете использовать цикл for (int i = 1; i < 25; i++), и первый входной вывод будет указан как i + 1, а первый выходной вывод-как i + 27.

// https://arduino.stackexchange.com/questions/80972/arduino-mega-buzzer-output

// int in25 = 26; // для сброса выходного сигнала
// int in26 = 27; // для сброса зуммера

// int out25 = 52 ; // выход для зуммера

// int buttonState25 = 0; // для сброса
// int buttonState26 = 0; // для сброса зуммера

// массивы индексируются нулем (первый элемент имеет нулевой индекс)
// индекс массива 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26

    int in [27] = {255,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27};   // входные контакты (26 для сброса, 27 для сброса зуммера)
    int out[26] = {255, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 24, 34, 44, 45, 46, 47, 48, 49, 50, 51, 52    };   // выходные контакты (52 для зуммера)

    int buttonState[27];
    
// unsigned long previousMillis = 0; // будет хранить последнее обновление зуммера
// const long interval = 10000; // интервал срабатывания зуммера (миллисекунды)
// int buzzerState = LOW; // buzzerState используется для установки зуммера

    
    void setup() {

      for (int i = 1; i < 27; i++) { buttonState[i] = 0;      }       // очистить состояния кнопок от 1 до 26
      for (int i = 1; i < 26; i++) { pinMode(out[i], OUTPUT); }       // настройка выходов от 1 до 25

      digitalWrite(out[25], LOW);                                     // низкий уровень зуммера

    }

    void loop() {

      for (int i = 1; i < 25; i++) {                                  // кнопки цикла от 1 до 24
        
        buttonState[i] = digitalRead(in[i]);

        if (buttonState[i] == HIGH) {
          digitalWrite(out[i], LOW);
// digitalWrite(out[25], LOW);
// delay(10000);
// digitalWrite(зуммер, НИЗКИЙ УРОВЕНЬ);
        }
     
        buttonState[25] = digitalRead(in[25]);       // считывание состояния кнопки сброса

        if (buttonState[25] == HIGH ) {
          digitalWrite(out[i], HIGH);                // сброс выходного сигнала
// digitalWrite(зуммер, НИЗКИЙ УРОВЕНЬ);
        }
     
// else {
// buttonState[26] = digitalRead(in[26]); // считывание состояния кнопки сброса зуммера
// if (buttonState[26] == HIGH) {
// digitalWrite(out[25], HIGH);
//        }
//      }
      }
    }
,