Два геркона в двух направлениях

Привет, я студент, у меня проблемы с программированием. Я хочу установить два геркона в двух направлениях. Пример: 1. Герконовый переключатель 1 обнаруживает, затем герконовый переключатель 2 обнаруживает — светодиод становится желтым. 2. Если сначала обнаруживается геркон 2, а затем обнаруживается геркон 1 - светодиод становится красным Он должен играть в последовательной форме. Можете помочь мне в кодировании? До сих пор я сделал это..

const int REED_PIN1 = 2; // Вывод, подключенный к геркону const int REED_PIN2 = 3; // Контакт, подключенный к геркону

const int RED = 9; // вывод светодиода — активный-высокий const int GREEN = 10; // вывод светодиода — активный-высокий const int YELLOW = 11; // вывод светодиода - активный-высокий

int up = 0; int down = 0;

void setup() { Serial.begin(9600); // Так как другой конец геркона соединен с землей, нам нужно // подтянуть штифт геркона внутри. pinMode (REED_PIN1, INPUT_PULLUP); pinMode (REED_PIN2, INPUT_PULLUP);

pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(YELLOW, OUTPUT);

digitalWrite(RED, LOW);
digitalWrite(GREEN, HIGH);
digitalWrite(YELLOW, LOW);
}

void loop() { int proximity1 = digitalRead(REED_PIN1); // Чтение состояния переключателя int Proximity2 = digitalRead(REED_PIN2); // Читаем состояние переключателя while (proximity1 == LOW) // Если на выводе низкий уровень, переключатель замкнут. {

up  = up  + 1;
Serial.print(up);
Serial.print("        ");
Serial.println(down);

if(down < 1){
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, LOW);

delay(1000);
}

else {
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, LOW);

delay(1000);
}
} while (proximity2 == LOW) // Если на выводе низкий уровень, переключатель замкнут. { вверх = вверх - 1; Serial.print (вверх); Серийный.принт(" "); Serial.println (вниз); if(up < 1 && down < 1){ digitalWrite(RED, LOW); цифровая запись (ЗЕЛЕНЫЙ, НИЗКИЙ); digitalWrite (ЖЕЛТЫЙ, ВЫСОКИЙ);

delay(3000);      }
else{
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, LOW);

delay(1000);
}
} while (proximity2 == LOW) // Если на выводе низкий уровень, переключатель замкнут. {вниз = вниз + 1; Serial.print (вверх); Серийный.принт(" "); Serial.println (вниз);

if(up > 1){
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, HIGH);

delay(1000);
}

else {
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, LOW);

delay(1000);
}
delay(1000);
}
while (proximity1 == LOW) ;// Если на выводе низкий уровень, переключатель замкнут. { вниз = вниз - 1; Serial.print (вверх); Серийный.принт(" "); Serial.println (вниз); if(up < 1 && down > 1){ digitalWrite(RED, HIGH); цифровая запись (ЗЕЛЕНЫЙ, НИЗКИЙ); цифровая запись (ЖЕЛТЫЙ, НИЗКИЙ);

delay(5000);      }
else{
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, LOW);
delay(5000);} } }

, 👍0

Обсуждение

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

Ваш код - беспорядок. Мало того, что он плохо отформатирован, но из-за того, что он плохо отформатирован, вы потеряли все следы своих скобок, и теперь он повсюду. Половина кода больше не находится в функции., @Majenko

Я думаю, вы не понимаете, как пишутся циклы while на C/C++. Вы можете погуглить, чтобы исправить эту часть кода. Я почти уверен, что ваш текущий код вызовет ошибки компиляции. Вы можете использовать их, чтобы исправить самые неотложные проблемы с кодом. Я начал с паттерна «Что-нибудь закодируй, скомпилируй, исправь ошибки, скомпилируй снова, повторяй до тех пор, пока ошибок не будет»., @chrisl


2 ответа


1

