#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()
большинстве случаев кажется приемлемой.