Проблема совместной работы ds18b20 и сервами.

Vlad_os

✩✩✩✩✩✩✩
28 Ноя 2019
27
0
Столкнулся с тем, что когда одновременно опрашиваешь датчик температуры DS18B20 с помощью библиотеки OneWire и рулишь сервами, сервы как-то странно себя ведут. Я понимаю что это связано с библиотекой и что и сервы по одиночному проводу работают, и что датчик температуры тоже данные шлёт по одному проводу (у каждого устройства свой одиночный провод для данных). Даже если опрашивать датчик раз в секунду. Но как это стабилизировать это всё я не знаю. Прошу помощи. Заранее спасибо.
C++:
#include <Servo.h>
#include <OneWire.h>
OneWire ds(7);
Servo H_servo;
Servo C_servo;
int angle = 45; // normal angle
int REV_angle = 45; // reverse angle
float temperature;
void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(8, 0);
  digitalWrite(9, 1);
  H_servo.attach(2);
  C_servo.attach(3);
}

void loop() {
  detectTemperature();
  H_servo.write(angle);
  C_servo.write(REV_angle);
}
void detectTemperature() {

  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);

  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();

  temperature =  ((data[1] << 8) | data[0]) * 0.0625;
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Дайте сервам по 30 мс на то . что бы занять свое положение
для начала просто после каждого write сервы сделайте delay(30)
 

Vlad_os

✩✩✩✩✩✩✩
28 Ноя 2019
27
0
Попробовал, delay немного улучшил, но не убрал мелкие подёргивания серв.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
1) Вы настроили точность датчика температуры ? по умолчанию стоит максимальная точность и ее получение занимает 0.7 секунды. Запросы каждый 1 мс нафиг не нужны
2) Если угол сервы не поменялся (отдельно запоминать угол сервы не надо, достаточно прочитать Servi.read()) - не теребонькайте ее почем зря.
3) Если серва не критична к удержанию позиции и самопроизвольно не поменяет положение, то после завершения движения можно сделать ей детач.
 

Vlad_os

✩✩✩✩✩✩✩
28 Ноя 2019
27
0
Вот так вроде работает
C++:
  if (angle != angle_track||REV_angle != REV_angle_track) {
    H_servo.attach(2);
    C_servo.attach(3);
    H_servo.write(angle);
    C_servo.write(REV_angle);
    delay(30);
    H_servo.detach();
    C_servo.detach();
    angle_track=angle;
    REV_angle_track=REV_angle;
  }
 

Vlad_os

✩✩✩✩✩✩✩
28 Ноя 2019
27
0
Понял, благодарю за разъяснение вопроса.