Как складывать ?

Тема в разделе "Arduino & Shields", создана пользователем aptem, 1 окт 2016.

  1. aptem

    aptem Нуб

    С энкодера бесконечным потоком идёт 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);
    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    x == x+1; :D
     
  3. aptem

    aptem Нуб

    Подскажи что не так
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    это проверка на равенство левой и правой сторон: ==
    это присвоение значения переменной слева: =
     
  5. ostrov

    ostrov Гуру

    Код (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 секунду раз в минуту. То есть толку никакого.
     
    Последнее редактирование: 1 окт 2016
  6. ostrov

    ostrov Гуру

    Нате вам:
    Код (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;
     
    aptem нравится это.
  7. aptem

    aptem Нуб

    Спасибо за помощь
    Заменил на ваш код теперь когда 0 на энкодере Х плюсуется с неимоверной скоростью при этом энкодер не кто не трогает а вот когда 1 такой беды нет
    Вот еще один вариант как можно реализовать
    while(digitalRead(enk)==0);
    while(digitalRead(enk)==1);
    x++;
     
  8. aptem

    aptem Нуб

    Спасибо вам огромное
    Все работает =)
     
  9. ostrov

    ostrov Гуру

    Таким кодом вы тормознете все процессы на МК.