Interfone antigo no ESP8266

Prezados, preciso de uma luz, primeira vez que estou postando uma dúvida aqui!
Moro de aluguel, na casa tem um interfone antigo, beeeem antigo, fotos abaixo:

O interfone funciona muito bem, porém, como trabalho remoto, vez e outra entro em reuniões e então uso um fone de ouvido ou até mesmo para escutar música e com isso acabo não ouvindo o interfone. No meu escritório, tenho um Echo Show e também tenho uma Orange Pi Zero rodando um NodeRED (Preguiça de fazer um server melhor rs) e o Mosquitto para fazer algumas integrações.
Nessa parte está bem tranquila, trabalho como desenvolvedor, tenho conhecimento de software, mas de hardware, sou muito ruim.

O que eu gostaria de fazer é, na hora que alguém tocar o interfone, meu ESP8266 (NodeMCU V3) identificar que houve esse click no interfone, tocar o interfone mesmo, mas enviar por MQTT para o NodeRED. Minha dúvida é como vou fazer a ligação no ESP8266, olhando na parte de trás do interfone, tem essa etiqueta:
Imgur

Nas ligações, eu coloquei dois jumpers na parte do interfone, medindo com um multímetro, vi que saem 6V, mas fico com medo de colocar em alguma porta do ESP8266 e queimar.

O que eu pensei em fazer é colocar esses 6V no Vin do ESP8266 e quando ligar, enviar a notificação, quando responder no tópico do MQTT, colocar ele em Sleep Mode, mas não sei se isso é uma boa;

Outra ideia seria colocar um regulador de tensão para diminuir para 3.3V, mas não sei como fazer isso e só encontro conteúdo na internet falando sobre abaixar uma tensão de 12V para 9V ou para 5V;

Vocês podem me ajudar com isso?
Penso em depois colocar também o sensor magnético que tem no alarme da casa nesse mesmo ESP8266.

Não é necessário regulador de tensão, pois são de alto consumo. Para pequenos sinais, um divisor de tensão é suficiente, isso pode ajudá-lo.
resistencias

Mas certifique-se antes de conectá-lo ao ESP8266 se o intercomunicador realmente dá 6V e se na tomada que você tem que conectar ao ESP8266 ele caiu para 3V.
Saudações.

1 Like

@gonpezzi , nossa! Muito obrigado! Coloquei aqui dois resistores de 50K e realmente caiu para 3V, ficou ótimo!
Mas tenho mais uma dúvida, notei que lá fica com os 3V independente se tocaram ou não o interfone, como eu posso fazer essa ligação no ESP8266?

Poderia me ajudar com isso? Até fiz uma desenho explicando o esquema do interfone aqui em casa!

Só não sei se está bom! rs

Então não adianta você pegar a referência dessas tomadas, você tem que procurar outro lugar que está normalmente em zero e sobe, (seja qual for a tensão), quando o interfone for acionado, o valor dos resistores vai ser calculado para esses volts.

Ah, entendi! Vou verificar hoje a noite se consigo achar isso e retorno aqui se deu certo ou não!
De qualquer forma, muito obrigado novamente, @gonpezzi !

@gonpezi, demorei um pouco para voltar a ver sobre o interfone, mas consegui conferir essa noite. Descobri que ele faz o contrário, quando clica no botão do interfone, ele fica com 0V, então no caso do Arduíno posso resolver isso em código. Certo?

O Arduino não se preocupa em tomar uma decisão quando um sinal é um ou zero, é comparar com HIGH ou com LOW.

Sim, nessa parte de HIGH ou LOW eu entendo. Eu tinha feito uma "campainha inteligente" com um push button aqui. Porém, tudo alimentado pelo próprio NodeMCU. Mas entendi, eu posso colocar então esses 3V nas portas GND e D1, por exemplo e quando o pino D1 passar para LOW enviar via MQTT para o Mosquitto e etc. A parte que mais tenho dúvida mesmo é no harware, medo de queimar ou estragar algo.

Eu fico muito agradecido por toda a paciência que você tem em me responder! Muito obrigado de verdade!

Se você teme tanto, use uma placa optoacoplada para que seu esp esteja sempre seguro.

Neste caso, os resistores anteriores seriam inúteis. O 6V será conectado diretamente.

1 Like

Então quer dizer que posso colocar esses 6V na porta GND e D1, por exemplo? Ou você diz isso com essa placa Optoacoplada?

Não. Na entrada da placa optoacoplada você colocará o 6V e na sua saída os 3,3V do esp e a porta D1 para leitura.

1 Like

Ah, entendi! Perfeito! Eu vou arriscar então com os dois resistores mesmo. Retorno aqui assim que fizer os testes e ver se funcionou! Muito obrigado!!

