Энкодер "не дружит" с датчиком температуры

SubZero
Offline
Зарегистрирован: 10.02.2016

С комментирование последних строк энкодер изменяет показания верно, а при раскомментировании значение переменной norm_temp только повышаются 

#include <Wire.h> // библиотека конвертации показателей датчиков
#include <OneWire.h>// библиотека конвертации разделителя показателей
#include <DallasTemperature.h>// библиотека для датчика температуры
#include <Encoder.h>
#define button1 8  //  ввести значение button1 и присвоить ему пин 8

byte knopka1 = 0;
int norm_temp =  29; // объявление переменной norm_temp со значением 29 - нормальная температура
byte n = 0; // объявление переменной n со значением 0
long oldPosition  = -999;
long newPosition;
float temp;

#define ONE_WIRE_BUS 13
OneWire oneWire(ONE_WIRE_BUS); // берём из библиотеки конвертор перевода показателей в градусы
DallasTemperature sensors(&oneWire);// берём из библиотеки значение для температуры в виде десятки, единицы, десятые и сотые доли градуса
Encoder myEnc(10, 11);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600); // даём возможность обмена информации с ПК
  sensors.begin();// начинаем считывать показания датчиков
}

void loop() {
  Serial.println(norm_temp);
  boolean digital1 = !digitalRead(button1); // делаем инверсию сигнала с кнопки 1
  oldPosition = newPosition;
  newPosition = myEnc.read();
  //Выбор изменяемого парамемтра
  if (n > 3) // если n > 3 то
  {
    n = 0; // n присваиваем значение 0
  }
  else // иначе
  {
    if (digital1 == HIGH && knopka1 == 0)  // если кнопка 1 нажата и переменная кнопка1 = 0 то
    {
      n++; // переменной n присваиваем значение n=n+1
      knopka1++; // переменной knopka1 присваиваем значение knopka1=knopka1+1
    }
    if (digital1 == LOW && knopka1 == 1) // если кнопка 1 не нажата и переменная кнопка1 =  то
    {
      knopka1 = 0; // переменной knopka1 присваиваем значение 0
    }
  }
  if (n == 1) // если n = 1, то
  {
    if (newPosition != oldPosition)
    {
      if (newPosition > oldPosition)  // если кнопка 2 нажата и переменная кнопка2 = 0 то
        norm_temp++; // переменной norm_temp присваиваем значение norm_temp=norm_temp+1
      else
        norm_temp--;
    }
  }
  //sensors.requestTemperatures(); // считываем показания с датчика температуры
  //temp = sensors.getTempCByIndex(0); // записываем значение тепературы в переменную temp
}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Не знаю чё там за лажа у Вас (ваш код - вам и отлаживать), но либки которые Вы задействовали скорей всего не вытерпят совместное использование. Вобще этот случай, т.е. энкодер и ds18b20, довольно сложный. И вот почему. Датчик требует точного формирования небольших временных интервалов, десятки мксек для передачи бита. И прерывания этому сильно мешают. Потому их запрещают. И не сильно задумываясь запрещают на долго, на весь обмен, иногда и на 750мсек. А енкодер как раз требует быстрой и своевременной обработки прерывания. Иначе он начинает глючить особенно на скорости.

Не скажу чтоб задача не решаемой в принципе, она решаема но требует понимания, а не юзанья стандартных либ.

vvadim
Offline
Зарегистрирован: 23.05.2012

DallasTemperature имеет задержку 750мкс, поэтому с энкодером проблемы.

читайте температуру без библиотеки

на форуме это уже обсуждалось, поищите