Извините, но ваш код — полная ерунда. Следующий код дает вам пример. На данный момент у меня нет доступа к компилятору, поэтому могут быть синтаксические ошибки, и он полностью не проверен. Кроме того, вы не дали полного описания вещей, которые вы хотите сделать. например, когда включать зеленый светодиод или для чего нужны переменные вверх и вниз.

Кроме того, могут быть проблемы со временем. Чтобы не пропустить изменение состояния язычка, вам следует избегать добавления delay и медленных последовательных распечаток.

Я почти уверен, что сделал вашу домашнюю работу. Поэтому мой совет — изучите программирование и постарайтесь понять. Домашнее задание было (только ;-)) придумано не для того, чтобы доставлять удовольствие учителю, они помогают вам с тестами. ;-)

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

const int REED_PIN1 = 2; 
const int REED_PIN2 = 3; 

// контакты светодиода - активный-высокий
const int RED    =  9; 
const int GREEN  = 10;
const int YELLOW = 11;

int fixedState1 = HIGH; 
int fixedState2 = HIGH; 

void setup() 
{ 
   // Если на выводе низкий уровень, переключатель замкнут.
   pinMode(REED_PIN1, INPUT_PULLUP); 
   pinMode(REED_PIN2, INPUT_PULLUP);

   pinMode(RED, OUTPUT); 
   pinMode(GREEN, OUTPUT); 
   pinMode(YELLOW, OUTPUT);

   digitalWrite(RED, LOW);
   digitalWrite(GREEN, HIGH);
   digitalWrite(YELLOW, LOW);
}

void loop() 
{ 
  // ПОКА ОБА ВЫКЛЮЧАТЕЛЯ ВКЛЮЧЕНЫ ОДНОВРЕМЕННО,
  // ПРОГРАММА ВЫРЫВАЕТСЯ ;-)
  int reedState1 = digitalRead( REED_PIN1 ); 
  int reedState2 = digitalRead( REED_PIN2 ); 

  if ( readState1 == LOW && fixedState1 == HIGH )  
  {
    if ( fixedState2 == LOW )
    {
      digitalWrite( RED,    HIGH );
      digitalWrite( YELLOW, LOW  );
      digitalWrite( GREEN,  LOW  );

      fixedState2 = HIGH; 
    }
    else
    {
      // настройка зеленого светодиода — это всего лишь предположение
      digitalWrite( RED,    LOW  );
      digitalWrite( YELLOW, LOW  );
      digitalWrite( GREEN,  HIGH );

      fixedState1 = LOW; 
    }
  }

  if ( readState2 == LOW && fixedState2 == HIGH ) 
  {
    if ( fixedState1 == LOW )
    {
      digitalWrite( RED,    LOW  );
      digitalWrite( YELLOW, HIGH );
      digitalWrite( GREEN,  LOW  );

      fixedState1 = HIGH; 
    }
    else
    {
      // настройка зеленого светодиода — это всего лишь предположение
      digitalWrite( RED,    LOW  );
      digitalWrite( YELLOW, LOW  );
      digitalWrite( GREEN,  HIGH );

      fixedState2 = LOW; 
    }
  }
}
,

0

Ваш код настолько плохо отформатирован, что его очень трудно понять.

Несколько вещей, которые бросаются в глаза:

Никогда не устанавливайте REED_PIN1 или REED_PIN2 в режим INPUT_PULLUP. Вы должны сделать это в настройках.

Код, связанный с REED_PIN2, закомментирован, поэтому он не может работать.

Я попробовал улучшить форматирование кода . Результат ниже:

const int REED_PIN1 = 2; // Вывод, подключенный к геркону const
int REED_PIN2 = 3; // Контакт, подключенный к геркону

const int RED = 9; // вывод светодиода - активный-высокий
const int GREEN = 10; // вывод светодиода - активный-высокий
const int YELLOW = 11; // вывод светодиода - активный-высокий

int up = 0; int down = 0;

