2016-11-04 1 views
0

У меня есть следующий код.Релейный штырек действует по-разному с нагрузкой

void setup(){ 
    pinMode(14, OUTPUT); 
    digitalWrite(14, HIGH); //Relay 
} 
void loop(){ 
    if (!digitalRead(14)){ 
     digitalWrite(10,HIGH); //LED 
     digitalWrite(11,LOW); //LED 
    }else{ 
     digitalWrite(10, LOW); 
     digitalWrite(11, HIGH); 
    } 
} 

В другой части кода реле пин изменяет состояния и я мониторинга, что с digitalRead части в петле в надежде на изменения, которые привели на основе состояния.

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

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

Любые идеи? Или лучший способ контроля состояния реле? (Не сохраняя его псевдо значение в переменной)

ответ

1

Вы устанавливаете контакт 14 как OUTPUT, но вы пытаетесь прочитать его с помощью digitalRead.

Что вы хотите знать, это значение регистра, в котором хранится значение порта.

Вы могли бы пойти по легкому пути и использовать ДОПОЛНИТЕЛЬНОЕ переменную, которая хранит состояние штырьковый, как это:

bool state = true; 
void setup(){ 
    pinMode(14, OUTPUT); 
    digitalWrite(14, state); //Relay 
} 

void loop(){ 
    if (!state){ 
    digitalWrite(10,HIGH); //LED 
    digitalWrite(11,LOW); //LED 
    }else{ 
    digitalWrite(10, LOW); 
    digitalWrite(11, HIGH); 
    } 
} 

И редактировать остальную часть кода соответственно так state изменения соответственно.

Решение «Самое трудное для понимания» - считывать значение регистра. поскольку вы используете контакт 14 (то же, что и контакт A0), вам нужно заглянуть в порт C. В соответствии с справочником Arduino по манипулированию портами (ссылка в конце моего ответа). Таким образом, вы можете просто сделать это:

void setup(){ 
    pinMode(14, OUTPUT); 
    digitalWrite(14, HIGH); //Relay 
} 

void loop(){ 
    if (!BitRead(PORTC,0)){ //Reads bit 0 of the register of PORTC (wich is the state of pin14) 
    digitalWrite(10,HIGH); //LED 
    digitalWrite(11,LOW); //LED 
    }else{ 
    digitalWrite(10, LOW); 
    digitalWrite(11, HIGH); 
    } 
} 

Это решение является более элегантным и именно то, что вам нужно. Это может быть труднее придумать, поэтому, если вы не помните об этом, в будущем вы всегда можете использовать метод переменной «состояние».

Ссылка Bit Read Operation и Arduino Reference on port manipulation для получения дополнительной информации.

+0

Это выглядит великолепно, и я попробую. Но откуда вы знаете, что 14 - это A0, и что соответствует C0? Я прочитал представленную вами страницу и не вижу, как вы переводите вывод 14 на это. Этот Arduino - мега, если это что-то изменило. – TheValyreanGroup

+0

@ TheValyreanGroup Вы можете найти «Arduino Uno pinout» Google, а также имена контактов, такие как «PC0», что означает «PORTC» для выходов или включения подтягиваний, «PINC» для чтения реальных входов и «DDRC» для направления. Вы можете найти все подробности в 'ATMega328p' datasheet – KIIV

+0

В ссылке я дал вам все, что вам нужно: https://www.arduino.cc/en/Reference/PortManipulation Я цитирую:« Карты PORTC для аналоговых контактов Arduino 0 до 5. " и «Для полного отображения номеров контактов Arduino на порты и биты см. диаграмму для вашего чипа: ATmega8, ATmega168. (Обратите внимание, что некоторые биты порта могут использоваться для вещей, отличных от i/o; будьте осторожны, чтобы не изменять значения соответствующих битов регистров.) « Таким образом, вы можете перейти по ссылке к своей версии микросхемы, или вы даже можете использовать ее как @KIIV. – rovda

Смежные вопросы