Здравствуйте. Имеется какое-то странное поведение двух цифровых входов. Проверял следующим образом: Код (C++): void setup() { Serial.begin(9600); pinMode (C1, INPUT); pinMode(C2, INPUT); byte i = 0; for(byte i =0; i < 10; i++) {pinMode (pinLed[i], OUTPUT);}; } void loop() { byte K1 = digitalRead(C1); byte K2 = digitalRead(C2); byte CaseState = (K1*10)+(K2*20); delay(PAUSE_MES); Serial.println(CaseState); } COM выглядит вот так Спойлер: [URL=http://radikal.ru/big/236d1c17670648d2b4640675d98e4729 [/URL]] Разумеется, физически на контактах никаких действий не происходит. Что это?
Что за плата? Какие значения C1, C2, pinLed? Что подключено к входам C1, C2? Исходя из предположений: плата Arduino UNO, пины C1 и C2 цифровые пины 2..13 ни куда не подключенные, массив pinLed не содержит пины C1, C2. Ответ: это шумы. Что бы устранить надо подтянуть пины или к "земле" через резистор, или к +5V с помощью установки режима pinMode (C1, INPUT_PULLUP);
В контроллерах обычно пины имеют подтягивающие резисторы, управляемые через ключи. Пины ATmega328P в Arduino UNO имеют по одному подтягивающему резистору (20..50 кОм), которые подключают пины к +5V. После "подтягивания", функция digitalRead(), будет возвращать HIGH, если пин ни к чему не подключен. "Подтянуть" пин к +5V можно несколькими способами: Код (C++): pinMode (pin, INPUT_PULLUP); Код (C++): pinMode (pin, INPUT); digitalWrite(pin, HIGH);
Принял во внимание существование подтягивающих резисторов, учел это в коде Код (C++): void setup() { Serial.begin(9600); pinMode (C1, INPUT); [B]digitalWrite (C1, HIGH);[/B] pinMode(C2, INPUT); [B]digitalWrite(C2, HIGH);[/B] byte i = 0; for(byte i =0; i < 10; i++) {pinMode (pinLed[i], OUTPUT);}; // настраиваем все LED-пины на OUTPUT } // конец setup void loop() { bool K1 = digitalRead(C1); bool K2 = digitalRead(C2); Serial.print(K1); Serial.print(" "); Serial.println(K2); if (K1 == LOW && K2 == LOW) ledOperate(4); // условие №1 - подаем на пины маску №1 if (K1 == HIGH && K2 == LOW) ledOperate(3); if (K1 == LOW && K2 == HIGH) ledOperate(2); if (K1 == HIGH && K2 == HIGH) ledOperate(1); delay(PAUSE_MES); // задержка перед следующим измерением } // конец loop Но теперь у меня на C1 и С2 всегда плюсовой сигнал. Как управлять-то?))
А при подтяжке к минусу происходит вот что Код (C++): 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 Задержка между измерениями - 150 мс физически контакт был только в течение 2х циклов
Код (C++): #define PAUSE_LED 25 #define PAUSE_MES 150 #define C1 2 #define C2 3 const byte pinLed [10] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; // массив с адресами пинов const bool stateLed[4][10] = { // маска состояний: ноль- выключен, единица- включен {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // для условия №1 {1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, // для условия №2 {0, 0, 0, 0, 0, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, }; void setup() { Serial.begin(9600); pinMode (C1, INPUT); digitalWrite (C1, LOW); pinMode(C2, INPUT); digitalWrite(C2, LOW); byte i = 0; for(byte i =0; i < 10; i++) {pinMode (pinLed[i], OUTPUT);}; // настраиваем все LED-пины на OUTPUT } // конец setup void loop() { bool K1 = digitalRead(C1); bool K2 = digitalRead(C2); Serial.print(K1); Serial.print(" "); Serial.println(K2); //Serial.println ("delay 150"); if (K1 == LOW && K2 == LOW) ledOperate(4); // условие №1 - подаем на пины маску №1 if (K1 == HIGH && K2 == LOW) ledOperate(3); if (K1 == LOW && K2 == HIGH) ledOperate(2); if (K1 == HIGH && K2 == HIGH) ledOperate(1); delay(PAUSE_MES); // задержка перед следующим измерением } // конец loop void ledOperate(byte state) // функция включения-отключения соответствующих LED по номеру условия { byte i = 0; while(pinLed[i]) { digitalWrite (pinLed[i], stateLed[state-1][i]); delay(PAUSE_LED); // задержка перед зажиганием следующего LED i++; } } // конец ledOperate
1Мне нужно организовать систему постепенного включения диодов так, чтобы: 1)одна из двух групп диодов включалась по сигналу со своего канала, а потом в течение времени PAUSE_MES не запрашивала состояние каналов 2) Диоды загорались с задержкой PAUSE_LED 3) Можно было добавить задержку PAUSE_DO, которая отодвигает начало реализации постепенного включения светодиодов, но не влияла на периодичность опроса состояния канала PAUSE_MES Реализованы только первые два пункта