Вопрос по чтению с цифрового пина при pinMode(x, OUTPUT)

Polinom
Offline
Зарегистрирован: 24.08.2011

Добрый день!

Никак не могу понять, можно ли читать с цифрового пина, которой находится в режиме output... пробывал, работает, но на очередном контроллере возникли глюки с этим моментом, а именно показывает неверную информацию... корректно ли использовать что то вроде этого:

...

pinMode(3, OUTPUT);

digitalWrite(3, HIGH);

...

val=digitalRead(3);

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

А что вы хотите там увидеть ?

Вы увидите то что вы там установили , т.е. HIGH. 

Polinom
Offline
Зарегистрирован: 24.08.2011

Это и хочу. Просто на одном устройстве мне такой код вернул "1", когда я ее туда не подавал. Видимо реализую с помощью булевых переменных.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 Куда вы водите эту переменную ?

Как вы ее видите ?

Что значит " код вернул еденицу , когда я ее не подавал " ?

Т.е. вы пишете такой код :

1 ...
2
3 pinMode(3, OUTPUT);
4
5 digitalWrite(3, LOW);
6
7 ...
8
9 val=digitalRead(3);

а он выдает еденицу ?

Такого быть не может .

 

 

 

Polinom
Offline
Зарегистрирован: 24.08.2011

Прошу прощения за неточное объяснение, просто я очень увлечен. Точный код не выложу, т.к. я сейчас на работе, а код дома остался :)

нет, вот что у меня получается

#define pin1 2

#define pin2 3

#define pin3 4

pinMode(pin1, OUTPUT);

pinMode(pin2, OUTPUT);
pinMode(pin3, OUTPUT);

потом я делаю

digitalWrite(pin1, high);

и опрашиваю все пины на предмет единицы:

Serial.println(digitalRead(pin1));

Serial.println(digitalRead(pin2));
Serial.println(digitalRead(pin3));

в ответ мне выдается, что единица есть на двух!! пинах, хотя digitalWrite я делал только на 1... при подключении реальных светодиодов все корректно (ничего лишнего не загорается), наблюдаю это на 1-ой ордуино нано, на другой ордуино такого нет и на сииидуино такого нет.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Каким образом вы устанавливаете HIGH напинах ?

Если внешним способом (кнопки/датчики) то проблема может быть в подключении.

Если просто внутрипрограмно то попробуйте вот так :

 

digitalWrite(1,HIGH);

if(digitalRead(1)==HIGH)

{

Serial.prnt("1,HIGH");

}

 

 

 

else

{

Serial.print ("1,LOW");
 

}

 

 

Кстати , что такое #define pin1 2 ?

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Да , кстати , если вы устанавливаете 1 на одном пине а на других не устанавливаете вообще ничего то

значение на них может "плавать" (тем более если к ним ничего не подключено).

Обязательно указывайте

dgitalWrite(1,HIGH);

digitalWrite(2,LOW);

digitalWrite(3,LOW);

У вас значение пинов 2и3 не указано вообще , программа не знает что ей делать и выдает случайное значение

, которое зависит от бурь на солнце.

 

 

Polinom
Offline
Зарегистрирован: 24.08.2011

nestandart пишет:

Да , кстати , если вы устанавливаете 1 на одном пине а на других не устанавливаете вообще ничего то

значение на них может "плавать" (тем более если к ним ничего не подключено).

Обязательно указывайте

dgitalWrite(1,HIGH);

digitalWrite(2,LOW);

digitalWrite(3,LOW);

У вас значение пинов 2и3 не указано вообще , программа не знает что ей делать и выдает случайное значение

, которое зависит от бурь на солнце.

Я написал в Arduino IDE некоторое подобие командного интерпретатора на ком-порту, к ардуино я подключаюсь через putty (терминал). В коммандном интерпретаторе я указываю "led1 on", потом указываю "status" на которое выполняется как раз

Serial.println(digitalRead(pin1));

Serial.println(digitalRead(pin2));
Serial.println(digitalRead(pin3));

Попробую сбрасывать в ноль нужные пины в setup. Видимо, правда имеет место случайное значение, которое хз от чего зависит :)

#define pin1 2 использую для удобства, чтобы не указывать каждый раз номер пина, как константу.

Спасибо за помощь