Arduino Servo с датчиком температуры (TMP36)

Суть программы заключается в измерении температуры, и если температура выше 26 градусов, сервопривод поворачивается на 45 градусов, а если ниже, то вращается на 179 градусов. Однако происходит короткое замыкание. В момент первого вращения сервопривода температура подскакивает до 40 градусов (температура рассчитывается по напряжению), и после этого сервопривод непрерывно вращается вперед и назад, потому что температура колеблется между 40 и 20 градусами. В чем может быть причина этой проблемы?

Мой код:

#include <Servo.h>
Servo myServo;
const int sensorPin = A0;
const float baselineTemp = 20.0;
int angle;
void setup() {
  myServo.attach(9);
  Serial.begin(9600);
}

void loop() {
  int sensorVal = analogRead(sensorPin);
  Serial.println("Sensor Value: ");
  Serial.print(sensorVal);
  float voltage = (sensorVal/1024.0) * 5.0;
  Serial.println("Volts:");
  Serial.print(voltage);
  Serial.println("Celcius:");
  float temperature = (voltage - .5) * 100;
  Serial.print(temperature);
  if (temperature < baselineTemp) {
    myServo.write(179);
  } else {
    myServo.write(45);
  }
  delay(800);
}

Вывод в терминал:

sensorVal: 149
 Volts:0.73
 Celcius:22.75
 sensorVal: 192
 Volts:0.94
 Celcius:43.75
 sensorVal: 154
 Volts:0.75
 Celcius:25.20
 sensorVal: 188
 Volts:0.92
 Celcius:41.80
 sensorVal: 150
 Volts:0.73
 Celcius:23.24
 sensorVal: 184
 Volts:0.90
 Celcius:39.84
 sensorVal: 151

Сервопривод справа, tmp слева

, 👍3

Обсуждение

Все ли заземления подключены?, @Sim Son

В чем может быть причина этой проблемы? ... сервопривод, @jsotola

@SimSon У меня только один GND, и он подключен к «-», @Pain

голосую за удаление изображения и размещение текста, @jsotola

@jsotola Можете ли вы сказать мне, почему это происходит?, @Pain

возможно, напряжение питания меняется при работе сервопривода, @jsotola


1 ответ


Лучший ответ:

1

Вам необходимо запитать сервопривод от отдельного источника питания. Устройства высокой мощности, такие как двигатели и т. д., не должны получать питание через регулятор Arduino. Это, безусловно, влияет на AnalogRead() и, следовательно, на показания температуры, как уже отмечал @jsotola.

Во-вторых, сюда нужно добавить некоторый гистерезис, чтобы предотвратить постоянные колебания, когда температура близка к базовой линии:

if (temperature < baselineTemp) { myServo.write(179); } 
else { myServo.write(45); }

Может быть, попробуйте что-нибудь вроде:

if (temperature < baselineTemp - 1.0 ) { myServo.write(179); } 
elseif (temperature > baselineTemp + 1.0 ) { myServo.write(45); }

Вы также можете попробовать добавить конденсатор на шины питания датчика температуры, скажем, 10 мкФ, очень близко к самому датчику.

,