Энкодер 2 сигнала

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
о не очень понимаю как с ним работать в моем примере
Есть функция millis() - возвращает текущее время с начала работы мк в миллисекундах. Если в момент события считать эту функцию и запомнить ее в переменной , то это будет время события. Далее сравнивать запомненное время события с той же миллис , если прошло больше 200 мс, то менять состояние пина. если меньше -не трогать, т.к. тронули в момент события и запоминания времени.

А с переводом сигналов в INPUT это работать корректно не будет ?
Может и будет, а может и нет. Обычно входные пины, что бы избежать наводок, подтягивают резистором к уровню по умолчаний, т.е. если вход должен реагировать на высокий уровень сигнала, то его подтягивают резистором на 10кОм и выше к земле, если на низкий, то к +. Если на приемной плате будет подтяжка к +, то возможно(!) поменяв назначение выходного пина на вход, то на приемной плате появится высокий сигнал, что будет считаться отсутствие движения, а при выводе низкого будет работать как движение.
Но это крайне сомнительное решение, сигнал выхода не должен зависеть от того, что на другом конце провода.
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
То есть с миллис код должен быть какой-то такой ?

C++:
#include <GyverEncoder.h>


#define CLK 4
#define DT 3
unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 200;

Encoder enc1(CLK, DT);
void setup() {
  Serial.begin(9600);
  enc1.setType(TYPE1);    // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
  startMillis = millis();

}
void loop() {
  currentMillis = millis();
  enc1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться
      if (enc1.isLeft()) {
        pinMode(11, OUTPUT);
        digitalWrite(11, LOW);
        Serial.println("down");
        }  // вывод сигнала если крутиться вниз
    if (enc1.isRight()) {
        pinMode(10, OUTPUT);
        digitalWrite(10, LOW);
        Serial.println("up");
    } // вывод сигнала если крутиться вверх
    if (currentMillis - startMillis >= period)  {
    pinMode(10, INPUT);
    pinMode(11, INPUT);
    startMillis = currentMillis;
  }
}
то его подтягивают резистором на 10кОм и выше к земле, если на низкий, то к +.
Так же при прозвонке тестером + и - на места куда должен идти сигнал. То "+" ничего не показывает. А "-" показывает 3.5 кОм.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
Нет, не так. Тут startMillis инициируется в самом начале и никогда не меняется, а должен запоминать событие - поворот энкодера.

@Chelovekula,
Так же при прозвонке тестером + и - на места куда должен идти сигнал. То "+" ничего не показывает. А "-" показывает 3.5 кОм.
Тогда скорее всего он подтягивается к земле (если я правильно понял) - в это случае работать не будет , для того что бы перестало постоянно считать что идет вращение нужно что бы был настоящий высокий сигнал
 

Chelovekula

✩✩✩✩✩✩✩
4 Апр 2024
14
0
для того что бы перестало постоянно считать что идет вращение нужно что бы был настоящий высокий сигнал
То есть делать по окончанию периода чтоб давал сигнал HIGH и будет мне счастье ?
C++:
    if (currentMillis - startMillis >= period)  {
      Serial.println(currentMillis - startMillis);
    digitalWrite(11, HIGH);
    digitalWrite(10, HIGH);
    startMillis = currentMillis;
  }
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
@Chelovekula, Да, скорее всего так, если логика контроллера, куда подается сигнал пятивольтовая. Если 3.3 то надо делать делитель напряжения. Иначе можно спалить вход.
И тот же высокий сигнал надо подавать когда меняется направление, даже если время еще не истекло, ну и соотв. выставить его в setup