-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmenu.cpp
More file actions
312 lines (261 loc) · 8.87 KB
/
menu.cpp
File metadata and controls
312 lines (261 loc) · 8.87 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
#include "menu.h"
#include "parameters.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define LINE_HEIGHT 8 // Hauteur de la ligne (taille de texte 1 = 8 pixels)
#define OLED_ADDRESS 0x3C // Adresse I2C de l'OLED
// Déclaration des broches pour l'encodeur
#define encoder0PinA 4 // Pin A de l'encodeur
#define encoder0PinB 19 // Pin B de l'encodeur
#define encoder0Press 23 // Pin du bouton de l'encodeur
volatile int menuIndex = 0;
bool menuActive = false;
bool editing = false;
int editIndex = -1;
int lastEncoderPosition = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 20;
int cursorY = 0; // Position verticale du curseur sur l'écran
bool oledInitialized=false;
void knobCallback(long value) {
unsigned long currentTime = millis();
// if ((currentTime - lastDebounceTime) > debounceDelay) {
// lastDebounceTime = currentTime;
int delta = value - lastEncoderPosition;
lastEncoderPosition = value;
if (delta==numParameters){
delta=-1;
}
if (delta==-numParameters){
delta=1;
}
if (editing) {
adjustParameter(editIndex, delta > 0 ? 1 : -1);
showSingleParameter(editIndex);
} else if (menuActive) {
menuIndex = value; //+= delta > 0 ? 1 : -1;
Serial.println(menuIndex);
//menuIndex = constrain(menuIndex, 0, numParameters);
showMenu();
}
// }
}
void buttonCallback(unsigned long duration) {
if (duration>1000) {
return; // remove wrong calls to the function ; encoder bug
}
//Serial.println(duration);
unsigned long currentTime = millis();
if ((currentTime - lastDebounceTime) > debounceDelay) {
lastDebounceTime = currentTime;
// Indiquer que le bouton vient d'être pressé
// buttonRecentlyPressed = true;
if (!menuActive) {
menuActive = true;
menuIndex=0;
showMenu();
delay(100);
showMenu();
} else {
if (!editing) {
if (menuIndex == 0) {
menuActive = false;
} else {
editing = true;
editIndex = menuIndex - 1;
showSingleParameter(editIndex);
}
} else {
lastEncoderPosition = menuIndex;
editing = false;
editIndex = -1;
showMenu();
}
}
}
}
void showMenu() {
int fontHeight = 8;
int visibleItems = SCREEN_HEIGHT / fontHeight;
int topItem = 0;
//Serial.println(menuIndex);
// Ajuster topItem pour s'assurer que menuIndex est toujours visible
if (menuIndex >= visibleItems) {
topItem = menuIndex - visibleItems + 1;
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
// Afficher les éléments du menu
for (int i = 0; i < visibleItems; i++) {
int itemIndex = topItem + i;
if (itemIndex > numParameters) break;
int y = i * fontHeight;
if (itemIndex == menuIndex) {
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.fillRect(0, y, SCREEN_WIDTH, fontHeight, SSD1306_WHITE);
} else {
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
}
if (itemIndex == 0) {
display.setCursor(0, y);
display.println("Back");
} else {
display.setCursor(0, y);
display.print(parameters[itemIndex - 1].name);
display.setCursor(SCREEN_WIDTH - 50, y);
display.print(": ");
display.println(*(float*)parameters[itemIndex - 1].value, 2);
}
}
display.display();
}
void showSingleParameter(int index) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Set ");
display.print(parameters[index].name);
display.println(" ?");
display.setTextSize(2);
display.setCursor(0, 20);
display.print(*(parameters[index].value), 2);
display.display();
}
void applyUpdatedParameters() {
// Forcer la sortie à zéro
Output = 0;
// Réinitialiser les paramètres PID
myPID.SetTunings(Kp, Ki, Kd);
myPID.SetOutputLimits(-1, 0); // artificially resests the integrator
myPID.SetOutputLimits(0, 255);
//myPID.SetMode(MANUAL);
// myPID.SetMode(AUTOMATIC); // reini
// Redémarrer le PID avec les paramètres actuels
myPID.Start(Input, Output, Setpoint);
// Afficher un message pour confirmer la réinitialisation
Serial.println("PID réinitialisé avec les nouveaux paramètres.");
Serial.print("Kp: "); Serial.print(Kp);
Serial.print(", Ki: "); Serial.print(Ki);
Serial.print(", Kd: "); Serial.print(Kd);
Serial.print(", Setpoint: "); Serial.println(Setpoint);
// Vérifier si Output est bien nul
if (Output == 0) {
Serial.println("Sortie PID réinitialisée à zéro.");
} else {
Serial.print("Avertissement : Sortie PID non nulle (");
Serial.print(Output);
Serial.println(")");
}
}
void adjustParameter(int index, int direction) {
if (index >= 0 && index < numParameters) {
// Ajuster la valeur pointée par le paramètre
float newValue = *(parameters[index].value) + direction * parameters[index].increment;
newValue = constrain(newValue, parameters[index].minValue, parameters[index].maxValue);
*(parameters[index].value) = newValue;
// Sauvegarder la nouvelle valeur dans les préférences
preferences.putFloat(parameters[index].name, newValue);
// Si le paramètre modifié est l'un des paramètres PID, appliquer les changements
if (parameters[index].name == "Kp" || parameters[index].name == "Ki" ||
parameters[index].name == "Kd" || parameters[index].name == "Setpoint") {
applyUpdatedParameters();
}
}
}
// void updateDisplay() {
// display.clearDisplay();
// display.setTextSize(2);
// display.setTextColor(SSD1306_WHITE);
// display.setCursor(0, 0);
// display.print(Input, 1);
// // float dhtTemperatureC = dht.readTemperature();
// display.setCursor(70, 0);
// if (isnan(dhtTemperatureC)) {
// display.print("Err");
// } else {
// display.print(dhtTemperatureC, 1);
// }
// display.setCursor(0, 25);
// display.print("Set: ");
// display.print(Setpoint, 1);
// int outputPercentage = (int)(Output / 255.0 * 100);
// display.setCursor(0, 50);
// display.print("PWM: ");
// display.print(outputPercentage);
// display.println("%");
// display.display();
// }
void updateDisplay(bool error) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
if (error) {
display.print("Err");
} else {
display.print(Input, 1);
}
// float dhtTemperatureC = dht.readTemperature();
display.setCursor(70, 0);
if (isnan(dhtTemperatureC)) {
display.print("Err");
} else {
display.print(dhtTemperatureC, 1);
}
display.setCursor(0, 25);
display.print("Set: ");
display.print(Setpoint, 1);
int outputPercentage;
if (error) {
outputPercentage=0;
} else {
outputPercentage = (int)(Output / 255.0 * 100);
}
display.setCursor(0, 50);
display.print("PWM: ");
display.print(outputPercentage);
display.println("%");
display.display();
}
void displayTextLine(const char* text) {
// Vérifie si on dépasse la hauteur de l'écran
if (cursorY >= SCREEN_HEIGHT) {
cursorY = 0; // Réinitialise la position du curseur
}
if (cursorY ==0) {
display.clearDisplay(); // Efface l'écran
}
// Affiche le texte à la position actuelle du curseur
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, cursorY);
display.println(text);
display.display(); // Mise à jour de l'affichage
// Passe à la ligne suivante
cursorY += LINE_HEIGHT;
}
bool isOLEDConnected() {
byte error, address;
int nDevices;
nDevices = 0;
for (address = 1; address < 127; address++) { // Les adresses I2C sont sur 7 bits (1-127)
Wire.beginTransmission(address); // Commence la transmission vers cette adresse
error = Wire.endTransmission(); // Fin de la transmission et retour du code d'erreur
if (error == 0) {
Serial.print("Périphérique I2C trouvé à l'adresse 0x");
if (address < 16)
Serial.print("0"); // Ajouter un 0 pour les adresses < 0x10
Serial.println(address, HEX); // Afficher l'adresse en hexadécimal
nDevices++;
} else if (error == 4) {
Serial.print("Erreur inconnue à l'adresse 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
}
}
}