Мой код включает мой светодиод, даже если мой переключатель не нажат.

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

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

Я не понимаю, в чем дело, может кто-нибудь помочь?

У меня есть Arduino Uno со следующим кодом:

#define sound_Sensor 2
#define EN1 9
#define IN1 8
#define IN2 7
#define solenoid_pin 6
#define LimSwitch1 4
#define LimSwitch2 3

int lastSoundValue;
int soundValue;
long lastNoiseTime = 0;
long currentNoiseTime = 0;
int solenoidPinStatus = LOW;
int status_motor = LOW;
int clap_interval = 200;
int claps = 0;
int pos1 = 1;
int pos2 = 1;

void setup() {
  pinMode(sound_Sensor, INPUT);
  pinMode(EN1, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(solenoid_pin, OUTPUT);
  pinMode(LimSwitch1, INPUT);
  pinMode(LimSwitch2, INPUT);
}

void loop() {

  soundValue = digitalRead(sound_Sensor);
  currentNoiseTime = millis();
  if (soundValue == 1 && lastSoundValue == 0 && (currentNoiseTime > lastNoiseTime + 200)) 
  { 
      if (claps == 0) // разрешаем первую регистрацию без особых условий
      {
          claps = 1;
          lastNoiseTime = currentNoiseTime;
      }
      else
      {
          if (currentNoiseTime > lastNoiseTime + clap_interval)
          {
              claps++;
              lastNoiseTime = currentNoiseTime;
          }
      }
      Serial.print(claps);
  }
  else
  {
      if (currentNoiseTime > (lastNoiseTime + 3 * clap_interval)) // отсутствие хлопков в течение более длительного времени для печати и/или сброса хлопков
      {
          if (claps > 0)
          {
              while(status_motor == LOW){
                  if (digitalRead(LimSwitch1) == LOW && claps == 1)
                  {
                    solenoidPinStatus = HIGH;
                    digitalWrite(solenoid_pin, HIGH);     
                  }

                 if (digitalRead(LimSwitch1) == LOW)
                 {
                    pos1 = 2;
                    status_motor = HIGH;
                    digitalWrite(IN1, HIGH); //Включаем мотор
                    digitalWrite(IN2, LOW);
                    analogWrite(EN1, 200); //Установить скорость двигателя
                  }
                 else if (digitalRead(LimSwitch2) == LOW)
                 {
                    pos2 = 2;
                    status_motor = HIGH;
                    digitalWrite(IN1, HIGH); //Включаем Motor99++
                    digitalWrite(IN2, LOW);
                    analogWrite(EN1, 200); //Установить скорость двигателя
                 }
              }

              while(status_motor == HIGH){
                if (pos1 == 2 && digitalRead(LimSwitch2) == LOW)
                {
                    status_motor = LOW;
                    digitalWrite(IN1, LOW); //Включаем мотор
                    digitalWrite(IN2, LOW);
                    pos1 = 1;
                }

                else if (pos2 == 2 && digitalRead(LimSwitch1) == LOW)
                {
                    status_motor = LOW;
                    digitalWrite(IN1, LOW); //Включаем мотор
                    digitalWrite(IN2, LOW);
                    pos2 = 1;
                }
              }
          }
             claps = 0; ///перезагрузить
      }
  }

// if (solenoidPinStatus == HIGH && status_motor == LOW && digitalRead(LimSwitch1) == LOW)
// {
// соленоидPinStatus = LOW;
// digitalWrite(solenoid_pin, LOW);
// }
  lastSoundValue = soundValue;
}

Извините, моя электрическая схема может оказаться не самой простой для просмотра...

, 👍1

Обсуждение

каково напряжение на выходном контакте Limitsw1., @Vaibhav

как подключены переключатели? у вас есть подтягивающие резисторы?, @Juraj

Где схема?, @Greenonline


1 ответ


Лучший ответ:

2

Я думаю, ваша проблема может быть связана с проводкой.

Это один из способов правильного подключения переключателя к контакту 8.

Arduino с переключателем

В этом случае вам необходимо настроить вывод 8 как INPUT_PULLUP, чтобы использовать внутренний «подтягивающий» резистор. Когда переключатель не нажат, вывод 8 подключен к 5 В через этот резистор, и значение на выводе ВЫСОКОЕ. Когда вы нажимаете переключатель, контакт 8 подключается к земле (резистор предотвращает короткое замыкание), и таким образом значение на контакте 8 становится НИЗКИМ.

Это код, который правильно работает с приведенным выше дизайном

void setup()
{
  pinMode(8, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(8) == HIGH)
  {
    Serial.println("It's HIGH");
  }
  else
  {
    Serial.println("It's LOW");
  }

  delay(1000);
}

Если вы не настраиваете контакт 8 как INPUT_PULLUP, а просто обычный INPUT (как вы это сделали в своем коде), когда кнопка не нажата, контакт 8 является «плавающим» (он ни к чему не подключен) и находится на «плавающем» контакте значения случайны.

,