/
mppt-esp.ino
91 lines (74 loc) · 2.35 KB
/
mppt-esp.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
// MPPT
// arnaudrco https://github.com/arnaudrco/exemples/blob/main/README.md
/*
placer la tension V sur l'entrée A0
lecture POWER = V² PWM / R
Pour le projet tournesol 🌻 les reflets sur les vitres généraient des échos parasites et des faux maxima locaux.
En travaillant sur des secteurs et avec seulement 3 itérations il converge. cela marche bien.
Algorithme transpose pour mppt
NON TESTE
*/
// Define stepper motor connections and steps per revolution:
#define pwmPin D1
#define delai 200
#define stepsPerScan 20 // nombre de pas par itération
#define seuil1 5 // nombre de pas pour le seuil bas
#define seuil2 15 // seuil haut
#define MIN 20 // nombre de pas pour le seuil bas
#define MAX 1000 // seuil haut
#define photoPin A0
int dir=1; // direction
int PWM=MIN;
int debug=1;
void setup() {
Serial.begin(115200);
Serial.println("Tracker solaire : PhotoVoltaique.");
// Declare pins as output:
pinMode(pwmPin, OUTPUT);
// AUTOTEST
analogWrite(pwmPin, MAX);
delay(100);
if ( analogRead(photoPin) > 10) debug=0;
}
void loop() {
int m=maximum(stepsPerScan);
if (m>seuil2){
Serial.println("Tracker solaire : continue !");
} else if(m>seuil1){
Serial.println("Tracker solaire : position trouvée !");
dir= -dir; maximum(stepsPerScan-m);// recule
} else {
dir= -dir; maximum(stepsPerScan);// recule complétement
Serial.println("Tracker solaire : change de sens");
}
delay(delai);
}
int readPower(){ // lecture POWER
analogWrite(pwmPin, PWM);
if (debug){ // simule une position puissance maximale à 512
if(PWM < 512) return (PWM); else return ( 512 - PWM );
} else return ( analogRead(photoPin) );
}
int maximum(int n) { // retourne la position du maximum sur n steps
if ( (PWM + dir * n ) > MAX) return (0); //
if ( (PWM + dir * n ) < MIN) return (0);
int photoMax = readPower( ) ;
int pos=0;
POWER
// Spin the stepper motor 1 revolution slowly:
for (int i = 0; i < n; i++) {
// These four lines result in 1 step:
PWM += dir;
int ppp= readPower();
// maximum
if (ppp >photoMax ){
photoMax = ppp;
pos=i;
}
}
Serial.print("pos :" );
Serial.print(pos);
Serial.print("photoMax :" );
Serial.println(photoMax );
return( pos);
}