Рывки сервопривода в связке с температурными датчиками

itehno
Offline
Зарегистрирован: 18.04.2015

Всем доброго времени суток. 

Прошу помощи у гуру.

К Arduino Uno подключены:

1. Сервопривод управляемый с помощью потенциометра

2. Два температурных датчика

Проблема заключается в том, что при одновременной работе датчиков и сервопривода, последний начинает постоянно подёргиваться, нет плавности хода. Если закоментировать все строки, связанные с датчиками температуры, то все работает прекрасно.

Может есть идеи? Заранее спасибо.

 

Вот мой код:

#include <OneWire.h> //Подключаем библиотеку температурных датчиков
#include <DallasTemperature.h> //Подключаем библиотеку температурных датчиков
#define ONE_WIRE_BUS 10 //Объясняем контроллеру, на какой порт подключены температурные датчики
  OneWire oneWire(ONE_WIRE_BUS); //Настройка OneWire для работы с OneWire устройствами
  DallasTemperature sensors(&oneWire); //Передача данных oneWire в dallasTemperature
  DeviceAddress Thermometer1 = { 
  0x28, 0xA8, 0xB9, 0x89, 0x06, 0x00, 0x00, 0xC4 }; //Адресс датчика
  DeviceAddress Thermometer2 = { 
  0x28, 0x0C, 0xB3, 0x89, 0x06, 0x00, 0x00, 0xF9 }; //Адресс датчика
#include <Servo.h> //Подключаем библиотеку сервопривода
  Servo myservo;        //Присваиваем имя сервоприводу
#define potenciometr A0 //Объясняем контроллеру, на какой порт подключен переменный резистор
  int temp_1, temp_2;                //Объявляем переменные температурных датчиков
  int val; //Создаем переменную val
 
void setup()
{
  sensors.begin(); //Запуск библиотеки
  sensors.setResolution(Thermometer1, 10); //Установка разрешения 10 бит
  sensors.setResolution(Thermometer2, 10); //Установка разрешения 10 бит
  myservo.attach(11); //Указываем пин, к которому подключен сервопривод
  pinMode(potenciometr, INPUT); //Определение режима работы вывода
  Serial.begin(9600); //Открывам COM Port на скорости 9600
}
void printTemperature(DeviceAddress deviceAddress,const char* NumSensor ) //Функция вывода температуры для устройства
{
  int tempC = sensors.getTempC(deviceAddress);
  Serial.print(NumSensor); //Вывод значений
  Serial.println(tempC);                        //Перенос на новую строку
}
 
void loop()
{
  sensors.requestTemperatures(); //Отправляем команду для получения температуры
  printTemperature(Thermometer1,"1 "); //Выводим значения первого датчика, начинающиеся с символов 1 + пробел
  printTemperature(Thermometer2,"2 "); //Выводим значения второго датчика, начинающиеся с символов 2 + пробел
  temp_1= sensors.getTempC(Thermometer1); //Получение данных в переменную с термометра 1
  temp_2= sensors.getTempC(Thermometer2); //Получение данных в переменную с термометра 2
 
  val = analogRead(potenciometr); //Считывает значение потенциометра (величина между 0 и 1023)
  val = map(val, 0, 1023, 0, 179); //Масштабирует его для использования с сервоприводом (значение между 0 и 180)
  myservo.write(val); //Устанавливает позицию серво в соответствии с масштабируемым значением
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не используй библиотеку dallas

itehno
Offline
Зарегистрирован: 18.04.2015

jeka_tm пишет:

не используй библиотеку dallas

Я заметил, что проблемма в этом участке кода:

sensors.requestTemperatures(); //Отправляем команду для получения температуры
  printTemperature(Thermometer1,"1 "); //Выводим значения первого датчика, начинающиеся с символов 1 + пробел
  printTemperature(Thermometer2,"2 "); //Выводим значения второго датчика, начинающиеся с символов 2 + пробел
  temp_1= sensors.getTempC(Thermometer1); //Получение данных в переменную с термометра 1
  temp_2= sensors.getTempC(Thermometer2); //Получение данных в переменную с термометра 2
эд
Offline
Зарегистрирован: 02.05.2015

что у вас за система?

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Система обычная: нажал кнопку и дома :)

эд
Offline
Зарегистрирован: 02.05.2015

а нуда! точно! а я главное ещё думаю зачем там потенциометр и два термодатчика а аказывается вон оно что. спасибо кеп! просветил!

bwn
Offline
Зарегистрирован: 25.08.2014

itehno пишет:

jeka_tm пишет:

не используй библиотеку dallas

Я заметил, что проблемма в этом участке кода:

sensors.requestTemperatures(); //Отправляем команду для получения температуры
  printTemperature(Thermometer1,"1 "); //Выводим значения первого датчика, начинающиеся с символов 1 + пробел
  printTemperature(Thermometer2,"2 "); //Выводим значения второго датчика, начинающиеся с символов 2 + пробел
  temp_1= sensors.getTempC(Thermometer1); //Получение данных в переменную с термометра 1
  temp_2= sensors.getTempC(Thermometer2); //Получение данных в переменную с термометра 2

В Dallas библиотеке задержка в 750мС от которой просто так вы не уйдете. Делайте на OneWire, код