Bonjour à tous,
Mon projet porte sur la lecture de deux capteurs PNP fonctionnant en 12Vcc sur un ESP32 afin de connaitre en temps réel la position d’un portail affiché sur un serveur.
Voici le schéma de branchement que j’ai réalisé :
J’ai positionné une diode zener de 5.1V sur chaque capteur et en testant le signal à l’oscilo, ma tension est de 5V sans métal devant le capteur et passe à 0V avec une détection métalique.
Voici le programme que j’ai réalisé :
// _________________________________________________________ Connection wifi __________________________________________________________
#include <WiFi.h>
#define ssid "C18" // MSE-PAIMPOL ou Livebox-CB66
#define password "Udinabugz22?!" // AccesPasseMSE-01 ou Udinabugz22?!
unsigned long tempsPrecedentRedemarrage = 0;
unsigned long tempsPrecedentStatusWifi = 0;
unsigned long tempsDeRebootESP = 30000;
const int tempsDeStatusWifi = 3000;
bool etatConnexionDebug = false;
void setupWifi() {
Serial.println("\n");
WiFi.begin(ssid, password);
Serial.print("Tentative de connexion...");
while(WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.println("\n");
Serial.println("Connexion etablie : ");
Serial.print("Adresse IP : ");
Serial.println(WiFi.localIP());
Serial.print("Force du signal RSSI: ");
Serial.println(WiFi.RSSI());
delay(1000);
}
// ________________________________________________________ Connection au borker MOSQUITTO ____________________________________________________________
#include <PubSubClient.h>
#define mqtt_server "192.168.1.13"
const char* mqttUser = "serveur-maison";
const char* mqttPassword = "Udinabugz22?!";
char message_buff[100];
long lastMsg = 0;
// long lastRecu = 0;
bool debug = false;
char msg[50];
int value = 0;
String consigne;
WiFiClient espClient;
PubSubClient client(espClient);
// ----------------- déclaration des topics de souscription MQTT --------------------
String callbackOuvertureFermeturePortail;
String callbackOuverturePortailPortillon;
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
payload[length]='\0';
String cons = String((char*)payload);
consigne = cons;
Serial.println();
// _______________________________________ Exécution des souscription au topic MQTT _______________________________________________
if (topic[7] == 'p') { // On va choisir le bon topic que l'on veut recupérer avec des lettres ici la lettre o de osmolation.
payload[length]='\0'; // Ensuite on recupére la valeur entière (length) du topic.
callbackOuverturePortailPortillon = String((char*)payload); // On la stock dans une variable pour l'utiliser ailleurs dans le code.
Serial.println();
} else if(topic[8] == 'p') {
payload[length]='\0';
callbackOuvertureFermeturePortail = String((char*)payload);
Serial.println();
}
}
void reconnect() { //Boucle jusqu'à obtenur une reconnexion
while (!client.connected()) {
Serial.println("Connexion au serveur MQTT...");
if (client.connect("Portail exterieur", mqttUser, mqttPassword )) {
Serial.println("Connexion réussie à : Portail exterieur");
// ________________________________________ Souscription au topic nodered _______________________________________________
client.subscribe("Gestion/portail");
client.subscribe("Relais/portillon");
debug = true;
} else {
Serial.println("Erreur de connexion au serveur MQTT : ");
debug = false;
Serial.println("5 secondes avant de recommencer une tentative de connexion");
delay(5000);
}
}
}
// _______________________________ Déclaration du luxmètre ____________________________________
#include <DFRobot_B_LUX_V30B.h>
DFRobot_B_LUX_V30B myLux(13);
// _______________________________ Déclaration des capteurs de position du portail ___________________________________
const int capteurPositionOuvert = 39;
const int capteurPositionFerme = 35;
bool etatCapteurPositionOuvert = false;
bool etatCapteurPositionFerme = false;
// _______________________________ Dclaration des relais du portail _____________________________________
const int relaisOuvertureFermeturePortail = 19;
const int relaisPortillonPortail = 18;
// _______________________________ Déclaration des abonnements MQTT _____________________________________
#define sonde1_topic "Etat/capteur/portail/ferme"
#define sonde2_topic "Etat/capteur/portail/ouvert"
#define sonde3_topic "Debug/ESP32/portail/exterieur"
#define sonde4_topic "Etat/capteur/luxmetre"
// _________________________________________________________________________________________________ SETUP ______________________________________________________________________________________________________
void setup() {
Serial.begin(115200);
setupWifi();
delay(1000);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
delay(500);
// ___________________________________ Déclaration des capteurs de positiion du portail _________________________________
pinMode(capteurPositionOuvert, INPUT);
pinMode(capteurPositionFerme, INPUT);
// ___________________________________ Déclaration des relais du portail ____________________________________
pinMode(relaisPortillonPortail, OUTPUT);
digitalWrite(relaisPortillonPortail, LOW);
pinMode(relaisOuvertureFermeturePortail, OUTPUT);
digitalWrite(relaisOuvertureFermeturePortail, LOW);
// ___________________________________ Lancement du luxmètre _______________________________________
myLux.begin();
}
// _________________________________________________________________________________________________ LOOP ______________________________________________________________________________________________
void loop() {
client.loop();
if (!client.connected()) {
reconnect();
}
unsigned long tempsActuelStatus = millis();
if (( WiFi.status() == WL_CONNECTED ) && ( tempsActuelStatus - tempsPrecedentStatusWifi ) >= tempsDeStatusWifi ) {
Serial.print("ESP32 correctement connnecter au reseau wifi : ");
Serial.println(WiFi.SSID());
etatConnexionDebug = true;
tempsPrecedentStatusWifi = tempsActuelStatus;
}
if ( WiFi.status() != WL_CONNECTED ) {
Serial.println("Problème de connection de l'ESP32");
etatConnexionDebug = false;
unsigned long tempsActuelRedemarrage = millis();
if ((tempsActuelRedemarrage - tempsPrecedentRedemarrage) >= tempsDeRebootESP ) {
Serial.println("preparation au reboot ESP32");
delay(3000);
Serial.println("Reboot de l'ESP32");
ESP.restart();
tempsPrecedentRedemarrage = tempsActuelRedemarrage;
}
}
// _____________________________________________ Lecture de l'état des capteurs de position du portail ________________________________________________
etatCapteurPositionOuvert = digitalRead(capteurPositionOuvert);
etatCapteurPositionFerme = digitalRead(capteurPositionFerme);
if(etatCapteurPositionOuvert == true) {
Serial.println(etatCapteurPositionOuvert);
} else {
}
if(etatCapteurPositionFerme == true) {
Serial.println(etatCapteurPositionFerme);
} else {
}
// __________________________________________ Lecture des conditions de déclenchement des relais pilotés MQTT ___________________________________________
if(callbackOuvertureFermeturePortail == "true") {
digitalWrite(relaisOuvertureFermeturePortail, HIGH);
delay(500);
digitalWrite(relaisOuvertureFermeturePortail, LOW);
} else {
digitalWrite(relaisOuvertureFermeturePortail, LOW);
}
if(callbackOuverturePortailPortillon == "true") {
digitalWrite(relaisPortillonPortail, HIGH);
delay(500);
digitalWrite(relaisPortillonPortail, LOW);
} else {
digitalWrite(relaisPortillonPortail, LOW);
}
// ______________________________________ Lecture du luxmètre __________________________________________________
double lumiere = myLux.lightStrengthLux();
/*Serial.print("value: ");
Serial.print(myLux.lightStrengthLux());
Serial.println(" (lux).");
delay(1000);*/
// _______________________________________ Envoi des données à NodeRed _____________________________________________
bool sonde1 = etatCapteurPositionOuvert;
bool sonde2 = etatCapteurPositionFerme;
bool sonde3 = etatConnexionDebug;
double sonde4 = lumiere;
//Publication des mesures:
if(debug) {
client.publish(sonde1_topic, String(etatCapteurPositionOuvert).c_str(), true);
client.publish(sonde2_topic, String(etatCapteurPositionFerme).c_str(), true);
client.publish(sonde3_topic, String(sonde3).c_str(), true);
client.publish(sonde4_topic, String(lumiere).c_str(), true);
}
}
Les deux comparaisons ne fonctionnent pas en retour sur moniteur série, le signal est à 1 mais ne passe pas à 0 lorsque je passe un objet métalique devant.
L’esp32 accepte il 5V en INPUT ou dois je mettre une diode zener de 3.3V ?
Merci par avance pour vos éclaircissement.s






