С энкодера бесконечным потоком идёт 0 или 1(в зависимости от его положения) ,а мне необходимо считать количество переходов от 1 к 0. Вот код который не хочет складывать В чем проблема ? int enk =5; int x; void setup() { Serial.begin(9600); } void loop() { if (enk == HIGH && digitalRead(enk) == LOW) { x == x+1; } Serial.println(digitalRead(enk)); Serial.println(x); delay (1000); }
Код (C++): if (enk == HIGH && digitalRead(enk) == LOW) { x == x+1; } записываем так: Код (C++): if (enk && !digitalRead(enk) x++; а то и: Код (C++): x += (enk && !digitalRead(enk)); А вообще, программа не правильная. В этой строке вы проверяете состояние ножки и номер этой ножки, то есть enk == HIGH все равно что 5 == HIGH, что будет всегда false, а в моем вариант всегда true, что чушь и так и этак. Вам надо считывать состояние ножки, выждать например 1мс и считать еще раз (подойдет цикл loop для этого в вашем случае) и сравнить старое с новым. Если старое 1, а новое 0, значит произошло искомое событие и нужно сделать x++. И не говорите что я непонятно написал, это практически процедура антидребезга. И еще, считывать показание энкодера раз в секунду это все равно что сидя за рулем смотреть на дорогу 1 секунду раз в минуту. То есть толку никакого.
Нате вам: Код (C++): #define enk 5 unsigned int x; bool newEnk; bool oldEnk; void setup() { Serial.begin(9600); } void loop() { newEnk = digitalRead(enk); // для энкодера считывать нужно часто, иначе не поймаешь каждый щелчек if (oldEnk && !newEnk) x++; oldEnk = newEnk; // Serial.println(digitalRead(enk)); // это не покатит каждую 1мс // Serial.println(x); // это тоже, юзайте millis() delay (1); } Прочитайте каменты и сделайте как советую. А еще лучше настроить прерывание по таймеру и пусть выполняется 1 раз в мс вот эта функция: Код (C++): newEnk = digitalRead(enk); if (oldEnk && !newEnk) x++; oldEnk = newEnk;
Спасибо за помощь Заменил на ваш код теперь когда 0 на энкодере Х плюсуется с неимоверной скоростью при этом энкодер не кто не трогает а вот когда 1 такой беды нет Вот еще один вариант как можно реализовать while(digitalRead(enk)==0); while(digitalRead(enk)==1); x++;