Энкодер "не дружит" с датчиком температуры
- Войдите на сайт для отправки комментариев
Вс, 26/02/2017 - 12:54
С комментирование последних строк энкодер изменяет показания верно, а при раскомментировании значение переменной 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
}
Не знаю чё там за лажа у Вас (ваш код - вам и отлаживать), но либки которые Вы задействовали скорей всего не вытерпят совместное использование. Вобще этот случай, т.е. энкодер и ds18b20, довольно сложный. И вот почему. Датчик требует точного формирования небольших временных интервалов, десятки мксек для передачи бита. И прерывания этому сильно мешают. Потому их запрещают. И не сильно задумываясь запрещают на долго, на весь обмен, иногда и на 750мсек. А енкодер как раз требует быстрой и своевременной обработки прерывания. Иначе он начинает глючить особенно на скорости.
Не скажу чтоб задача не решаемой в принципе, она решаема но требует понимания, а не юзанья стандартных либ.
DallasTemperature имеет задержку 750мкс, поэтому с энкодером проблемы.
читайте температуру без библиотеки
на форуме это уже обсуждалось, поищите