da in meinem Haus eine Fußbodenheizung mit Rücklauftemperaturbegrenzer (war vor 25 Jahren so) eingebaut ist, überlege ich schon seit Jahren, wie man das steuern könnte, da die Heizung so 24 Stunden heizt. Nun habe ich dafür etwas gebastelt, um den RTL via CCU zu regeln. Vielleicht kann es der Eine oder Andere gebrauchen.
An Bauteilen wird benötigt:
1 x Arduino Uno
1 x Stepper-Motor-Shield gibt's z.B. hier
1 Zahnrad mit 64 und eines mit 32 Zähnen gibt's z.B. hier
1 Steppermotor mit Getriebe (Nema 14 mit Planetengetriebe 51:1) wie z.B. den hier
1 x Motorhalterung entsprechend der Gegebenheiten (ich habe einen einfachen 90°-Winkel genommen)
1 x 8-Kanal-Empfangsmodul HM-MOD-Re-8
1 x Netzteil 6V/1A
1 x Arduino Grundwissen und viel Geduld
Als erstes wird in das 64er Zahnrad mit einer Lochsäge ein Loch gesägt, das etwas kleiner ist als der RTL. Anschließend mit einer Feille auf den exakten Durchmesser erweitert. Dann das Zahnrad auf den RTL schieben und fest(!) verkleben. Ich habe dafür einen UV-härtenden Kleber verwendet.
Dann wird das 32er Zahnrad auf die Getriebewelle des Schrittmotors geschoben. Jetzt müßt ihr schauen, wie ihr die Halterung mit dem Motor befestigen könnt, damit die Zahnräder ineinander greifen und nirgends streifen. Wenn alles paßt, wird durch Zahnrad und Anriebswelle ein kleines Loch gebohrt und das Ganze mittels Splint o.ä. fixiert.
Arduino sowie Motorshield fertig zusammenlöten (falls nicht fertig gekauft). Auf eine Lochrasterplatine entsprechende Sockelleisten für den Arduino und das HM-MOD-Re-8 löten. Das Motor-Shield wird direkt auf den Arduino gesteckt. Die Pins 8, 9, 10, 11 und 12 des Arduino werden mit den Pins Out 1, 2, 3, 4 und 5 des HM-MOD-Re-8 verbunden und jeweils mit einem 10kOhm Pullup-Widerstand auf Plus gelegt. Das Motor-Shield ist unbedingt an das Netzteil anzuschließen. Bei einer Stromaufnahme von 0,8A raucht sonst die USB-Buchse ab.
Hier dann der Arduino-Sketch dazu (der ist sicher noch verbesserungswürdig - dazu reichen meine Programmierkenntnisse aber leider nicht aus)
Code: Alles auswählen
/*
For use with the Adafruit Motor Shield v2
----> http://www.adafruit.com/products/1438
*/
#include <Wire.h>
#include <Adafruit_MotorShield.h>
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61);
// Connect a stepper motor with 200 steps per revolution (1.8 degree) to motor port #1 (M1/M2) oder #2 (M3/M4);
Adafruit_StepperMotor *Motor = AFMS.getStepper(200, 1);
int Comfort=8; // Taster an Pin8
int Eco=9; // Taster an Pin9
int Aus=10; // Taster an Pin10
int RW=11; //Taster an Pin11 - 100 Schritte Richtung Aus
int FW=12; //Taster an Pin12 - 100 Schritte Richtung Comfort
int ComfortSet=HIGH;
int EcoSet=HIGH;
int AusSet=HIGH;
int Forward=HIGH;
int Backward=HIGH;
int ComfortPosition=2;
int EcoPosition=1;
int AusPosition=0;
int AktuellePosition;
int StartPosition;
void setup()
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Schrittmotor Nema");
pinMode(Comfort, INPUT);
pinMode(Eco, INPUT);
pinMode(Aus, INPUT);
pinMode(RW, INPUT);
pinMode(FW, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz
Motor->setSpeed(100); // 10 rpm (je höher der Wert, desto niedriger das Drehmoment)
AktuellePosition=ComfortPosition;
}
void loop()
{
ComfortSet=digitalRead(Comfort); //Zunächst werden die Eingänge abgefragt.
EcoSet=digitalRead(Eco);
AusSet=digitalRead(Aus);
Forward=digitalRead(FW);
Backward=digitalRead(RW);
while(ComfortSet==HIGH && EcoSet==HIGH && AusSet==HIGH && Forward==HIGH && Backward==HIGH)
{
ComfortSet=digitalRead(Comfort);
EcoSet=digitalRead(Eco);
AusSet=digitalRead(Aus);
Forward=digitalRead(FW);
Backward=digitalRead(RW);
}
if(ComfortSet == LOW)
{
Serial.println("Comfort");
if(AktuellePosition==0)
{Motor->step(7500, FORWARD, DOUBLE);}
else if(AktuellePosition==1)
{Motor->step(3800, FORWARD, DOUBLE);}
else if(AktuellePosition==2)
{Motor->step(0, FORWARD, DOUBLE);}
AktuellePosition=2;
Serial.println(AktuellePosition);
Motor->release();
delay(500);
}
else if(EcoSet == LOW)
{
Serial.println("Eco");
if(AktuellePosition==0)
{Motor->step(3700, FORWARD, DOUBLE);}
else if(AktuellePosition==1)
{Motor->step(0, FORWARD, DOUBLE);}
else if(AktuellePosition==2)
{Motor->step(3800, BACKWARD, DOUBLE);}
AktuellePosition=1;
Motor->release();
Serial.println(AktuellePosition);
delay(500);
}
else if(AusSet == LOW)
{
Serial.println("Aus");
if(AktuellePosition==0)
{Motor->step(0, FORWARD, DOUBLE);}
else if(AktuellePosition==1)
{Motor->step(3700, BACKWARD, DOUBLE);}
else if(AktuellePosition==2)
{Motor->step(7500, BACKWARD, DOUBLE);}
AktuellePosition=0;
Serial.println(AktuellePosition);
Motor->release();
delay(500);
}
else if(Forward == LOW)
{
Serial.println("100 Schritte vorwärts");
{Motor->step(100, FORWARD, DOUBLE);}
Motor->release();
delay(500);
}
else if(Backward == LOW)
{
Serial.println("100 Schritte rückwärts");
{Motor->step(100, BACKWARD, DOUBLE);}
Motor->release();
delay(500);
}
}
Erläuterung zur Funktionsweise:
Je nach Stellung des Motors wird bei entsprechendem Signal der Motor um die entsprechenden Schritte vorwärts oder Rückwärts bewegt und diese Position wird dann gespeichert. Das Einstellen der jeweils benötigten Schrittzahl erfordert viel Zeit und Geduld. Über die Pins 11 und 12 lassen sich Korrekturen vornehmen, ohne das die gespeicherte Position geändert wird.
Dann auf der CCU je ein Programm erstellen für Comfort, Eco und Aus. Ich verwende als Auslöser je eine virtuelle Taste, die ich dann in entsprechende Zeitsteuerungen einbaue.
Wichtig ist, dass die Einschaltdauer nur 0,5 Sekunden betragen darf!