Опять я...

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

  1. dnk

    dnk Нерд

    Тут к сожалению ничего посоветовать не могу, ардуино приобрел только полгода назад, программирование микроконтролеров еще недостаточно освоил, приходится много тратить времени на закрытие пробелов в электронике. В теории, я бы предпочел прерывания, программирование через delay, на мой взгляд, не очень смотрится.
     
  2. DrProg

    DrProg Вечный нерд

    Просто интересно, почему процедура сброса вынесена в отдельную функцию, а аналогичная установка индикатора в теле цикла?
     
  3. mike_KH

    mike_KH Гик

    Не знаю даже))
     
  4. mike_KH

    mike_KH Гик

    А каким образом вы это сделаете?? И каким образом можно само вычисление температуры в функцию перевести??
     
  5. DrProg

    DrProg Вечный нерд

    Само вычисление не обязательно выносить, равно как и все остальное, хотя было бы читабельнее и изящнее. Но. Вы сделали функцию R, которая обнуляет индикатор, при этом аналогичный цикл с выставлением значения оставили в теле. Было бы логично вынести его тоже в функции. Кстати, конструкция с while, на мой взгляд локаничнее.

    Код (Text):
    while (Т--) {
            digitalWrite(CLOCK_PIN, HIGH);
            digitalWrite(CLOCK_PIN, LOW);
        }
     
    Последнее редактирование: 8 май 2015
  6. mike_KH

    mike_KH Гик

    Так как же вычисления перевести в функцию
     
  7. DrProg

    DrProg Вечный нерд

    Так же как функцию R. Только она без входа и без выхода, но несложно сделать какие угодно параметры. Опять же выносить часть кода в функцию есть смысл при повторе, например последовательная подача на пин LOW и HIGH (повторяется в программе в двух местах). В качестве входящего параметра - номер пина.

    Пример универсальной функции подачи вкл-выкл на пин:
    Код (Text):
    void R(int PIN)
    {
        digitalWrite(PIN, HIGH);
        digitalWrite(PIN, LOW);
    }
     
  8. mike_KH

    mike_KH Гик

    Код (Text):

    #include <math.h>
    #define TERMIST_B 4300
    #define VIN 5.0
    #define RESET_PIN 6
    #define CLOCK_PIN 7
    #define RDip 8
    #define LDip 9

     void R()
    {
        digitalWrite(RESET_PIN, HIGH);
        digitalWrite(RESET_PIN, LOW);
    }

    void D (int x){
         while(x--) {
        digitalWrite(CLOCK_PIN, HIGH);
        digitalWrite(CLOCK_PIN, LOW);
    }
    }
    void T(int y){
      float voltage = analogRead(A0) * VIN / 1024.0;
      float r1 = voltage / (VIN - voltage);
      float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
      y = round(temperature);
    }
    void setup()
    {
      Serial.begin(9600);
      pinMode(RESET_PIN, OUTPUT);
      pinMode(CLOCK_PIN, OUTPUT);
      pinMode(LDip, OUTPUT);
      pinMode(RDip, 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 T0 = round(temperature);
      // D(T0);
       int T1 = 0;
       T(T1);
       delay(1000);
       R();
       int T2 = 0;
       T(T2);
      if (T1 = T2){
        digitalWrite(LDip , HIGH);
        digitalWrite(RDip , HIGH);
      }
      else if (T1 > T2) {
        digitalWrite(RDip , HIGH);
        digitalWrite(LDip , LOW);
      }
      else if (T1 < T2) {
       digitalWrite(LDip , HIGH);
        digitalWrite(RDip , LOW);
      }
    }




     
     
  9. mike_KH

    mike_KH Гик

    Как вам??
     
  10. mike_KH

    mike_KH Гик

    Код (Text):

    #include <math.h>
    #define TERMIST_B 4300
    #define VIN 5.0
    #define RESET_PIN 6
    #define CLOCK_PIN 7
    #define RDip 8
    #define LDip 9
    int var = 0;

     void R()
    {
        digitalWrite(RESET_PIN, HIGH);
        digitalWrite(RESET_PIN, LOW);
    }

    void D (int x){
         while(var < x) {
        digitalWrite(CLOCK_PIN, HIGH);
        digitalWrite(CLOCK_PIN, LOW);
        var++;
    }

    }
    void T(int y){
      float voltage = analogRead(A0) * VIN / 1024.0;
      float r1 = voltage / (VIN - voltage);
      float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
      y = round(temperature);
    }
    void setup()
    {
      Serial.begin(9600);
      pinMode(RESET_PIN, OUTPUT);
      pinMode(CLOCK_PIN, OUTPUT);
      pinMode(LDip, OUTPUT);
      pinMode(RDip, 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 T0 = round(temperature);
       int T1 = 0;
       T(T1);
       D(T1);
       delay(1000);
       R();
       int T2 = 0;
       T(T2);
       D(T2);
      if (T1 = T2){
        digitalWrite(LDip , HIGH);
        digitalWrite(RDip , HIGH);
      }
      else if (T1 > T2) {
        digitalWrite(RDip , HIGH);
        digitalWrite(LDip , LOW);
      }
      else if (T1 < T2) {
       digitalWrite(LDip , HIGH);
        digitalWrite(RDip , LOW);
      }
    }




     
    Не работает, спасайте((((
     
  11. mike_KH

    mike_KH Гик

    void T(int y){
    float voltage = analogRead(A0) * VIN / 1024.0;
    float r1 = voltage / (VIN - voltage);
    float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
    y = round(temperature);
    Где то тут ошибка не могу понять(( Определил через монитор порта
     
  12. mike_KH

    mike_KH Гик

    После тестирования стало ясно что проблема в переносе данных из void D в void loop
     
  13. dnk

    dnk Нерд

    Дело в том, что в языке C/C++, значения параметров функции в самой функции нельзя поменять. В данном случае самый простой выход возвращать результат через return.

    Код (Text):

    int T() {
        float voltage = analogRead(A0) * VIN / 1024.0;
        float r1 = voltage / (VIN - voltage);
        float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
        return round(temperature);
    }
     
    Ну и соответственно в коде поправить:
    Код (Text):

    int T1 = T();
    int T2 = T();
     
     
  14. geher

    geher Гуру

    А если воспользоваться параметрами по ссылке?
    Код (Text):

    void T(int &y){
       float voltage = analogRead(A0) * VIN / 1024.0;
       float r1 = voltage / (VIN - voltage);
       float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
        y = round(temperature);
    }
    Или указателем?
    Код (Text):

    void T(int *y){
       float voltage = analogRead(A0) * VIN / 1024.0;
       float r1 = voltage / (VIN - voltage);
       float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
        *y = round(temperature);
    }
    Во втором случае вызывать так (передавать параметром не переменную, а ее адрес):
    Код (Text):

      int T1 = 0;
       T(&T1); // передаем адрес переменной
     
    Хотя в данном конкретном случае возвращать через return в любом случае логичнее.
     
  15. mike_KH

    mike_KH Гик

    Код (Text):

    #include <math.h>
    #define TERMIST_B 4300
    #define VIN 5.0
    #define RESET_PIN 6
    #define CLOCK_PIN 7
    #define RDip 8
    #define LDip 9
    int var = 0;

     void R()
    {
        digitalWrite(RESET_PIN, HIGH);
        digitalWrite(RESET_PIN, LOW);
    }

    void D (int x){
         while(var < x) {
        digitalWrite(CLOCK_PIN, HIGH);
        digitalWrite(CLOCK_PIN, LOW);
        var++;
    }

    }
    int T (){
      float voltage = analogRead(A0) * VIN / 1024.0;
      float r1 = voltage / (VIN - voltage);
      float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
      Serial.println(temperature);
      return round(temperature);

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

    }
    void loop()
    {
       int T1 = T();
       Serial.print(T1);
       D(T1);
       delay(1000);
       R();
       int T2 = T();
       Serial.println(T2);
       D(T2);
      if (T1 = T2){
       digitalWrite(LDip , HIGH);
       digitalWrite(RDip , HIGH);
      }
      else if (T1 > T2) {
        digitalWrite(RDip , HIGH);
        digitalWrite(LDip , LOW);
      }
      else if (T1 < T2) {
       digitalWrite(LDip , HIGH);
        digitalWrite(RDip , LOW);
      }
    }




     
    Теперь не выводит данные на 7ми сегментник
     
  16. dnk

    dnk Нерд

    Потому что функция D работает неправильно. Переменная var должна обнуляться в начале цикла, т.к. после него она становится равной x и это значение сохраняется между вызовами функции D. А лучше ее вообще не использовать, как предлагал выше DrProg.
    Кстати, еще одна ошибка:
    Код (Text):

      if (T1 = T2){
     
    Это условие будет выполняться всегда, кроме случая, когда T2 = 0. Потому что оператор = это не проверка на равенство, а присвоение переменной T1 значения T2. Правильно писать:
    Код (Text):

      if (T1 == T2) {
     
     
    Последнее редактирование: 8 май 2015
  17. mike_KH

    mike_KH Гик

    Спасибо как я сам не заметил))
     
  18. mike_KH

    mike_KH Гик

    Хммм... Сейчас выводит число 52 и тд. Измерив температуру оказалось что она 26, а 26*2=52, интересно наверное я что то упустил((
     
  19. mike_KH

    mike_KH Гик

    Но при это все правильно работает в отношении точек))
     
  20. mike_KH

    mike_KH Гик

    Может просто разделить на 2))