Два геркона в двух направлениях
Привет, я студент, у меня проблемы с программированием. Я хочу установить два геркона в двух направлениях. Пример: 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);} } }
@Subathra, 👍0
Обсуждение2 ответа
Извините, но ваш код — полная ерунда. Следующий код дает вам пример. На данный момент у меня нет доступа к компилятору, поэтому могут быть синтаксические ошибки, и он полностью не проверен. Кроме того, вы не дали полного описания вещей, которые вы хотите сделать. например, когда включать зеленый светодиод или для чего нужны переменные вверх и вниз.
Кроме того, могут быть проблемы со временем. Чтобы не пропустить изменение состояния язычка,
вам следует избегать добавления 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;
}
}
}
Ваш код настолько плохо отформатирован, что его очень трудно понять.
Несколько вещей, которые бросаются в глаза:
Никогда не устанавливайте 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
- Библиотека DHT.h не импортируется
- Что именно делает возвращаемый тип в функции?
- Arduino работает правильно, только когда я прикасаюсь к нему
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
ваш код действительно плохо отформатирован ... сделайте себе одолжение и отформатируйте свой код так, чтобы он был читабельным ... это очень поможет вам при создании программы и отладке, @jsotola
Ваш код - беспорядок. Мало того, что он плохо отформатирован, но из-за того, что он плохо отформатирован, вы потеряли все следы своих скобок, и теперь он повсюду. Половина кода больше не находится в функции., @Majenko
Я думаю, вы не понимаете, как пишутся циклы while на C/C++. Вы можете погуглить, чтобы исправить эту часть кода. Я почти уверен, что ваш текущий код вызовет ошибки компиляции. Вы можете использовать их, чтобы исправить самые неотложные проблемы с кодом. Я начал с паттерна «Что-нибудь закодируй, скомпилируй, исправь ошибки, скомпилируй снова, повторяй до тех пор, пока ошибок не будет»., @chrisl