Как настроить светодиод на выключение с самого начала (Arduino)

#c #arduino #embedded #arduino-ide

#c #arduino #встроенный #arduino-ide

Вопрос:

я тоже… Я новичок в Arduino, и в настоящее время я пытаюсь заставить это работать .. но я уже делаю это в течение часа, и удача не на моей стороне… Вот краткое изложение того, что я делаю: у меня есть Gizduino 644 (копия Arduino с ATmega 644 здесь, в Phil.), ИК-датчик приближения (3 КОНТАКТА — VCC, GRND, OUT), 2 светодиода (красный и желтый) и 2 резистора 100 Ом.

Пока это то, что я могу сделать:

  • В Arduino IDE у меня есть случай, когда, если я наберу «QRIN» — загорится индикатор близости и красный светодиод… если близость ощущает что-то в пределах своего диапазона.. загорится желтый светодиод. Если я наберу «QROUT» — приближение немедленно отключится, и красный светодиод загорится на 10 секунд и погаснет..

И в этом проблема:

  • Желтый светодиод всегда включается, если это первый запуск (я имею в виду, я просто нажимаю кнопку загрузки в IDE) …. и это очень большая проблема … он выключится, только если я введу регистры: ‘QRIN’ и ‘QROUT’..

В моем коде имена следующие:

  • Красный светодиод — БЛОКИРОВКА
  • Желтый светодиод — PROX_SENSOR_LED
  • Proximity — PROX

Это мой код в IDE:

 int LOCK = 13; //RED LED, in pin 13
int PROX = 12; //PROXIMITY, in pin 12
int ANALOG = 0; //OUT of Proximity,  in Analog 0
int PROX_SENSOR_LED = 7; //Yellow LED, in pin 7
int val = 0;  //value to store

void setup()
{
  Serial.begin(9600);
  pinMode(LOCK, OUTPUT); //set the pin # as output (VCC of the hardware)
  pinMode(PROX, OUTPUT); //set the pin # as output (VCC of the hardware)
  pinMode(PROX_SENSOR_LED, OUTPUT); //set the pin # as output (VCC of the hardware)
}

void loop()
{
  digitalWrite(PROX_SENSOR_LED, LOW); //sets the output pin initially to LOW (but doesnt work.. T_T)
  val = analogRead(ANALOG);  //read the input pin 0 to 1023
  if (val > 800)    //if the sensor value is higher threshold set OUTPUT HIGH
  {
    digitalWrite(PROX_SENSOR_LED, HIGH);  //sets output pin HIGH
    delay(100);    //waits for .1 second
  }

  char data = Serial.read(); //read 9600

  switch (data) //start of case... like 'ON' 'OFF'
  {
    case 'QRIN': //this is my 'ON'
                digitalWrite(PROX, HIGH); //turn the proximity to ON
                digitalWrite(LOCK, HIGH); //turn the lock to ON
                break;
    case 'QROUT': //this is my off 'OFF'
                digitalWrite(PROX, LOW); //turn the proximity to OFF
                digitalWrite(LOCK, HIGH); //turn the lock to ON
                delay(10000);              //for 10 seconds
                digitalWrite(LOCK, LOW);   //then off
                if (ANALOG = HIGH)  // I need this 'if' condition because if
                {    //this is not here... the Yellow LED is turn ON... 
                  digitalWrite(PROX_SENSOR_LED, LOW); //I don't know why.. T_T
                }
                break;
  }
}
  

Ответ №1:

Поместите строку в конец настройки ():

 digitalWrite(PROX_SENSOR_LED, LOW);
  

Также if (ANALOG = HIGH) это неверное утверждение, и вы присваиваете своему аналогу значение HIGH. Измените его как if (ANALOG == HIGH) .

Комментарии:

1. Также поместите отпечатки в операторы switch case, чтобы узнать, есть ли у вас какие-либо проблемы при последовательном чтении.

2. После сброса выходы становятся трехфазными, а при установке значения по умолчанию для вывода на низкий уровень добавление дополнительного кода в настройку не требуется. Предположительно, при первом цикле цикла он считывает с аналогового 0 и получает значение, превышающее 800, затем после изменения на чтение с аналогового 1 (из-за ANALOG = HIGH ошибки, ВЫСОКОЕ значение равно 1) он больше не получает значение, превышающее 800, поэтому следующий вопрос: почему значение> 800 -возможно, выход датчика инвертирован?

3. @PeteKirkham да, как вы говорите, аналоговое считывание, возможно, получает 5 В, поэтому назначается как 1024. Поэтому я бы заставил пользователя добавлять дополнительные строки отладки в операторы switch.

Ответ №2:

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

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

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