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
@Pain, 👍3
Обсуждение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 мкФ, очень близко к самому датчику.
- Сервомотор и модуль Bluetooth блокируют друг друга
- Как заставить сервопривод вращаться на угол больше 180°
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- BMP280 возвращает 0
- Бесполезная проводка коробки и код
Все ли заземления подключены?, @Sim Son
В чем может быть причина этой проблемы?
... сервопривод, @jsotola@SimSon У меня только один GND, и он подключен к «-», @Pain
голосую за удаление изображения и размещение текста, @jsotola
@jsotola Можете ли вы сказать мне, почему это происходит?, @Pain
возможно, напряжение питания меняется при работе сервопривода, @jsotola