@gonpezzi , demorei para responder, mas finalmente consegui voltar a mexer no projeto.
Só passando para avisar que deu certo! Coloquei nos dois fios que retornam do interfone dois resistores de 22 ohm cada.
A tensão caiu para um pouco abaixo de 3V.
Coloquei um led só para sinalizar que está ligado e quando toca o interfone ele desliga.
Depois fiz uma ligação nas portas GND e D2 do NodeMCU.
O código vou deixar disponível abaixo, ficou simples, mas funciona com MQTT e a atualização pode ser feita via OTA.
Mas gostaria muito de agradecer sua ajuda, @gonpezzi ! Muito obrigado mesmo, pela paciência e disponibilidade de responder!

Esquema:
interfone_esp8266

Código:

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <PubSubClient.h>

/* WiFi Settings */
const char* ssid     = "SSID_WIFI";
const char* password = "PASSWORD_WIFI";
const int DELAY_TIME = 2000;

// PASSWORD OTA = 730

/*
  -------------------------------------------------
  NodeMCU / ESP8266  |  NodeMCU / ESP8266  |
  D0 = 16            |  D6 = 12            |
  D1 = 5             |  D7 = 13            |
  D2 = 4             |  D8 = 15            |
  D3 = 0             |  D9 = 3             |
  D4 = 2             |  D10 = 1            |
  D5 = 14            |                     |
  -------------------------------------------------
*/
#define LED_BUILTIN 2
const int doorbellPin = 4;   // Active high     NodeMCU pin D2

/* MQTT Settings */
const char* mqttTopicReceive = "devices/doorbell/receive";    // MQTT topic
const char* mqttTopicSend = "devices/doorbell/send";          // MQTT topic
const char* mqtt_username = "USERNAME_MQTT";                  // MQTT username
const char* mqtt_password = "PASSWORD_MQTT";                    // MQTT password

IPAddress broker(10, 0, 0, 4);          // Address of the MQTT broker
#define CLIENT_ID "doorbell"

// Client ID to send to the broker

/**
   MQTT callback to process messages
*/
void callback(char* topic, byte* payload, unsigned int lengthPayload) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < lengthPayload; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  
  // Examine only the first character of the message
  if (payload[0] == 49) {             // Message "1" in ASCII (turn outputs ON)
    digitalWrite(LED_BUILTIN, LOW);        // LED is active-low, so this turns it on
  } else if (payload[0] == 48) {      // Message "0" in ASCII (turn outputs OFF)
    digitalWrite(LED_BUILTIN, HIGH);     // LED is active-low, so this turns it off
  } else {
    Serial.println(" - Unknown value");
  }

}

WiFiClient wificlient;
PubSubClient client(wificlient);

/**
   Attempt connection to MQTT broker and subscribe to command topic
*/
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(CLIENT_ID, mqtt_username, mqtt_password)) {
      Serial.println("connected");
      client.subscribe(mqttTopicReceive);
      client.publish(mqttTopicSend, "ON");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

/**
   Setup
*/
void setup() {
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("WiFi begun");
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }
  Serial.println("Proceeding");

  // Port defaults to 8266
  // ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("myesp8266");

  // authentication password 730
  ArduinoOTA.setPassword((const char *)"730");

  ArduinoOTA.onStart([]() {
    Serial.println("Start");
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if      (error == OTA_AUTH_ERROR   ) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR  ) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR    ) Serial.println("End Failed");
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  /* Set up the outputs. LED is active-low */
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(doorbellPin, INPUT_PULLUP);
  digitalWrite(LED_BUILTIN, HIGH);

  /* Prepare MQTT client */
  client.setServer(broker, 1883);
  client.setCallback(callback);
}

/**
   Main
*/
void loop() {
  ArduinoOTA.handle();
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, password);
    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
      return;
    }
    Serial.println("WiFi connected");
  }

  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      reconnect();
    }
  }

  int sensorVal = digitalRead(doorbellPin);
  if (sensorVal == LOW) {
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("DETECTED");
    client.publish(mqttTopicSend, "DETECTED");
    delay(DELAY_TIME);
  } else {
    digitalWrite(LED_BUILTIN, HIGH);
  }
  
  if (client.connected()) {
    client.loop();
  }
}

O código foi baseado nesse link:
http://www.sunspot.co.uk/Projects/raspberrypi_LAN_master/MQTT_NodeRED/ESP8266%20relay%20control%20by%20MQTT%20OTA.html

Estou feliz que funcione para você, mas ...

É lógico, uma vez que os resistores têm o mesmo valor, aplique a lei dos ohms e você verá que qualquer que seja a tensão de entrada, ela será dividida por 2. Mas estou preocupado com o valor baixo que você escolheu para os resistores.

Vamos ver a intensidade que circula por meio desses resistores:
I = V / R ; I = 6 / 44 = 0,136 A (excessivo )
e a potência dissipada por cada resistor:
W= R x I x I = 22 x 0,136 x 0,136 = 0,41Watts !! , inadmissível. Acho que você não colocou resistores de 1/2 W, (que existem), e seria admissível ... ou são desses watts?
Você precisa reduzir a corrente que flui pela ponte do resistor, eu colocaria pelo menos 500 ohms cada ou eles acabariam queimando.
Esta mudança não afetará o MCU em tudo, mas eu não conheço o led, seu último diagrama não indica claramente as conexões.
Saudações-