Rum ljus & temperatur Regulator (5 / 6 steg)
Steg 5: Kalibrering 2: motorer
Motorerna måste veta hur mycket för att vända sig till framgångsrikt stänga eller öppna mörkarna. Detta belopp kommer att anges i den slutliga skissen som en variabel. Jag har något konfigureras om den ursprungliga motor skissen för det att vända sig till faktiska grader istället för bara ett visst nummer.
Observera att samma mängd grader kommer att ha samma effekt över flera mörkarna. En diskrepans häri kunde vid konvertering minnet inte är tillräckligt raka eller konvertering bitar att vara för lös från konvertering sticka eller roterande komponenter själva. Eller det kan vara mörkarna själva, jag är säker på att de inte kalibrera varje blind att stänga på exakt samma mängd roterande under tillverkning.
Koden
Nedan är koden för att kalibrera. Syntaxen skulle bli stor bokstav ("A", "B", "C" eller "D") (motsvarande med relä och motor nummer) direkt följt av mängden grader att vända. Även negativa belopp. Så om du skriver "B-420" och tryck enter, relä port 2 kommer att blir öppna och motorn minus 420 grader. Anteckna när mörkarna är öppna och stänga, behöver den att rotera medurs eller moturs? Detta kan vara viktigt att upptäcka omedelbart, det är möjligt du kan berätta den för att slå en mängd grader öppen medan mörkarna är på maximalt öppna, vilket kan orsaka skador på din stegmotor, din konvertering stick/bitar av även blinda själv. Också försöka att inte ge för hög flera att vända i början, det finns inget sätt att stoppa detta manuellt när du kör, det enda du kan göra är pull att USB-kontakten.
Prova att lägga mindre mängder som du berätta den för att slå samman, så att du vet hur mycket för att vända på en gång. Försök sedan att sätta det samma nummer i negationen till se om fullt öppnas när stängt eller vice versa. Akta dig allt detta kan faktiskt ta lite tid.
#define RELAY1 3
#define RELAY2 4
#define RELAY3 5
#define RELAY4 6
#define öppen sant
#define nära falskt
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
int steg = 0;
booleska riktning = sant; / / gre
osignerade långa last_time;
osignerade långa currentMillis;
int steps_left = 4095;
lång tid;
int tempDegrees = 0;
String tempString = "";
void setup() {
Serial.BEGIN(9600);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (RELAY1, OUTPUT);
pinMode (RELAY2, OUTPUT);
pinMode (RELAY3, OUTPUT);
}
void loop() {
om (Serial.available() > 0) {
char chr = (char)Serial.read();
Serial.println(Chr);
om (chr == "A") {
medan (Serial.available() > 0) {
tempString += (char)Serial.read();
}
tempDegrees = tempString.toInt();
Serial.println (tempString + ", \ttmpDegrees:" + tempDegrees + "\t");
tempString = "";
fördröjning (500).
digitalWrite (RELAY1, öppen);
Delay(100);
turnDegrees(tempDegrees);
digitalWrite (RELAY1, nära);
tempDegrees = 0;
closeRelays();
}
om (chr == 'B') {
medan (Serial.available() > 0) {
tempString += (char)Serial.read();
}
tempDegrees = tempString.toInt();
Serial.println (tempString + ", \ttmpDegrees:" + tempDegrees + "\t");
tempString = "";
fördröjning (500).
digitalWrite (RELAY2, öppen);
Delay(100);
turnDegrees(tempDegrees);
digitalWrite (RELAY2, nära);
tempDegrees = 0;
closeRelays();
}
om (chr == "C") {
medan (Serial.available() > 0) {
tempString += (char)Serial.read();
}
tempDegrees = tempString.toInt();
Serial.println (tempString + ", \ttmpDegrees:" + tempDegrees + "\t");
tempString = "";
fördröjning (500).
digitalWrite (RELAY3, öppen);
Delay(100);
turnDegrees(tempDegrees);
digitalWrite (RELAY3, nära);
tempDegrees = 0;
closeRelays();
}
om (chr == hade ") {
medan (Serial.available() > 0) {
tempString += (char)Serial.read();
}
tempDegrees = tempString.toInt();
Serial.println (tempString + ", \ttmpDegrees:" + tempDegrees + "\t");
tempString = "";
fördröjning (500).
digitalWrite (RELAY4, öppen);
Delay(100);
turnDegrees(tempDegrees);
digitalWrite (RELAY4, nära);
tempDegrees = 0;
closeRelays();
}
}
}
void turnDegrees (int grader) {
flyta tmpDegree = (float) grader;
grader = (int)(tmpDegree * 11.38);
Riktning = grader > 0? falska: sant;
om (grader < 0)
grader * = -1;
medan (grader > 0) {
currentMillis = micros();
om (currentMillis - last_time > = 1000) {
stepper(1);
tid = tid + micros() - last_time;
last_time = micros();
grader--;
}
}
Delay(2000);
}
Annullera stepper (int xw) {
för (int x = 0; x < xw; x ++) {
Switch (steg) {
fall 0:
digitalWrite (IN1, låg);
digitalWrite (IN2, låg);
digitalWrite (IN3, låg);
digitalWrite (IN4, hög);
bryta;
fall 1:
digitalWrite (IN1, låg);
digitalWrite (IN2, låg);
digitalWrite (IN3, hög);
digitalWrite (IN4, hög);
bryta;
fall 2:
digitalWrite (IN1, låg);
digitalWrite (IN2, låg);
digitalWrite (IN3, hög);
digitalWrite (IN4, låg);
bryta;
fall 3:
digitalWrite (IN1, låg);
digitalWrite (IN2, hög);
digitalWrite (IN3, hög);
digitalWrite (IN4, låg);
bryta;
fall 4:
digitalWrite (IN1, låg);
digitalWrite (IN2, hög);
digitalWrite (IN3, låg);
digitalWrite (IN4, låg);
bryta;
fall 5:
digitalWrite (IN1, hög);
digitalWrite (IN2, hög);
digitalWrite (IN3, låg);
digitalWrite (IN4, låg);
bryta;
fall 6:
digitalWrite (IN1, hög);
digitalWrite (IN2, låg);
digitalWrite (IN3, låg);
digitalWrite (IN4, låg);
bryta;
fall 7:
digitalWrite (IN1, hög);
digitalWrite (IN2, låg);
digitalWrite (IN3, låg);
digitalWrite (IN4, hög);
bryta;
standard:
digitalWrite (IN1, låg);
digitalWrite (IN2, låg);
digitalWrite (IN3, låg);
digitalWrite (IN4, låg);
bryta;
}
SetDirection();
}
}
void SetDirection() {
om (riktning == 1) {
Steg ++;
}
om (riktning == 0) {
Steg--;
}
om (steg > 7) {
Steg = 0;
}
om (steg < 0) {
Steg = 7.
}
}
void closeRelays() {
digitalWrite (RELAY1, nära);
digitalWrite (RELAY2, nära);
digitalWrite (RELAY3, nära);
digitalWrite (RELAY4, nära);
}