void setup() {
    Serial.begin(9600);
    // Так как другой конец геркона соединен с землей, нам нужно
    // чтобы подтянуть штифт геркона внутрь.
    pinMode(REED_PIN1, INPUT_PULLUP);
    pinMode(REED_PIN2, INPUT_PULLUP);

    pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(YELLOW, OUTPUT);

    digitalWrite(RED, LOW);
    digitalWrite(GREEN, HIGH);
    digitalWrite(YELLOW, LOW);
}

void loop() {
    int proximity1 = digitalRead(REED_PIN1); // Читаем состояние переключателя
    int proximity2 = digitalRead(REED_PIN2); // Читаем состояние переключателя while (proximity1 == LOW) // Если на выводе низкий уровень, переключатель замкнут.

    up  = up  + 1;
    Serial.print(up);
    Serial.print("        ");
    Serial.println(down);

    if(down < 1) {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, LOW);
        digitalWrite(YELLOW, LOW);

        delay(1000);
    }

    else {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, LOW);
        digitalWrite(YELLOW, LOW);

        delay(1000);
    }
} while (proximity2 == LOW) { // Если на выводе низкий уровень, переключатель замкнут.
    up = up - 1;
    Serial.print(up);
    Serial.print(" ");
    Serial.println(down);
    if (up < 1 && down < 1) {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, LOW);
        digitalWrite(YELLOW, HIGH);

        delay(3000);
    }
    else {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, LOW);
        digitalWrite(YELLOW, LOW);

        delay(1000);
    }
} while (proximity2 == LOW) { // Если на выводе низкий уровень, переключатель замкнут.
    down = down + 1;
    Serial.print(up);
    Serial.print(" ");
    Serial.println(down);

    if(up > 1) {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, LOW);
        digitalWrite(YELLOW, HIGH);

        delay(1000);
    }

    else {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, LOW);
        digitalWrite(YELLOW, LOW);

        delay(1000);
    }
    delay(1000);
}
while (proximity1 == LOW) { // Если на выводе низкий уровень, переключатель замкнут.
    down = down - 1;
    Serial.print(up);
    Serial.print(" ");
    Serial.println(down);
    if (up < 1 && down > 1) {
        digitalWrite(RED, HIGH);
        digitalWrite(GREEN, LOW);
        digitalWrite(YELLOW, LOW);
        delay(5000);      }
    else{
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, LOW);
        digitalWrite(YELLOW, LOW);
        delay(5000);

    }
}

ИЗМЕНИТЬ:

После первого прохода форматирования кода я нашел строки, которые должны установить ваши REED_PIN1 и REED_PIN2 в качестве входных данных. Этот код проглотил комментарий, поэтому я его не видел. (Все после // до конца строки является комментарием. Вы не можете поставить открывающую фигурную скобку для while или if оператор после комментария.)

Не размещайте операторы на одной строке с открывающей фигурной скобкой. Не размещайте несколько утверждений в строке. Каждый раз, когда вы переходите на новый уровень области видимости (внутри другого набора фигурных скобок), увеличивайте уровень отступа)

Это довольно жесткие правила форматирования кода. На полях ведутся споры о таких вещах, как расположение фигурных скобок и количество пустых строк, но ваш код повсеместно нарушает основы удобочитаемости.

,

Я пробовал кодировать и перенастраивать его, но я не получаю результат, @Subathra

Мне нужен вывод, подобный этому Пример: 1. Геркон 1 обнаруживает, затем геркон 2 обнаруживает - светодиод становится желтым 2. Если геркон 2 обнаруживает сначала, затем геркон 1 обнаруживает - светодиод становится красным Он должен воспроизводиться в последовательной форме, @Subathra

Это похоже на то, что машина едет по дороге с односторонним движением, и что произойдет, если машина въедет в одну сторону с противоположной стороны?, @Subathra

Я не могу понять твой извращенный синтаксис., @Duncan C