floprm
floprm

Reputation: 102

esp 32 with esp now and mqtt connection

i trying to acheive some home automation with esp 32. my project is like following

  1. i have several end points with esp 8266 acting likes slave switches sending Id datas to an esp 32 who is my gateway.
  2. both slaves (esp8266) and master gateway (esp 32, are communicating with espnow library
  3. the gateway should be connected to an mqtt server ( rasperry pi) who dispatches automation command depending on endpoint Id.

For now i succesfully have communication between esp8266 slaves and esp 32 gateway i also have succesfully setted my rasperry pi as mqtt broker with home automation command

But i'm blocked when i need to add wifi connection and mqtt messaging to my ESP 32 gateway

My code on the esp32 gateway is

#include <esp_now.h>
#include <WiFi.h>
#include <PubSubClient.h> 
#define LED 2
int myData;
char ssid[] = "my ssid";     
char password[] = "mypass";  
char mqtt_server[] = "192.168.1.55";  
WiFiClient espClient;
PubSubClient MQTTclient(espClient);

void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.print("data: ");
  Serial.println(myData);
  /*
  if(myData == 1){
    String reponse="device1";
    MQTTclient.publish("homecommand",reponse.c_str());

  }
  */
  
  for (int t=0; t<3; t++)
   {
    digitalWrite(LED,HIGH);
    delay(50);
    digitalWrite(LED,LOW);
    delay(50);
   }
  
  
}

void MQTTconnect() {

  while (!MQTTclient.connected()) {
      Serial.print("Attente  MQTT connection...");
      String clientId = "TestClient-";
      clientId += String(random(0xffff), HEX);

    // test connexion
    if (MQTTclient.connect(clientId.c_str(),"","")) {
      Serial.println("connected");

    } else {  // si echec affichage erreur
      Serial.print("ECHEC, rc=");
      Serial.print(MQTTclient.state());
      Serial.println(" nouvelle tentative dans 5 secondes");
      delay(5000);
    }
  }
}

void setup() {
  // Initialize Serial Monitor
  Serial.begin(115200);
  pinMode(LED,OUTPUT);
  
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_register_recv_cb(OnDataRecv);
  /*
  Serial.println("Connect to Wifi");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
   Serial.println("Connected");
   
   MQTTclient.setServer(mqtt_server, 1883);
   if (!MQTTclient.connected()) {
    MQTTconnect();
  }*/
}

void loop() {
  // put your main code here, to run repeatedly:

}

The code works well, when i trigger one of my slaves i receive the message print it in serial an blink 3 times

But when i uncomment the part about connecting to my home router and my mqtt broker i lost the 'On DataRecv' callback

So my question is "Is it possible to have an Esp working as espnow gateway to gather messages and at the same time being connected to my home router for mqtt publishing ?" If yes i would appreciate some help to implement it. Thanks a lot.

Upvotes: 0

Views: 1941

Answers (1)

hardillb
hardillb

Reputation: 59751

Swap

WiFi.mode(WIFI_STA);

for

WiFi.mode(WIFI_AP_STA);

re: https://www.electrosoftcloud.com/en/esp32-wifi-and-esp-now-simultaneously/

Upvotes: 0

Related Questions