Опять я...

Тема в разделе "Arduino & Shields", создана пользователем mike_KH, 7 май 2015.

  1. mike_KH

    mike_KH Гик

    От processing отказался, подключил 7ми сегментник, то есть вывожу температуру с термистора на этот самый элемент, да не получается. Вот код
    Код (Text):
    #include <math.h>
    #define TERMIST_B 4300
    #define VIN 5.0
    #define CLOCK_PIN 7
    #define RESET_PIN 6
    void R()
    {
        digitalWrite(RESET_PIN, HIGH);
        digitalWrite(RESET_PIN, LOW);
    }



    void setup()
    {
      Serial.begin(9600);
      pinMode(RESET_PIN, OUTPUT);
      pinMode(CLOCK_PIN, OUTPUT);
    }


    void loop()
    {
      float voltage = analogRead(A0) * VIN / 1024.0;
      float r1 = voltage / (VIN - voltage);
      float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
      int T = round(temperature);
      Serial.println(".");
      Serial.print(T);
      R();
      int var = 0;
      while (var < T ){
        digitalWrite(CLOCK_PIN, HIGH);
        digitalWrite(CLOCK_PIN, LOW);
        var = var++;
      }
    }
     
  2. DrProg

    DrProg Вечный нерд

    А где в коде работа с семисегментником? Я вижу вкл и тутже выкл одного пина несколько раз и все.
    Как подключен индикатор? Через регистр?

    Да, и пишите в заголовке кратко суть вопроса, а не безинформативное "опять я".
     
  3. iglooshtosser

    iglooshtosser Гик

    А как подключен индикатор? Судя по коду через драйвер, вроде 4026. Но тогда другой вопрос: правильно ли подключен драйвер? Сколько разрядов в индикаторе?
     
    Последнее редактирование: 7 май 2015
  4. mike_KH

    mike_KH Гик

    Да использую CD4026, да все подключено верно проверил элементарным кодом который перебирает все числа в том числе и с 2мя разрядами. Проблема на мой взгляд в том что я подключил к 5 вольтам и термистор и индикатор, но даже после пробы подключить индикатор к 3.3 а термистор к 5ти, но всей равно работать отказывается. Сейчас запитаю от акума на 3.75, как попробую отпишусь
     
  5. dnk

    dnk Нерд

    Значение var в цикле остается неизменным. Присвоение здесь лишнее и ошибочно.
     
  6. mike_KH

    mike_KH Гик

    Почему же ?
     
  7. dnk

    dnk Нерд

    Потому что операция постинкремента возвращает предыдущее значение. Соответственно это предыдущее значение будет опять присвоено переменной var.
    Да и сам смысл такой конструкции сомнителен, ведь var++ уже изменяет переменную var, зачем ее присваивать самой себе же?
     
  8. mike_KH

    mike_KH Гик

    Для перебора чисел, то есть вы говорите о том что нужно добавить еще одну перменyую??
     
  9. dnk

    dnk Нерд

    Нет юный падаван, похоже я тебя запутал. Я всего лишь говорю, что в твоем коде операция присвоения лишняя и ошибочная. :)
    Вот так работает постинкремент:
    Код (Text):

    int i = 0;
    int j;
    while (i < 3) {
      j = i++;
    }

    i   j
    1   0
    2   1
    3   2
     
    Как видишь, i исправно увеличивает свое значение, но результатом этой операции всегда является предыдущее значение i, которое в данном коде копируется в переменную j. Тебе это значение не требуется, поэтому ни дополнительных переменных, ни операций присваивания тоже не требуется.
    А вот так может работать то, что ты написал:
    Код (Text):

    // var = var++;
    int oldValue = var; // постфикс неявно сохраняет старое значение
    var = var + 1; // инкремент var++
    var = oldValue; // присвоение var =
     
    Или так
    Код (Text):

    // var = var++;
    int oldValue = var; // постфикс неявно сохраняет старое значение
    var = oldValue; // присвоение var =
    var = var + 1; // инкремент var++
     
    По факту, какой вариант получится, зависит от компилятора и его настроек. Просто запомни, что var = var++ писать нельзя.
     
    Последнее редактирование: 7 май 2015
  10. mike_KH

    mike_KH Гик

    Так что же мне делать?? Как мне сделать так что-бы программа столько раз выполняла clock столько сколько в пременоой T
     
  11. dnk

    dnk Нерд

    Эх, видимо объясняльщик из меня не очень:

    Код (Text):

      while (var < T) {
        digitalWrite(CLOCK_PIN, HIGH);
        digitalWrite(CLOCK_PIN, LOW);
        var++;
      }
     
    Вот так должно быть.
     
  12. mike_KH

    mike_KH Гик

    Но ведь у меня тоже самое было
     
  13. mike_KH

    mike_KH Гик

    А нет чуть чуть не так
    Спасибо теперь все понял
     
  14. mike_KH

    mike_KH Гик

    Как же так опять не работает ((((
     
  15. dnk

    dnk Нерд

    А что в консоль последовательного порта пишется?
     
  16. mike_KH

    mike_KH Гик

    Все отладил единственное каждые 2 секунды все это дуло мограет
     
  17. dnk

    dnk Нерд

    Наверное, стоит сохранять предыдущее значение температуры и, если температура не изменилась (или изменилась незначительно) по сравнению с предыдущим значением, то не обновлять данные на счетчике. Ну и задержка для чтения датчика должна быть разумная, нет смысла его бесконечно дергать, можно это делать раз в секунду/минуту/час например.
     
  18. mike_KH

    mike_KH Гик

    Все отладил вот код
    Код (Text):
    #include <math.h>
    #define TERMIST_B 4300
    #define VIN 5.0
    #define CLOCK_PIN 7
    #define RESET_PIN 6
    int var = 0;
    void R()
    {
        digitalWrite(RESET_PIN, HIGH);
        digitalWrite(RESET_PIN, LOW);
    }




    void setup()
    {
      Serial.begin(9600);
      pinMode(RESET_PIN, OUTPUT);
      pinMode(CLOCK_PIN, OUTPUT);
    }


    void loop()
    {
      float voltage = analogRead(A0) * VIN / 1024.0;
      float r1 = voltage / (VIN - voltage);
      float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
      int T = round(temperature);
      //Serial.println(T);
      delay(250);
      R();
     
      while (var < T) {
        digitalWrite(CLOCK_PIN, HIGH);
        digitalWrite(CLOCK_PIN, LOW);
        var++;
        //Serial.println(var);
      }
      var = 0;
    }
     
     
  19. mike_KH

    mike_KH Гик

    Спасибо огромное вам
     
  20. mike_KH

    mike_KH Гик

    Стоит ли использовать прерывание для слежения за изменением температуры??