Bonjour,
Aujourd'hui, je viens vers vous pour un renseignement et, si la réponse est positive, savoir comment je pourrais avancer.
Si vous n'avez jamais vu un de mes postes, je vous mets dans le contexte : l'année dernière, j'étais en BTS SN EC et j'ai eu pour projet, avec une entreprise, de créer un "Master" pour gérer deux spots lumineux en DMX. J'ai donc dû choisir mes composants, les tester, créer un PCB et tout programmer. À l'heure actuelle, mon Master est donc créé et la gestion des deux spots est bien possible via des boutons physiques sur le Master comme une IHM ou bien sur Android avec une application sur AppInventor.
Mon projet étant fini, l'entreprise veut maintenant utiliser ce que j'ai fait pour éclairer la façade de l'entreprise. Ils me demandent de couper l'éclairage pendant la journée (ce qui est normal) et de tout rallumer le soir. J'ai donc proposé une simple prise pour mon Master, qui serait alimentée en permanence, mais ils préfèrent le couper aussi pendant la journée.
Voici ma question :
J'ai actuellement une carte uPESY ESP32 WROOM DEVKIT qui me permet de communiquer en Arduino et en DMX. Je voudrais savoir s'il est possible d'avoir une sorte de mémoire sur la carte pour que, lors de la réalimentation de la carte, la programmation reste la dernière choisie.
Je ne sais pas si c'est très clair, mais je voudrais que, lors de la réalimentation, le programme envoyé aux spots ne soit pas celui dans le "Void Setup" (qui serait éteint), mais plutôt qu'il garde le fait qu'il était en case 1, 2, 3 ou 4 (programme ci-dessous).
J'espère bien me faire comprendre ^^'. Si vous avez besoin de plus d'explications ou d'éléments, je peux en fournir.
Merci.
Prog :
// Déclaration des variables et des tableaux
int boucle = 1;
int TabDMX[192];
// Tableau contenant les valeurs ADC correspondant à chaque touche et leurs intervalles.
int adc_key_val[5][2] = {
{2880, 2920}, // S1 (Jaune)
{2980, 3020}, // S2 (Vert)
{3090, 3130}, // S3 (Bleu)
{3240, 3300}, // S4 (Rouge)
{3500, 3600} // S5 (Blanc)
};
int NUM_KEYS = 5; // Nombre total de touches
int adc_key_in; // Valeur ADC lue
int key = -1; // Touche détectée
int key2 = -1; // Deuxième vérification de touche détectée
int oldkey = -1; // Ancienne touche détectée
// écran
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h> // Inclure la bibliothèque SPI si l'interface matérielle SPI est disponible
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h> // Inclure la bibliothèque Wire si l'interface matérielle I2C est disponible
#endif
// Déclaration d'une instance de la classe U8g2_SH1107_SEEED_128X128_1_SW_I2C pour controler l'écran OLED
// Les paramètres sont la rotation, les broches pour l'horloge (SCL) et les données (SDA), et la broche de réinitialisation
U8G2_SH1107_SEEED_128X128_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
void setup() {
// Initialisation de toutes les valeurs du tableau DMX à 0
for (int i = 0; i < 192; i++) {
TabDMX[i] = 0;
}
// Configuration du pin 1 en mode sortie
pinMode(1, OUTPUT);
// Initialisation de la communication série à 115200 bauds
Serial.begin(115200);
u8g2.begin(); // Initialisation de l'écran OLED
}
void loop() {
// Lecture de la valeur ADC du capteur
adc_key_in = analogRead(36);
key = get_key(adc_key_in);
// Vérification de la première touche détectée
if ((key != 5) && (key != -1)) {
if (key != oldkey) { // Si une pression de touche est détectée
delay(50); // Attente pour le debounce
adc_key_in = analogRead(36); // Lecture de la valeur ADC du capteur
key2 = get_key(adc_key_in); // Conversion en pression de touche
if ((key2 != 5) && (key2 != -1)) {
if ((key2 != oldkey) && (key == key2)) {
oldkey = key;
if (key >= 0) {
// Traitement de la touche détectée
switch (key) {
// Modification des boutons
case 0: // Bouton S1 ( Jaune ) Couleur ROSE
TabDMX[1] = 255; // Modulation couleur ROUGE
TabDMX[2] = 0; // Modulation couleur VERT
TabDMX[3] = 255; // Modulation couleur BLEU
TabDMX[4] = 200; // Modulation couleur BLANC
u8g2.firstPage(); // Début de la première page de dessin
do {
u8g2.setFont(u8g2_font_ncenB10_tr); // Sélection de la police de caractères
u8g2.drawStr(0,25,"PROG EN COURS"); // Affichage du texte "Prog en cours" aux coordonnées (0,25)
u8g2.drawStr(0,50,"Couleur ROSE"); // Affichage du texte "ROSE" aux coordonnées (0,50)
u8g2.drawStr(0,75,"NOM PRODUIT"); // Affichage du texte "Nom Produit" aux coordonnées (0,75)
u8g2.drawStr(0,100,"SPOT FACADE"); // Affichage du texte "SPOT FACADE" aux coordonnées (0,100)
u8g2.drawStr(0,125,"SANTERNE"); // Affichage du texte "Santerne" aux coordonnées (0,125) sois rien
} while ( u8g2.nextPage() ); // Passage à la page suivante si elle existe
delay(10); // Délai facultatif pour ralentir le rafraîchissement de l'écran
break;
case 1: // Bouton S2 ( Vert ) Couleur Vert
TabDMX[1] = 0; // Modulation couleur ROUGE
TabDMX[2] = 255; // Modulation couleur VERT
TabDMX[3] = 0; // Modulation couleur BLEU
TabDMX[4] = 200; // Modulation couleur BLANC
u8g2.firstPage(); // Début de la première page de dessin
do {
u8g2.setFont(u8g2_font_ncenB10_tr); // Sélection de la police de caractères
u8g2.drawStr(0,25,"PROG EN COURS"); // Affichage du texte "Prog en cours" aux coordonnées (0,25)
u8g2.drawStr(0,50,"Couleur VERT"); // Affichage du texte "VERT" aux coordonnées (0,50)
u8g2.drawStr(0,75,"NOM PRODUIT"); // Affichage du texte "Nom Produit" aux coordonnées (0,75)
u8g2.drawStr(0,100,"SPOT FACADE"); // Affichage du texte "SPOT FACADE" aux coordonnées (0,100)
u8g2.drawStr(0,125,"SANTERNE"); // Affichage du texte "Santerne" aux coordonnées (0,125) sois rien
} while ( u8g2.nextPage() ); // Passage à la page suivante si elle existe
delay(10); // Délai facultatif pour ralentir le rafraîchissement de l'écran
break;
case 2: // Bouton S3 ( Bleu ) Couleur BLEU
TabDMX[1] = 0; // Modulation couleur ROUGE
TabDMX[2] = 128; // Modulation couleur VERT
TabDMX[3] = 255; // Modulation couleur BLEU
TabDMX[4] = 200; // Modulation couleur BLANC
u8g2.firstPage(); // Début de la première page de dessin
do {
u8g2.setFont(u8g2_font_ncenB10_tr); // Sélection de la police de caractères
u8g2.drawStr(0,25,"PROG EN COURS"); // Affichage du texte "Prog en cours" aux coordonnées (0,25)
u8g2.drawStr(0,50,"Couleur BLEU"); // Affichage du texte "BLEU" aux coordonnées (0,50)
u8g2.drawStr(0,75,"NOM PRODUIT"); // Affichage du texte "Nom Produit" aux coordonnées (0,75)
u8g2.drawStr(0,100,"SPOT FACADE"); // Affichage du texte "SPOT FACADE" aux coordonnées (0,100)
u8g2.drawStr(0,125,"SANTERNE"); // Affichage du texte "Santerne" aux coordonnées (0,125) sois rien
} while ( u8g2.nextPage() ); // Passage à la page suivante si elle existe
delay(10); // Délai facultatif pour ralentir le rafraîchissement de l'écran
break;
case 3: // Bouton S4 ( Rouge ) Couleur ORANGE
TabDMX[1] = 255; // Modulation couleur ROUGE
TabDMX[2] = 200; // Modulation couleur VERT
TabDMX[3] = 0; // Modulation couleur BLEU
TabDMX[4] = 200; // Modulation couleur BLANC
u8g2.firstPage(); // Début de la première page de dessin
do {
u8g2.setFont(u8g2_font_ncenB10_tr); // Sélection de la police de caractères
u8g2.drawStr(0,25,"PROG EN COURS"); // Affichage du texte "Prog en cours" aux coordonnées (0,25)
u8g2.drawStr(0,50,"Couleur ORANGE"); // Affichage du texte "ORANGE" aux coordonnées (0,50)
u8g2.drawStr(0,75,"NOM PRODUIT"); // Affichage du texte "Nom Produit" aux coordonnées (0,75)
u8g2.drawStr(0,100,"SPOT FACADE"); // Affichage du texte "SPOT FACADE" aux coordonnées (0,100)
u8g2.drawStr(0,125,"SANTERNE"); // Affichage du texte "Santerne" aux coordonnées (0,125) sois rien
} while ( u8g2.nextPage() ); // Passage à la page suivante si elle existe
delay(10); // Délai facultatif pour ralentir le rafraîchissement de l'écran
break;
// Bouton jaune remise à 0 ne pas toucher
case 4: // Bouton S5 ( Blanc )
for (int i = 1; i <= 4; i++) {
TabDMX[i] = 0; // Désactiver toutes les couleurs
}
u8g2.firstPage(); // Début de la première page de dessin
do {
u8g2.setFont(u8g2_font_ncenB10_tr); // Sélection de la police de caractères
u8g2.drawStr(0,25,"PROG EN COURS"); // Affichage du texte "Prog en cours" aux coordonnées (0,25)
u8g2.drawStr(0,50,"SPOT ETEINT"); // Affichage du texte "SPOT ETEINT" aux coordonnées (0,50)
u8g2.drawStr(0,75,"NOM PRODUIT"); // Affichage du texte "Nom Produit" aux coordonnées (0,75)
u8g2.drawStr(0,100,"SPOT FACADE"); // Affichage du texte "SPOT FACADE" aux coordonnées (0,100)
u8g2.drawStr(0,125,"SANTERNE"); // Affichage du texte "SANTERNE " aux coordonnées (0,125) sois rien
} while ( u8g2.nextPage() ); // Passage à la page suivante si elle existe
delay(10); // Délai facultatif pour ralentir le rafraîchissement de l'écran
break;
default:
Serial.println("Autre touche ou aucune touche");
}
}
}
}
}
}
if (key == 5)
oldkey = 5;
// Envoi du message DMX
sendDMX();
delay(50); // Attente avant la prochaine lecture
}
// Fonction pour envoyer le message DMX
void sendDMX() {
// Début du message DMX (MBB)
digitalWrite(1, 1);
delay(10);
// Pause entre le message DMX et le BREAK
digitalWrite(1, 0);
delayMicroseconds(88);
// Début du BREAK
digitalWrite(1, 1);
delayMicroseconds(8);
// Envoi des canaux DMX via la communication série
Serial.begin(250000, SERIAL_8N2); // Début de la communication série à 250000 bauds
for(int n = 0; n < 192; n++) {
Serial.write(TabDMX[n]); // Envoi de chaque valeur du tableau DMX
}
Serial.end(); // Fin de la communication série
// Configuration du pin 1 en mode sortie
pinMode(1, OUTPUT);
// Fin du message DMX (MBB)
digitalWrite(1, 1);
delay(5);
}
// Fonction pour convertir la valeur ADC en numéro de touche
int get_key(unsigned int input) {
int k;
for (k = 0; k < NUM_KEYS; k++) {
if ((input > adc_key_val[k][0]) && (input < adc_key_val[k][1])) {
return k; // Retourne le numéro de la touche si la valeur ADC est dans l'intervalle
}
}
if (input >= 4090) return 5; // Aucune touche pressée si la valeur ADC est élevée
return -1; // Incertitude si la valeur ADC n'est dans aucun intervalle connu
}