Napsal jsem následující kód a myslím, že problém už bude asi ve funkci ,,otevri,, která je vnořená do programu a má být vyvoláva v určený čas.
V současné době moje zapojení dělá tohle ihned po tom, co zapnu napájení log obvodů (5V) a motoru (12V):
https://www.youtube.com/watch?v=9DwJA3zm2sk
Skoro se to netočí a nebo jen málo a vibrace jsou šílené.
Zkoušel jsem na driveru A4988 měnit z plného kroku na různé mikrokroky, ale to nepomohlo. Dále jsem zkoušel trošku přidat napětí, taky nepomohlo. Zkusil jsem proházet přívody k cívkám motoru, ale bez úspěchu. Zkoušel jsem i měnit délku pauzy mezi jednotlivými impulzy pro otáčení krokového motoru - nyní mam nastaveno 1, což je možná málo a hardware to nedá.
Tady je kód:
Kód: Vybrat vše
// defines pins numbers
// DS3231: SDA A4
// SCL A5
// A4988 step D5
// A4988 direction D6
// Koncák otevřeno D7
// Koncák zavřeno D8
#include <Wire.h>
#include "RTClib.h"
DS3231 rtc;
char daysOfTheWeek[7][12] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
const int stepPin = 5;
const int dirPin = 6;
const int koncakOtevreno = 7;
const int koncakZavreno = 8;
int casOtevreniHod = 6;
int casOtevreniMin = 30;
int casZavreniHod = 19;
int casZavreniMin = 0;
int casOtevreni = casOtevreniHod * 60 + casOtevreniMin;
int casZavreni = casZavreniHod * 60 + casZavreniMin;
int aktualniCas;
void otevri() {
Serial.println("oteviram dvere");
digitalWrite(dirPin, HIGH); // Enables the motor to move in a particular direction
// Makes 200 pulses for making one full cycle rotation, M5 závit má stoupání 0,8mm/otáčku, potřebuji 250 otáček = 250*200= 50000 pulzů
for (int x = 0; x < 50000; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1);
digitalWrite(stepPin, LOW);
delayMicroseconds(1);
}
}
void zavri() {
Serial.println("zaviram dvere");
digitalWrite(dirPin, LOW); //Changes the rotations direction
// Makes 200 pulses for making one full cycle rotation
for (int x = 0; x < 50000; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1);
digitalWrite(stepPin, LOW);
delayMicroseconds(1);
}
}
void setup() {
Serial.begin(9600);
delay(3000);
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //Nastavení aktuálního času dle času kompilace.
DS3231 rtc; // inicializace RTC z knihovny
pinMode(stepPin, OUTPUT); //Nastavení pinů pro krokový motor jako výstup
pinMode(dirPin, OUTPUT);
pinMode(koncakOtevreno, INPUT_PULLUP); //Koncáky co používám mají HIGH při rozepnutém stavu.PULLUP neguje původní funkci, tím pádem bude HIGH při sepnutém koncáku.
pinMode(koncakZavreno, INPUT_PULLUP);
}
void loop() {
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(koncakZavreno) == HIGH)
{
otevri();
delay(3000);
}
else
{
delay(3000);
}
}
else if (aktualniCas > casZavreni || aktualniCas < casOtevreni)
{
if (digitalRead(koncakOtevreno) == HIGH)
{
zavri();
delay(3000);
}
else
{
delay(3000);
}
}
delay(1000); // One second delay
}