Thanks you @mikb55 for suggest me the Bounce2mcp library, it worked for me but I struggled to make it work with adafruit_mcp23017 library.
And
@ptillisch thank you very much. I did exactly what you told me to do, but i found some arrors. However, i didn't sleep until find the solution because you tips were the right way forward. I did some changes on
mcp.begin and wire.begin.
The best way to explain what i did to get job done is to post my final code to compare with the first one.
#include <Wire.h>
#include <SPI.h>
#include <PubSubClient.h>
#include <EthernetENC.h>
#include <Bounce2.h>
//#include <Adafruit_MCP23X17.h>
#include <Bounce2mcp.h>
#include <Adafruit_MCP23017.h>
// Instantiate mcp object
Adafruit_MCP23017 mcp1;
Adafruit_MCP23017 mcp2;
// Define MAC and IP address for the ENC28J60
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 177);
// Define MQTT broker details
const char* mqtt_server = "192.168.1.29";
const int mqtt_port = 1883;
const char* mqtt_username = "mqtt_user";
const char* mqtt_password = "mqtt_pass";
// Define GPIO pins
const int lampada_varanda = 2;
const int interruptor_varanda = 4;
const int interruptor_sala_de_estar = 0;
const int lampada_sala_de_estar = 0;
int lampada_varandaValue = LOW;
int lampada_sala_de_estarValue = LOW;
EthernetClient ethClient;
PubSubClient client(ethClient);
void callback(char* topic, byte* payload, unsigned int length) {
// handle message arrived
String content = "";
char character;
for (int num = 0; num < length; num++) {
character = payload[num];
content.concat(character);
}
Serial.println(topic);
Serial.println(content); // message sent out by button actions is returned from broker and serial printed
if (content == "1on") {
lampada_varandaValue = HIGH;
}
if (content == "1off") {
lampada_varandaValue = LOW;
}
if (content == "2on") {
lampada_sala_de_estarValue = HIGH;
}
if (content == "2off") {
lampada_sala_de_estarValue = LOW;
}
digitalWrite(lampada_varanda, lampada_varandaValue);
mcp2.digitalWrite(lampada_sala_de_estar, lampada_sala_de_estarValue);
}
Bounce bouncer1 = Bounce();
Bounce bouncer2 = Bounce();
BounceMcp debouncer = BounceMcp();
void setup() {
// Start Serial
Serial.begin(115200);
///Wire.begin();
mcp1.begin(0, &Wire);
mcp2.begin(1, &Wire);
// Setup Ethernet
Ethernet.begin(mac, ip);
// Setup MQTT
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
// Setup GPIO
pinMode(lampada_varanda, OUTPUT);
pinMode(interruptor_varanda, INPUT_PULLUP);
digitalWrite(interruptor_varanda, HIGH);
bouncer1.attach(interruptor_varanda);
bouncer1.interval(50);
mcp2.pinMode(lampada_sala_de_estar, OUTPUT);
mcp1.pinMode(interruptor_sala_de_estar, INPUT_PULLUP);
mcp1.digitalWrite(interruptor_sala_de_estar, HIGH);
debouncer.attach(mcp1, interruptor_sala_de_estar, 50);
}
void loop() {
// Connect to MQTT
if (!client.connected()) {
reconnect();
}
// Handle MQTT messages
client.loop();
if (bouncer1.update()) {
if (bouncer1.read() == HIGH) {
if (lampada_varandaValue == LOW) {
lampada_varandaValue = HIGH;
client.publish("casa/interruptores/varanda", "1on");
} else {
lampada_varandaValue = LOW;
client.publish("casa/interruptores/varanda", "1off");
}
}
}
if (debouncer.update()) {
if (debouncer.read() == HIGH) {
if (lampada_sala_de_estarValue == LOW) {
mcp2.digitalWrite(lampada_sala_de_estar, HIGH);
client.publish("casa/interruptores/sala_estar", "2on");
} else {
mcp2.digitalWrite(lampada_sala_de_estar, LOW);
client.publish("casa/interruptores/sala_estar", "2off");
}
}
}
}
void reconnect() {
// Loop until reconnected
while (!client.connected()) {
Serial.println("Tentando conectar ao servidor MQTT...");
// Attempt to connect
if (client.connect("ESP32Client", mqtt_username, mqtt_password)) {
Serial.println("Conectado");
// Subscribe to topics if needed
client.subscribe("casa/interruptores/#");
} else {
Serial.print("Falha ao conectar, rc= ");
Serial.println(client.state());
Serial.println("Tentar de novo em 5 segundos");
// Wait 5 seconds before retrying
delay(5000);
}
}
}