ESP8266 - ModbusIP com ScadaBR

a biblioteca modbusIP para o ESP8266
foi atualizada e a funcão mb.config deixou de funcionar, como ainda consta no exemplo para o MODBUS, a funcão mb.config, eu encontrei o código abaixo que funciona com a versão 4.10 da biblioteca ModbusIP_ESP8266.

instale a biblioteca de:

Abaixo o código de exemplo com modificações:

/*
  Modbus-Arduino Example - Test Analog Input (Modbus IP ESP8266)
  Read Analog sensor on Pin ADC (ADC input between 0 ... 1V)
  Original library
  Copyright by André Sarmento Barbosa
  http://github.com/andresarmento/modbus-arduino
  Current version
  (c)2017 Alexander Emelianov (a.m.emelianov@gmail.com)
  https://github.com/emelianov/modbus-esp8266
*/

#ifdef ESP8266
 #include <ESP8266WiFi.h>
#else //ESP32
 #include <WiFi.h>
#endif
#include <ModbusIP_ESP8266.h>

// Preencha com as credenciais da sua rede
const char* ssid     = "MinhaRedeSemFio";
const char* password = "MinhaSenha";

// Se for usar IP Fixo, preencha os valores abaixo
IPAddress local_IP(192, 168, 0, 150);
// Set your Gateway IP address
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 0, 0);
IPAddress primaryDNS(8, 8, 8, 8);   //optional
IPAddress secondaryDNS(8, 8, 4, 4); //optional
//Modbus Registers Offsets
const int SENSOR_IREG = 0;

//Declara o Objeto ModbusIP  
ModbusIP mb;

long ts; // Tempo ts

void setup() {
    Serial.begin(115200); // Iniciando a Serial
    Serial.println("\n\n\n");
  Serial.println("ESP8266-Modbus-https://github.com/emelianov/modbus-esp8266");
    Serial.print("Tentando configurar a rede Wifi com ssid: ");
    Serial.println(ssid);
    Serial.print ("password: ");
    Serial.println(password);

int count=0; // usado apenas para a conexao wifi...
  // Descomente as linhas a seguir para configurar ip Fixo
  // Aqui seta os valores de endereço IP
  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Serial.println("ERRO! STA Falha na configuração!");
  }

  
  // Conecta a rede Wifi (se nao for descomentado as linhas acima, o IP será obtido por DHCP) 
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500); // Aguarda meio segundo
        Serial.print(".");
        count++;
// Se ele imprimiu 25 pontos, salta a linha e comeca novamente.
        if (count >25) {count=0;Serial.println(".");}
    }
    Serial.println(". TERMINADO!");
    Serial.println(" ");
    Serial.println("Rede WiFi conectada!");  
    Serial.print("ssid: ");
    Serial.println(ssid);
    Serial.print ("password: ");
    Serial.println(password);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    WiFi.printDiag(Serial); // Essa linha joga info sobre a conexão e mostra diagnosticos do WIFI via porta serial.
    Serial.print("Iniciando ModbusIP  \nIP: " );
    Serial.print(WiFi.localIP());
        Serial.print(":502");
    Serial.println(" qualquer ID... ");
    mb.server();    //Iniciou Servidor Modbus IP
// +-----------------+---------------+------------+-------------------+    
// |Register type    | Use as        |Access      | Library methods   |
// +-----------------+---------------+------------+-------------------+  
// |Coil             | Digital Output| Read/Write | addCoil(), Coil() |
// |Holding Register | Analog Output | Read/Write | addHreg(), Hreg() |
// |Input Status     | Digital Input | Read Only  | addIsts(), Ists() |
// |Input Register   | Analog Input  | Read Only  | addIreg(), Ireg() |
// +-----------------+---------------+------------+-------------------+

    // Adiciona SENSOR_IREG - Use addIreg() para Entradas analógicas    
    Serial.print("Acicionando Ireg (Input Register) numero: ");
    Serial.println(SENSOR_IREG);
    mb.addIreg(SENSOR_IREG);
    ts = millis();
}

