Мой код включает мой светодиод, даже если мой переключатель не нажат.
Я пытаюсь создать цепь, которая будет вращать мой мотор, когда я хлопаю в ладоши. Когда первый концевой выключатель находится в нижнем положении и раздается только один хлопок, предполагается, что штифт соленоида задействован (в настоящее время светодиод), но когда я хлопаю один раз, не нажимая концевой выключатель, мой светодиод включается.
Кроме того, мне не удается заставить мой код правильно работать с концевыми выключателями для управления моим двигателем.
Я не понимаю, в чем дело, может кто-нибудь помочь?
У меня есть 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;
}
Извините, моя электрическая схема может оказаться не самой простой для просмотра...
@Vincent, 👍1
Обсуждение1 ответ
Лучший ответ:
Я думаю, ваша проблема может быть связана с проводкой.
Это один из способов правильного подключения переключателя к контакту 8.
В этом случае вам необходимо настроить вывод 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 является «плавающим» (он ни к чему не подключен) и находится на «плавающем» контакте значения случайны.
- Правильное подключение четырехконтактного датчика наклона к макетной плате перед запуском
- Переключатели уровня воды / герконы и Arduino Uno
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- Как подключить более 10 датчиков к Arduino uno r3
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
- Чтение датчика давления от 4 до 20 мА с использованием uno
каково напряжение на выходном контакте Limitsw1., @Vaibhav
как подключены переключатели? у вас есть подтягивающие резисторы?, @Juraj
Где схема?, @Greenonline