Für die Ansteuerung des Servomotors über Pulsdauermodulation müssen zuerst wichtige Konstanten definiert werden. Bedeutungen der Konstanten:

  • freq: Die Frequenz des PWM-Kanals in Hz
  • resolution: Die Auflösung des PWM-Kanals in bit
  • channel: Die Nummer des PWM-Kanals
  • servoPin: Der Anschluss-Pin des Servomotors
  • minTemp: Die minimale Temperatur auf der eigenen Temperaturanzeige in °C
  • maxTemp: Die maximale Temperatur auf der eigenen Temperaturanzeige in °C 
//Konstanten für die Ausgabe der Temperatur über den Servomotor
#define freq 50
#define resolution 8
#define channel 1
#define servoPin 13
#define minTemp 15      //minimale Temperatur vom DS18B20: -55°C
#define maxTemp 35      //maximale Temperatur vom DS18B20: +125°C


Als nächstes muss der Servomotor in der setup() Methode initialisiert werden. Mit der ledcSetup() Methode legt man den Kanal, die Frequenz und die Auflösung der PWM-Ansteuerung fest. Die ledcAttachPin() Methode weist den angegebenen Pin einem Kanal zu. Zuletzt wird der Servomotor mit der ledcWrite() Methode in seine Grundstellung gebracht. Dazu wird der zugewiesene Kanal angesteuert. Der zweite Parameter der Methode gibt den Tastgrad an. Dabei wäre bei einer Auflösung von 8 Bit, 255 der maximale Tastgrad. Welcher Tastgrad die Grundstellung des Servomotors ist, hängt sowohl vom Servomotor, als auch von der Steuerspannung ab.

  //Servo initialisieren
  ledcSetup(channel, freq, resolution);
  ledcAttachPin(servoPin, channel);
  ledcWrite(channel, 20);

In der loop() Methode muss der Servomotor nun in Abhängigkeit von der Temperatur gesteuert werden. Mit Hilfe der map() Methode kann ein Wertebereich in einen anderen Wertebereich umgerechnet werden. Für die Steuerung des Servomotors wird die Temperatur in den Tastgrad umgerechnet. Der Minimal- und Maximalwert des Tastgrads muss für jeden Servomotor einzeln ausprobiert und angepasst werden. Natürlich kann auch die Auflösung des PWM-Kanals angepasst werden.

  //Ansteuerung des Servomotors
  int servoPos = map(tC, maxTemp, minTemp, 4, 33); //min und max wurden vertauscht, damit die Richtung des Zeigers passt
ledcWrite(channel, servoPos);
Zuletzt geändert: Montag, 22. Januar 2024, 10:22