Энкодер "не дружит" с датчиком температуры
- Войдите на сайт для отправки комментариев
Вс, 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мкс, поэтому с энкодером проблемы.
читайте температуру без библиотеки
на форуме это уже обсуждалось, поищите