void loop() {
   //Dentro do loop() - execute uma vez para a mágica funcionar...
   mb.task();

   //atualização a cada 2 segundos
   if (millis() > ts + 2000) {
       ts = millis();
       //Valor lido em A0 (0-1024)
       // coloca o valor lido de A0 para  o InputRegister SENSOR_IREG
       mb.Ireg(SENSOR_IREG, analogRead(A0)); 
   }
   delay(10);
}

Vamos ver no ScadaBR, crie um datasource MODBUS IP:

Após colocar o nome do datapoint, coloque o endereco IP do host

Abaixo: o Scan e o teste!

A porta Analógica do ESP32 possui algumas observações sobre questöes sobre precisão. Isso não foi tratado aqui. É apenas para código de exemplo…

Prezado Wagner, estou no jardim de infância em assuntos de microcontroladores e IoT. Descobri este site por acidente e gostaria de lhe pedir uma orientação com um problema que gostaria de resolver. A princípio o que preciso parece coisa simples mas como fazer está sendo complicado. Farei um resumo. Gostaria de conectar um interruptor sensor de temperatura (interruptor normalmente aberto que quando atinge a sua temperatura de atuação fecha a chave) em uma porta digital de um ESP-01. Gostaria de conectar o ESP-01 a um roteador sem fio. conectar um computador no mesmo roteador. Quando o sensor de temperatura atuar, ele vai informar o computador que “algo está quente”.
Conectar o ESP-01 ao roteador é simples. Não sei como fazer para o computador “enxergar” o ESP-01 na rede e alarmar no computador que a temperatura passou do limite.
Não será apenas um sensor com um ESP-01. Serão vários em pontos diferentes.
Perguntas:

1 - Eu consigo fazer isso diretamente pelo roteador sem a necessidade de conexão com um servidor tipo MQTT?

2 - Este software SCADABR faz esta função?

3 - Faz direto entre o ESP-01, o roteador e o computador ou ele funciona como um servidor sendo necessário se conectar a internet?

Peço desculpas se falei alguma bobagem. Meu conhecimento é mínimo e estou tentando entender.
Preciso colocar muitos destes sensores de temperatura, cada sensor com um ESP-01 ligado nele e quando um ou mais atuar, um alarme apareça em um computador informando qual sensor ou quais sensores atuaram.
Se puder me orientar eu serei muito grato.
Atenciosamente,

Italo Foradini

O ESP-01 possui pouco IO para uso, uma vez que o ESP-01 está conectado a rede, ele vai receber um IP do roteador, a não ser que ele tenha IP fixo.

Uma vez que o ESP-01 esta na rede, faça ele fazer as leituras continuamente e escolha uma política de aviso, tipo, se não houver nenhum problema, a cada 5 minutos, ele transmite a temperatura atual para o ScadaBR. Caso ocorra o evento, ele envia na hora para o ScadaBR.

eu recomendo usar o http listener no ScadaBR, é muito simples de usar.

http://ipScadaBR:8080/ScadaBR/httpds?id=ESP1001&temperatura10010=234&temperatura10011=237

crie esses datapoints, o ID identifica quem transmitiu, serve para voce saber a ultima vez que tal device transmitiu, só lendo os IDs e o tempo. temperatura10010 e temperatura10011 sao os sensores de cada placa enviando dados. Voce não é obrigado a ficar lendo a temperatura, pode simplesmente esperar a transmissao., pois quando trabalhamos com eventos, o device é quem nos avisa de anomalias.

para localizar na rede, vc pode usar o hostname da placa, mas nem sempre funciona. tem um esquema de mdns, no android nao funciona, mas no windows vc acaba localizando.

quanto ao httplistener, para enviar pro scadaBR via http é simples:

Na esperança de ter sido útil, desejo-lhe boa sorte, na dúvida, posta aqui seu código e sua dúvida.