Здравствуйте. Помогите пожалуйста, кому не лень. Задачка вобщем простая, есть три входа, два выхода. Программка должна анализировать количество входов в высоком состоянии и выдавать соответствующий двоичный код на выход. Пример: Входы || Выходы А В С || А В 0 0 0 || 0 0 1 0 0 || 1 0 0 1 0 || 1 0 0 0 1 || 1 0 1 1 0 || 0 1 0 1 1 || 0 1 1 0 1 || 0 1 1 1 1 || 1 1
Может быть что-нибудь такое: Код (Text): const int inputPinA = 3; const int inputPinB = 4; const int inputPinC = 5; const int outputPinA = 6; const int outputPinB = 7; void setup() { pinMode(outputPinA, OUTPUT); pinMode(outputPinB, OUTPUT); } void loop() { int A = digitalRead(inputPinA); int B = digitalRead(inputPinB); int C = digitalRead(inputPinC); if (A + B + C == 1) { digitalWrite(outputPinA, HIGH); digitalWrite(outputPinB, LOW); } else if (A + B + C == 2) { digitalWrite(outputPinA, LOW); digitalWrite(outputPinB, HIGH); } else if (A + B + C == 3) { digitalWrite(outputPinA, HIGH); digitalWrite(outputPinB, HIGH); } else { digitalWrite(outputPinA, LOW); digitalWrite(outputPinB, LOW); } }
http://goo.gl/aml9Hu Код (Text): #define inputPinA 3 #define inputPinB 4 #define inputPinC 5 #define outputPinA 6 #define outputPinB 7 void setup() { digitalWrite(outputPinA, OUTPUT); digitalWrite(outputPinB, OUTPUT); } void loop() { boolean A = digitalRead(inputPinA); boolean B = digitalRead(inputPinB); boolean C = digitalRead(inputPinC); boolean Aout = A|B; boolean Bout = B|C; digitalWrite(outputPinA, Aout); digitalWrite(outputPinB, Bout); }
А теперь смоделируйте что будет в случае: 0 0 1 || 1 0 А выставится в 0 ... и работать логика верно уже не будет
хм, XOR тоже не подходит. А втупую сравнивать - как-то не изящно. И вообще исходный пример непонятен: почему при Код (Text): А В С || А В 0 0 0 || 0 0 низкие A и B дают на выходе А ноль, а при Код (Text): А В С || А В 0 0 1 || 1 0 те же низкие A и B дают на выходе А единицу?
По сути в первом ответе было дано наиболее наглядное решение задачи. Логика простая, просто надо посчитать на скольких пинах единицы и в зависимости от количества выставить требуемые значения. Так что я по сути лишь слегка переделал первый ответ. Главное не забудьте про setup ну и объявить переменные пинов, я привожу лишь функцию main Код (Text): void loop() { int count = 0; if( digitalRead(inputPinA) ) count++; if( digitalRead(inputPinB) ) count++; if( digitalRead(inputPinC) ) count++; switch( count ) { case 0: digitalWrite(outputPinA, LOW); digitalWrite(outputPinB, LOW); break; case 1: digitalWrite(outputPinA, HIGH); digitalWrite(outputPinB, LOW); break; case 2: digitalWrite(outputPinA, LOW); digitalWrite(outputPinB, HIGH); break; case 3: digitalWrite(outputPinA, HIGH); digitalWrite(outputPinB, HIGH); break; } } Можно конечно решить это с помощью битовых операций но в данном случае наглядность как я понимаю имеет более большое значение Можно и даже нужно было бы добавить понятие нового и старого состояния пинов чтобы не тыркать все это по кругу когда значения на пинах не поменялись, но не стал усложнять код.
По скетчу вроде правильно и местами понятно. А на макетке - тишина. Всё равно, всем неравнодушным - спасибо. Уже есть направление, куда двигаться.
При загрузке скетча (первый в посте), на выходах светодиоды горят вполнакала. Померил напряжение - 2,5В. Прописываю в скетч поставить высокий уровень на 13 ногу. Тоже вполнакала. Загружаю скетч с Blink-ом, и всё как и должно быть . Напряжение на выходе ~5В. Поменял в: void setup() { digitalWrite(outputPinA, OUTPUT); digitalWrite(outputPinB, OUTPUT); на : void setup() { pinMode(outputPinA, OUTPUT); pinMode(outputPinB, OUTPUT); и всё стало нормально - 5В. Объясните?
не изучали теорию? pinMode настраивает пины на вход или выход. В первый раз Вы этого не сделали, а по-умолчанию они работают как входы.
Вы все правильно сделали, я допустил ошибку. Естественно pinMode. Видимо, когда я писал скетч, мои мысли были не согласованы с руками .