-
Notifications
You must be signed in to change notification settings - Fork 0
/
SolarTrackerBraccio_4xLDR.ino
114 lines (94 loc) · 4.17 KB
/
SolarTrackerBraccio_4xLDR.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
Φωτοαντίσταση LDR (light dependent resistor) από θειούχο κάδμιο (CdS).
Η φωτοαντίσταση είναι μια μεταβλητή αντίσταση η τιμή της οποίας
αλλάζει ανάλογα με το φως που πέφτει πάνω σε αυτή.
Η τιμή της αντίστασης μικραίνει όταν στον χώρο υπάρχει πολύς φωτισμός,
αντίθετα μεγαλώνει όσο μικραίνει ο φωτισμός.
0 Lx -> 1-5 ΜΩ
10 Lx -> 8-20 KΩ
100 Lx -> 1-2 KΩ
Φωτοαντίσταση, ακροδέκτης 1 –> Arduino 5V μέσω αντίστασης 10K & Arduino ακροδέκτης A0
Φωτοαντίσταση, ακροδέκτης 2 –> Arduino Γη
*/
#include <Braccio.h>
// Βιβλιοθήκη "Braccio"
// Περιλαμβάνει το "servo.h" από τη βιβλιοθήκη "Servo".
Servo basi; // Κινητήρας βάσης
Servo omos; // ώμου
const int LDR_B_Pin = A0; // ακροδέκτης Βορρά
const int LDR_N_Pin = A1; // Νότου
const int LDR_A_Pin = A2; // Ανατολής
const int LDR_D_Pin = A3; // Δύσης
const int megistiMetrisiAisthitira = 1023;
// κάτω φράγμα απόρριψης θορύβου μέτρησης, >15 για σκοτάδι, ~0 για πολύ φως
const int nevrikotitaKinisis = 20;
const int vradititaKinisis = 40; // καθυστέρηση μεταξύ βημάτων, 1-50-3000 ms
const int vimaServo = 1;
int gwnia_basis = 90; // γωνία άξονα κινητήρα βάσης
int gwnia_omou = 90; // ώμου
void setup() {
Serial.begin(9600);
Serial.println();
Serial.println("Serial OK");
basi.attach(11); // βύσμα M1-> ελεγκτή pin 11 (digital pwm)
omos.attach(10); // βύσμα M2-> ελεγκτή pin 10 (digital pwm)
digitalWrite(SOFT_START_CONTROL_PIN, HIGH);
basi.write(90); // Αρχική κλίση άξονα 90 μοίρες
omos.write(90);
delay(5000); // καθυστέρηση σε χιλιοστοδευτερόλεπτα (ms)
Serial.println("Vraxionas OK");
}
void loop() {
int LDR_B_Reading = analogRead(LDR_B_Pin);
int LDR_N_Reading = analogRead(LDR_N_Pin);
int LDR_A_Reading = analogRead(LDR_A_Pin);
int LDR_D_Reading = analogRead(LDR_D_Pin);
int lux_B = megistiMetrisiAisthitira - LDR_B_Reading;
int lux_N = megistiMetrisiAisthitira - LDR_N_Reading;
int lux_A = megistiMetrisiAisthitira - LDR_A_Reading;
int lux_D = megistiMetrisiAisthitira - LDR_D_Reading;
/*
Serial.println("BORRAS-NOTOS\tANATOLH-DYSH");
Serial.print(lux_B); Serial.print("-"); Serial.print(lux_N); Serial.print("\t\t");
Serial.print(lux_A); Serial.print("-"); Serial.println(lux_D);
*/
int lux_B_N = lux_B - lux_N +13; // βαθμονόμηση: διόρθωση ισορροπίας Β-Ν ανάλογα συνθηκών
int lux_A_D = lux_A - lux_D +10; // όμοια για Α-Δ
/*
Serial.println("Diaf_BOR-NOT\tDiaf_ANAT-DYS");
Serial.print(lux_B_N); Serial.print("\t\t"); Serial.println(lux_A_D);
Serial.print("To fos erxetai apo ");
if (lux_B_N > 0)
Serial.print("B");
else if (lux_B_N < 0)
Serial.print("N");
if (lux_A_D > 0)
Serial.print("A");
else if (lux_A_D < 0)
Serial.print("D");
Serial.println(" katey8ynsi");
*/
if (abs(lux_B_N) >= nevrikotitaKinisis) {
int temp = gwnia_omou - vimaServo * sgn(lux_B_N); // lux_B_N / nevrikotitaKinisis
//Serial.print("temp_B_N: "); Serial.println(temp);
if (15 < temp and temp < 165) {
gwnia_omou = temp;
omos.write(gwnia_omou);
}
}
if (abs(lux_A_D) >= nevrikotitaKinisis) {
int temp = gwnia_basis - vimaServo * sgn(lux_A_D); // lux_A_D / nevrikotitaKinisis
// Serial.print("temp_A_D: "); Serial.println(temp);
if (0 < temp and temp < 180) {
gwnia_basis = temp;
basi.write(gwnia_basis);
}
}
delay(vradititaKinisis);
/*
Serial.print("omou: "); Serial.print(gwnia_omou); Serial.print("\t");
Serial.print("basis: "); Serial.println(gwnia_basis);
Serial.println();
*/
}
int sgn(int val) {return (0 < val) - (val < 0);}