Разница между двумя значениями.

Тема в разделе "Arduino & Shields", создана пользователем Artclonic, 28 мар 2018.

  1. Artclonic

    Artclonic Гик

    Добрый вечер, голову сломал... Как записать расчет разницы между предыдущим и существующим значением? Т.е.loop онлайн минус предыдущее значение в loop...
    Вот пример кода генерации случайного значения, как учесть предыдущее?
    Код (C++):
    long randNumber;
    int a=0;
    int b=10;
    int x1;
    int x2;
    int d;

    void setup(){
      Serial.begin(9600);
      randomSeed(analogRead(0));
    }

    void loop() {
      // выводим случайное число из диапазона 10..19
      randNumber = random(a, b);
     
      x1=randNumber;
      d=x2-x1;
      x2=randNumber; //Как записать предыдущее значение в loop?????
     
     
     
      Serial.println(d);
     
       delay(250);
    }
     
     
  2. ELITE

    ELITE Гик

    у вас всё учтено - вот только рандом у ардуины это совсем не рандом...
    ну и х2=х1;
     
  3. Artclonic

    Artclonic Гик

    Не понял...
    Вот это правильно было?

    глобально объяви переменную
    например int i=0; int j=0; int result = 0;

    а в лупе переназначай и сравнивай
    i = rnd(1,5,);
    result = i-j ;
    j = i;
     
  4. ELITE

    ELITE Гик

    да у вас так и сделано по факту - вот и удалил за неактуальностью
     
  5. parovoZZ

    parovoZZ Гуру

    я тож сумневался. Оказывается рандом это analogread(pin),
     
  6. Asper Daffy

    Asper Daffy Иксперд

    Не совсем. Если переменная не используется ни в какой другой функции, но нужно сохранять её значения между вызовами, то правильно объявить её static прямо в этой функции.

    Если Вам нужно именно разница (положительная), то возможно, нужно использовать abs, т.к. Вы не знаете кто больше новое или старое
     
  7. Artclonic

    Artclonic Гик

    Не мне нужен градиент Текущее значение минус предыдущее, а какая она положительная... или отрицательная....Это не важно, главное она фактическая
     
  8. Asper Daffy

    Asper Daffy Иксперд

    Ну, значит, без abs, а остальное, как я написал.
     
  9. Artclonic

    Artclonic Гик

    Попробывал вот на таком скетче... Не получается... Или мне надо с читывать данные с датчика два раза?
    Код (C++):
    #include <OneWire.h>
    /*
    * Описание взаимодействия с цифровым датчиком ds18b20
    * Подключение ds18b20 к ардуино через пин 8
    */

    OneWire ds(8); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком
    void setup(){
      Serial.begin(9600);
    }
    void loop(){
      // Определяем температуру от датчика DS18b20
      byte data[2]; // Место для значения температуры
     
      ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
      ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство
      ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
     
      delay(1000); // Микросхема измеряет температуру, а мы ждем.
     
      ds.reset(); // Теперь готовимся получить значение измеренной температуры
      ds.write(0xCC);
      ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
      // Получаем и считываем ответ
      data[0] = ds.read(); // Читаем младший байт значения температуры
      data[1] = ds.read(); // А теперь старший
      // Формируем итоговое значение:
      //    - сперва "склеиваем" значение,
      //    - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
      float temperature =  ((data[1] << 8) | data[0]) * 0.0625;

     //    - далее код вычисления разницы температур
    int x1=temperature;
    int d=x2-x1;  //    - получаем разницу значени
    int x2=temperature;

      // Выводим полученное значение разницы температур (предыдущии и текущии) в монитор порта
      Serial.println(d);
     
    }
     
  10. parovoZZ

    parovoZZ Гуру

    а что, здесь компилятор даже предупреждение не даёт о несоответствии типов переменных?

    Код (C++):
      float temperature =  ((data[1] << 8) | data[0]) * 0.0625;

    //    - далее код вычисления разницы температур
    int x1=temperature;
     
  11. Artclonic

    Artclonic Гик

    Я не проверял... честно... Мне бы логику понять, как правильно сделать...Туь понял, что int и floаt разные типы..Но все же про саму логику предыдущего значения..(предположим что они все int.....)
     
  12. parovoZZ

    parovoZZ Гуру

    x2 переменную объяви как static
     
  13. Artclonic

    Artclonic Гик

    Получается, что мы заFиксировали значение на один цикл, правильно?
     
  14. Artclonic

    Artclonic Гик

    Ругается на
    Код (C++):
    static mx1;
    static my1;
    static mz1;
    error: 'mx2' does not name a type
     
  15. Asper Daffy

    Asper Daffy Иксперд

    Чего ты там "попробывал", если он у тебя не компилируется?
     
  16. Artclonic

    Artclonic Гик

    это вопрос? Или утверждение?
    Код пример...
    Вот этот кусок компелируется...
    Но ругается на tatic mx1;
    Код (C++):
    //Read the data.. 2 bytes for each axis.. 6 total bytes
      myWire1.requestFrom(addr, 6);
      if (6 <= myWire1.available()) {
        x1 = myWire1.read(); //MSB  x
        x1 |= myWire1.read() << 8; //LSB  x
        z1 = myWire1.read(); //MSB  z
        z1 |= myWire1.read() << 8; //LSB z
        y1 = myWire1.read(); //MSB y
        y1 |= myWire1.read() << 8; //LSB y
      }


      xx1=(mx1-x1);
    mx1=x1;
      yy1=(my1-y1);
      my1=y1;
      zz1=(mz1-z1);
      mz1=z1;
    'mx1' does not name a type
    Объявлены вот так
    static mx1;
    static my1;
    static mz1;
     
  17. Asper Daffy

    Asper Daffy Иксперд

    Код из поста №9 не компилирутся потому, что x2 описана после использования.

    Отсюда вопрос, как ты мог его пробовать?
    Выражения "компилируется, но ругается" я не понимаю.
     
    Последнее редактирование: 1 апр 2018
  18. parovoZZ

    parovoZZ Гуру

    А тип кто указывать будет? Неужели так сложно в яндексе поискать?
     
  19. Artclonic

    Artclonic Гик

    Понял. int потерял... должно так быть
    static int mx1;
     
  20. Artclonic

    Artclonic Гик

    Не работает... что static int, что просто int....одинаковы результат