Automatische rolgordijnen pt2
Contents
Inleiding
In het vorige bericht heb ik het al aangetipt. Ik ben bezig om mijn rolgordijnen te automatiseren.
Op dit moment ben ik al weer een stukje verder hiermee. Het is niet zo maar een projectje wat ik ff doe. Hier moet ik ook wel even bij na denken.
Het project tot nu toe
Ondanks alle bedrading, koppelingen en dergelijke werkt het redelijk naar behoren.
Zoals te zien is, is het één grote bende wat betreft de bedrading.
Maar het werkt wel… Ik moet alleen alles nog een keer fatsoeneren.
Het werkt nu als volgt:
Door een wipschakelaar wordt gekozen voor welk rolgordijn er moet worden opgewikkeld dan wel moet worden afgewikkeld.
Als dit is gedaan, kan met de up/down knoppen het rolgordijn naar boven / beneden worden bewogen.
Volgende stap
stoppers
Een volgende stap is om stoppers er op te maken, zodat niet elke keer het rolgordijn om zijn buis heen gaat klapperen.
De bedoeling is, dat het openen en dichtgaan van de rolgordijnen op de volgende manieren kan gebeuren
- via de knoppen
- automatisch
- via de telefoon
voor de automatische stand en via de telefoon zijn de stoppers nodig. Als namelijk het rolgordijn voor 3/4 omhoog is gehaald, dan moet de automatische stand wel weten wanneer hij moet stoppen. Hiervoor moet ik dus nog aan het puzzelen.
Knop voor automatisch
De knop voor automatisch heb ik er ook nog niet in zitten. Dit moet ook nog allemaal worden uitgezocht.
Schema en code
Het schema staat hieronder. Ik maak gebruik van relays om de 12v (voor de aansturing van de motoren) te schakelen alsmede een relay wat wordt gebruikt om tussen de motoren te kiezen.
Kiezen tussen motoren
Dit gebeurt door middel van een relay. Deze schakelt de werkspanning van het printje met de sturing ULN2003 aan of uit. Hierdoor wordt één bepaalde motor gestuurd.
Door op de rocker-switch te klikken, wordt er gekozen tussen de verschillende motoren die worden aangestuurd. Er wordt een relay bekrachtigd en zo wordt er een brug gevormt op het printje. Dit is de on/off jumper welke wordt gemaakt of verbroken. Zo bepaal ik welke motor moet lopen
het schema
Voor een grotere view van het schema klik het rechts aan en kies voor Afbeelding bekijken.
De code
Dit is nog een ander verhaal. De code is redelijk te doen en ik heb geen moeilijke dingen gebruikt.
Het is ook niet de netste code, maar dat mogen jullie zelf gaan regelen.
int bluePinMotor1 = 2; //IN1 on the ULN2003 Board, BLUE end of the Blue/Yellow motor coil int pinkPinMotor1 = 3; //IN2 on the ULN2003 Board, PINK end of the Pink/Orange motor coil int yellowPinMotor1 = 4; //IN3 on the ULN2003 Board, YELLOW end of the Blue/Yellow motor coil int orangePinMotor1 = 5; //IN4 on the ULN2003 Board, ORANGE end of the Pink/Orange motor coil //going up //Keeps track of the current step. //We'll use a zero based index. int rolShadeSwitchPin = 6; //switch between rolShades int powerRelayPin = 7; //switch 12v power on/off int currentStep = 0; int upPin = 8; //pin for rolShade up int downPin = 9; //pin for rolShade down int motorRelayPin = 11; //activate motor from chosen shade void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(bluePinMotor1, OUTPUT); pinMode(pinkPinMotor1, OUTPUT); pinMode(yellowPinMotor1, OUTPUT); pinMode(orangePinMotor1, OUTPUT); digitalWrite(bluePinMotor1, LOW); digitalWrite(pinkPinMotor1, LOW); digitalWrite(yellowPinMotor1, LOW); digitalWrite(orangePinMotor1, LOW); pinMode(upPin, INPUT_PULLUP); pinMode(downPin, INPUT_PULLUP); pinMode(rolShadeSwitchPin, INPUT_PULLUP); pinMode(powerRelayPin, OUTPUT); pinMode(motorRelayPin, OUTPUT); } void loop() { //Comment out the Serial prints to speed things up //Serial.print("Step: "); //Serial.println(currentStep); //Serial.println(digitalRead(rolShadeSwitchPin)); if (digitalRead(rolShadeSwitchPin) == LOW) { // Serial.println("motorRelayPin, LOW"); digitalWrite(motorRelayPin, LOW); } else if (digitalRead(rolShadeSwitchPin) == HIGH) { // Serial.println("motorRelayPin, HIGH"); digitalWrite(motorRelayPin, HIGH); } if (digitalRead(upPin) == LOW) { currentStep = (--currentStep >= 0) ? currentStep : 3; digitalWrite(powerRelayPin, LOW); // Serial.println(digitalRead(rolShadeSwitchPin)); } else if (digitalRead(downPin) == LOW) { currentStep = (++currentStep < 4) ? currentStep : 0; digitalWrite(powerRelayPin, LOW); // Serial.println(digitalRead(rolShadeSwitchPin)); } else { digitalWrite(powerRelayPin, HIGH); // Serial.println(digitalRead(rolShadeSwitchPin)); } switch (currentStep) { case 0: digitalWrite(bluePinMotor1, HIGH); digitalWrite(pinkPinMotor1, HIGH); digitalWrite(yellowPinMotor1, LOW); digitalWrite(orangePinMotor1, LOW); break; case 1: digitalWrite(bluePinMotor1, LOW); digitalWrite(pinkPinMotor1, HIGH); digitalWrite(yellowPinMotor1, HIGH); digitalWrite(orangePinMotor1, LOW); break; case 2: digitalWrite(bluePinMotor1, LOW); digitalWrite(pinkPinMotor1, LOW); digitalWrite(yellowPinMotor1, HIGH); digitalWrite(orangePinMotor1, HIGH); break; case 3: digitalWrite(bluePinMotor1, HIGH); digitalWrite(pinkPinMotor1, LOW); digitalWrite(yellowPinMotor1, LOW); digitalWrite(orangePinMotor1, HIGH); break; } //CCW // currentStep = (--currentStep >= 0) ? currentStep : 3; //CW //currentStep = (++currentStep < 4) ? currentStep : 0; //2000 microseconds, or 2 milliseconds seems to be //about the shortest delay that is usable. Anything //lower and the motor starts to freeze. //delayMicroseconds(2250); delay(2); }