Re: Otevírání a zavírání dveří pomocí krokového motoru
Napsal: 13 čer 2020, 07:32
Jsem take něco takoveho dělal a použil heblo na oteviraní okna v autě z vrakače za 100 kč.
České fórum pro všechny nadšence do Arduina a dalších technologií.
https://forum.hwkitchen.cz/
Kód: Vybrat vše
#define in1 6 //jeden pól motoru
#define in2 7 //druhý pól motoru
#define koncak_dole 2 // piny 2 a 3 fungujou s interupty
#define koncak_nahore 3 // piny 2 a 3 fungujou s interupty
unsigned long doba_otvirani = 10000;
void setup() {
//pinMode(enA, OUTPUT);
pinMode(koncak_dole, INPUT_PULLUP);
pinMode(koncak_nahore, INPUT_PULLUP);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
//pinMode(button, INPUT);
digitalWrite(in1, LOW); // Set initial rotation direction
digitalWrite(in2, LOW); // Set initial rotation direction
attachInterrupt(digitalPinToInterrupt(koncak_dole), otevri, FALLING);
attachInterrupt(digitalPinToInterrupt(koncak_nahore), zavri, FALLING);
}
void otevri() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(10000);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
delay(10000);
}
void zavri() {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
delay(doba_otvirani);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
delay(2000);
}
void loop() {
delay(8000);
}
Kód: Vybrat vše
#define in1 6 //jeden kontakt motoru
#define in2 7 //druhý kontakt motoru
#define koncak_dole 2
#define koncak_nahore 3
#include "RTClib.h"
DS3231 rtc;
int doba_otvirani = 60000; //po prekroceni teto doby otvirani se vypne motor a ukonci program
int casOtevreniHod = 8;
int casOtevreniMin = 30;
int casZavreniHod = 20;
int casZavreniMin = 30;
int casOtevreni = casOtevreniHod * 60 + casOtevreniMin; //prevod hodin a minut pouze na minuty
int casZavreni = casZavreniHod * 60 + casZavreniMin; //prevod hodin a minut pouze na minuty
int aktualniCas;
void setup() {
Serial.begin(9600);
pinMode(koncak_dole, INPUT_PULLUP); //použité koncáky jsou NO, takže na pinech pro koncák bude HIGH stav (díky pullup), dokud nesepne koncák a připojí je k GND
pinMode(koncak_nahore, INPUT_PULLUP);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
digitalWrite(in1, LOW); // vypnutí motoru
digitalWrite(in2, LOW); // vypnutí motoru
}
void otevri() { // Funkce pro otevirani. Roztoci motor do doby, než sepne horní koncák.
int doba = 0;
int doba_sek;
Serial.print("Zahajeno otevirani")
while (digitalRead(koncak_nahore) == HIGH)
{
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
delay(200);
doba++;
doba_sek=doba/5; // doba trvání funkce ,,otevri,, - POZOR! závislé na délce předchozího delay
if (doba_sek > doba_otvirani){ //Pokud je překročen limit času otvírání, tak se zapne delay, až do sepnutí koncáku, aby se nezničil motor
digitalWrite(in1, LOW); //vypnout motor
digitalWrite(in2, LOW); //vypnout motor
while (digitalRead(koncak_nahore) == HIGH){
delay (60000);
}
}
}
digitalWrite(in1, LOW); //vypnout motor
digitalWrite(in2, LOW); //vypnout motor
delay(60000);
}
void zavri() { //Analogie k funkci ,,otevri,,
int doba = 0;
int doba_sek;
while (digitalRead(koncak_dole) == HIGH)
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
delay(200);
doba++;
doba_sek=doba/5; // doba trvání funkce ,,otevri,, - POZOR! závislé na délce předchozího delay
if (doba_sek > doba_otvirani){ //Pokud je překročen limit času otvírání, tak se zapne delay, až do sepnutí koncáku, aby se nezničil motor
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
while (digitalRead(koncak_dole) == HIGH){
delay (60000);
}
}
}
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
delay(60000);
}
void loop() { //Zjištuje se čas. Pokud je čas, kdy má být otevřeno a není, tak zahájí funkci otevři - a naopak.
DateTime now = rtc.now();
aktualniCas = now.hour() * 60 + now.minute(); //převedení aktuálního čas z hodin a minut na pouze minuty
if (aktualniCas >= casOtevreni && aktualniCas <= casZavreni)
{
if (digitalRead(koncak_dole) == HIGH)
{
otevri();
delay(1000);
}
else
{
delay(1000);
}
}
else if (aktualniCas > casZavreni || aktualniCas < casOtevreni)
{
if (digitalRead(koncak_nahore) == HIGH)
{
zavri();
delay(1000);
}
else
{
delay(1000);
}
}
delay(1000); // One second delay
}