atmega 8 датчики холла и rgb светодиод

Тема в разделе "Arduino & Shields", создана пользователем sanik, 10 мар 2014.

  1. sanik

    sanik Гик

    Добрый день помогите пожалуйста с кодом пытаюсь разобраться не получается :confused:
    Схема простая несколько датчиков и светодиод при включении перемигивается всеми тремя цветами
    с этим разобрался работает как надо далее в режиме ожидания должен мигать красным цветом.
    Вместо этого, перемигивается красным и зеленым+синим. вроде в этом месте все правильно почему так происходит не понятно? Ну а остальное подписано в самом коде
    Код (Text):
    #define ha1  8    // первый датчик холла
    #define ha2  7    // второй датчик холла

    void ntr()
    {
      // должен мигать один красный на данный момент зеленый и
      //синий горят а красный мигает
      digitalWrite(ledR,HIGH);
      digitalWrite(ledB,LOW);
      digitalWrite(ledG,LOW);
      delay(500);
      digitalWrite(ledR,LOW);
      digitalWrite(ledG,LOW);
      digitalWrite(ledB,LOW);
      delay(500);
    }
    void one()
    // поднес магнит   ничего не происходит :-(   должен гореть красный и зеленый
    // убрал переходим void ntr()
    {
      digitalWrite(ledR,HIGH);
      digitalWrite(ledG,HIGH);
      digitalWrite(ledB,LOW);
    }
    void two()
    // поднес магнит все гаснет
    // должно наоборот поднес все горят, убрал переходим void ntr()
    {
      digitalWrite(ledR,HIGH);
      digitalWrite(ledG,HIGH);
      digitalWrite(ledB,HIGH);
    }
    //void three()
    //void four()
    //void five()
    void loop()
    {
      switch (var)
      {
        case MODE_INIT:
        zastav();
        var = NETRAL;
        break;
        case NETRAL:
        {
          ntr();
          State1 = digitalRead(ha1);
          State2 = digitalRead(ha2);
          if (State1 == HIGH)
          {
            one();
            var = FIRST;
          }
          else
          {
            var = NETRAL;
          }
          if (State2 == HIGH)
          {
            two();
            var = SECOND;
          }
          else
          {
            var = NETRAL;
          }
          break;
          case FIRST:
          {
            if (State1 == LOW)
            {
              ntr();
              var = NETRAL;
            }
            break;
            case SECOND:
            {
              if (State2 == LOW)
              {
                ntr();
                var = NETRAL;
              }
              break;
            }
          }
        }
      }
    }
     
    Последнее редактирование: 12 мар 2014
  2. acos

    acos Официальный гик Администратор

    а подярность светодиода не перепутана ли?
     
    rav_75 нравится это.
  3. sanik

    sanik Гик

    void zastav() Работает ка надо...
     
  4. rav_75

    rav_75 Гик

    acos хотел сказать, что аноды светодиодов у Вас подключены с +5V, а катоды к пинам. В итоге digitalWrite(led, LOW) имеем свечение, а digitalWrite(led, HIGH) все тухнет. Т.е. все работает так, как у Вас написано.
     
    acos нравится это.
  5. sanik

    sanik Гик

    Спасибо сечас испробую обычные , А почему нет реакции на первом датчике ha1?
     
  6. rav_75

    rav_75 Гик

    Обратите внимание на эту конструкцию
    Код (Text):
    if (State1 == HIGH)
          {
            one();
            var = FIRST;
          }
          else
          {
            var = NETRAL;
          }
          if (State2 == HIGH)
          {
            two();
            var = SECOND;
          }
          else
          {
            var = NETRAL;
          }
    по всей логике var у Вас никогда не будет равно FIRST ;)
    второй if портит Вам всю малину. Используйте конструкцию else if
     
  7. sanik

    sanik Гик

    Вобще ничего не работает :(
     
  8. rav_75

    rav_75 Гик

    Что значит обычные? Либо светодиоды катодами на землю, анодами к пинам, либо инвертируйте управление
    Резисторы не забываем..
     
  9. sanik

    sanik Гик

    Спасибо пошел читать про неё ...
     
  10. sanik

    sanik Гик

     
  11. sanik

    sanik Гик

    Вобще хочу задействовать семисегментый индикатор, решил испробовать на светодиоде. Но походу в логике ничего не смыслю:( сейчас попробую на трех сегментах о резисторах я в курсе.
     
  12. rav_75

    rav_75 Гик

    давайте так: сначала подключите светодиоды длинными ножками к соответствующим пинам, а короткими через резисторы к земле. Лучше сразу через резисторы к пинам, если собираетесь семисегментник с общим катодом использовать.
    Далее разберемся с этим куском кода
    Код (Text):
    if (State1 == HIGH)
          {
            one();
            var = FIRST;
          }
          else
          {
            var = NETRAL;
          }
          if (State2 == HIGH)
          {
            two();
            var = SECOND;
          }
          else
          {
            var = NETRAL;
          }
    проверяем условие if (State1 == HIGH). Допустим оно выполняется, получаем var=FIRST. else молчит, так как условие выполнилось, вроде все нормально. Но следом идет второе условие, в зависимости от которого тоже изменяется значение var. if (State2 == HIGH), если условие верно, то var присваивается значение SECOND, если не верно, то NETRAL. Таким образом на выходе var никогда не будет равно FIRST.
    Сделайте так
    Код (Text):
    if (State1 == HIGH)
          {
            one();
            var = FIRST;
          }
          else if (State2 == HIGH)
          {
            two();
            var = SECOND;
          }
          else
          {
            var = NETRAL;
          }
    Подразумевается, что в один период времени будет задействован один датчик.
    Да, еще, вынесите
    State1 = digitalRead(ha1);
    State2 = digitalRead(ha2);
    в начало цикла loop(), иначе считываться показания с датчиков будут только при var==NEUTRAL
     
    Последнее редактирование: 10 мар 2014
  13. sanik

    sanik Гик

    Сделал инверсию все заработало только нет возврата в режим NETRAL Помогите пожалуйста что не так сделал?
    Код (Text):

    #define ha1  8  // первый датчик холла
    #define ha2  7  // второй датчик холла
    #define rdp  2
    #define f  3
    #define a  4
    // переменная для считывания состояния датчика


    #define MODE_INIT 0
    #define NETRAL  1
    #define FIRST  2

    int var = MODE_INIT;
    void setup()
    {
    pinMode(ha1, INPUT);
    pinMode(ha2, INPUT);
    pinMode(rdp,OUTPUT);
    pinMode(f,OUTPUT);
    pinMode(a,OUTPUT);
    }
    void zastav()
    // здесь все работает по очереди загорелись и по очереди погасли
    {
      digitalWrite(rdp,HIGH);
      delay(250);
      digitalWrite(a,HIGH);
      delay(250);
      digitalWrite(f,HIGH);
      delay(250);
      digitalWrite(rdp,LOW);
      delay(100);
      digitalWrite(a,LOW);
      delay(100);
      digitalWrite(f,LOW);
      delay(100);
    }
    void ntr()
    {
      // должен мигать один красный на данный момент зеленый и
      //синий горят а красный мигает
      digitalWrite(rdp,LOW);
      digitalWrite(a,HIGH);
      digitalWrite(f,HIGH);
      delay(500);
      digitalWrite(rdp,HIGH);
      digitalWrite(a,HIGH);
      digitalWrite(f,HIGH);
      delay(500);
    }
    void one()
    // ничего не происходит :-(
    {
      digitalWrite(rdp,HIGH);
      digitalWrite(a,LOW);
      digitalWrite(f,HIGH);
    }
    void two()
    // поднес магнит все гаснет
    // должно наоборот поднес все горят убрал переходим void ntr()
    {
      digitalWrite(rdp,LOW);
      digitalWrite(a,LOW);
      digitalWrite(f,HIGH);
    }
    //void three()
    //void four()
    //void five()
    void loop()
    {
      switch (var)
      {
      case MODE_INIT:
      zastav();
      var = NETRAL;
      break;
      case NETRAL:
      {
      ntr();
      State1 = digitalRead(ha1);
      State2 = digitalRead(ha2);
      if (State1 == HIGH)
      {
      one();
      var = FIRST;
      }
      else
      {
      if (State2 == HIGH)
      {
     
     
    Последнее редактирование: 12 мар 2014
  14. sanik

    sanik Гик

    Поздно написал (
     
  15. rav_75

    rav_75 Гик

    Да, еще, вынесите
    State1 = digitalRead(ha1);
    State2 = digitalRead(ha2);
    в начало цикла loop(), иначе считываться показания с датчиков будут только при var==NEUTRAL
    поздно дополнил )
     
  16. sanik

    sanik Гик

    Хорошо попробую переделал функцию не реагирует на магниты сейчас заново перепишу...
     
  17. rav_75

    rav_75 Гик

    Что-то там у Вас с правыми фигурными скобками...
     
  18. rav_75

    rav_75 Гик

    как-то вот так должно быть
    Код (Text):
    void loop()
    {
      State1 = digitalRead(ha1);
      State2 = digitalRead(ha2);
      switch (var)
      {
      case MODE_INIT:
        zastav();
        var = NETRAL;
        break;
      case NETRAL:
        ntr();
        if (State1 == HIGH)
        {
          one();
          var = FIRST;
        }
        else if (State2 == HIGH)
        {
          two();
          var = SECOND;
        }
        else
        {
          var = NETRAL;
          //ntr();   лишнее
        }
        break;
      case SECOND:
        if (State2 == LOW)
        {
          //ntr();    лишнее
          var = NETRAL;
        }
        break;
      }
    }
     
    и куда case FIRST делось?
     
  19. sanik

    sanik Гик

    Случайно удалил, сейчас переписал.
     
  20. sanik

    sanik Гик

    Примерно так и получилось но не реагирует на датчики
    Код (Text):
    void loop()
    {
      State1 = digitalRead(ha1);
      State2 = digitalRead(ha2);
      {
        switch (var)
        {
          case MODE_INIT:
          zastav();
          var = NETRAL;
          break;
          case NETRAL:
          {
            ntr();
            if (State1 == HIGH)
            {
              one();
              var = FIRST;
            }
            else if (State2 == HIGH)
            {
              two();
              var = SECOND;
            }
            else
            {
              var = NETRAL;
            }
          }
          break;
          case FIRST:
          {
            if (State2 == LOW)
            {
              ntr();
              var = NETRAL;
            }
          }
          break;
          case SECOND:
          {
            if (State2 == LOW)
            {
              ntr();
              var = NETRAL;
            }
          }
          break;
        }
      }
    }