ESP8266 em low energy com ScadaBR

Boa tarde a todos,

Vou dar um exemplo de como usar o modo low energy do ESP8266 junto com o ScadaBR, já que não é possível usando o protocolo ModBus.

1° passo: Crie um Datasource HTTP Receiver

datasource

Você pode usar a ferramenta de receptor http para testar.

auditor

2° passo: Crie os Datapoints que serão usados

3° passo: Use o código no ESP

#include <ESP8266WiFi.h> //biblioteca wifi
#include <ESP8266HTTPClient.h> //biblioteca do http

#include “DHT.h” //biblioteca do dht11, adafruit

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE); //configuração do tipo de sensor

//#include <OneWire.h>
//#include <DallasTemperature.h>
//const int oneWireBus = 4;
//OneWire oneWire(oneWireBus);
//DallasTemperature sensors(&oneWire); //caso for usar o ds18b20, descomente

const char* ssid = “wifi”;
const char* password = “senha”; //sua wifi e senha

const char* host = “http://192.168.1.236:8080/ScadaBR/httpds”; //use o ip do seu scadabr e a porta, mas mantenha o /httpds

const int analogInPin = A0;
float sensorValue = 0; //pino pra tirar uma amostra de tensão da bateria

String valor = “”;

float h;
float t;

void setup()
{
Serial.begin(74880);
Serial.println();

Serial.printf(“Connecting to wifi”);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(“.”);
}
Serial.println(" connected");

}

void loop() {

HTTPClient http;
http.begin(host);
http.addHeader(“Content-Type”, “application/x-www-form-urlencoded”);

//float temperatureC = sensors.getTempCByIndex(0);//leitura de temperatura do ds

do{
delay(100);
h = dht.readHumidity();
t = dht.readTemperature();
sensorValue = analogRead(analogInPin);
}while((isnan(h) || isnan(t) || isnan(sensorValue)));//lê temperaturas

valor=(String)“tensao=”+sensorValue+“&temp=”+t+“&umi=”+h;//monta a string pro POST, no formato variavel1=valor1&variavel2=valor2 e assim por diante

http.POST(valor);
http.writeToStream(&Serial);
http.end();//posta e encerra a conexão

ESP.deepSleep(300e6);//bota o esp pra dormir, 300 segundos, 5 minutos
}

4°passo: Conecte o pino GPIO16 ao pino RST pra permitir o ESP acordar do deepsleep

5° passo: Use um divisor de tensão para amostrar o valor de tensão da bateria no pino ADC0

6° passo: Configure um Datasource virtual pra converter o valor recebido do ADC em volts, ou edite o código pra fazer isso no próprio ESP.

Pronto! Agora é só configurar de acordo com o gosto, inclusive monitorar a bateria. Em meus testes tive o consumo de 70mA em transmissão e 9mA em modo sleep sem nenhuma modificação da placa.

No exemplo eu estou utilizando um módulo ESP-01 com um “shield” DHT11 e uma bateria 16850 diretamente nos pinos do regulador. Note que tive que soldar fios diretamente dos pinos GPIO16 e ADC0 do ESP.

Quando tiver resultados de duração de bateria posto.

3 curtidas

@jeff_pimenta,

Amigo,

material muito bom. Já vai ganhar meu joinha. Se postar os resultados ganhará um parabéns público, e uma comenda.
Precisamos ajudar a comunidade ter idéias. Seu post fez isso.

Já tenho o primeiro resultado de duração da bateria

Por algum motivo o esp travou às 6 da noite e só voltou à uma da manhã, como o wifi ficou ligado a bateria foi embora num piscar de olhos.

Usei uma bateria de 1600mAh carregado com pouco mais de 3.8V

Abaixo o código atualizado.

#include <ESP8266WiFi.h> //biblioteca wifi
#include <ESP8266HTTPClient.h> //biblioteca do http

#include “DHT.h” //biblioteca do dht11, adafruit

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE); //configuração do tipo de sensor

//#include <OneWire.h>
//#include <DallasTemperature.h>
//const int oneWireBus = 4;
//OneWire oneWire(oneWireBus);
//DallasTemperature sensors(&oneWire); //caso for usar o ds18b20, descomente

const char* ssid = “wifi”;
const char* password = “senha”; //sua wifi e senha

const char* host = “http://192.168.1.236:8080/ScadaBR/httpds”; //use o ip do seu scadabr e a porta, mas mantenha o /httpds

const int analogInPin = A0;
int sensorValue = 0; //pino pra tirar uma amostra de tensão da bateria

String valor = “”;

float h=0;
float hfinal=0;
float t=0;
float tfinal=0;
float bateria=0;
int i=0;
int j=0;

void setup()
{
Serial.begin(74880);
Serial.println();

j=0;
hfinal=0;
tfinal=0;
bateria=0;

for(i=0;i<10;i++){
do{
if (j>100) {ESP.deepSleep(300e6);}//dorme o esp se 100 medidas foram erradas
delay(100);
h = dht.readHumidity();
t = dht.readTemperature();
sensorValue = analogRead(analogInPin);
j++;
}while((isnan(h) || isnan(t) || isnan(sensorValue)));//lê temperaturas

hfinal=hfinal+h;
tfinal=tfinal+t;
bateria=bateria+sensorValue;
}

hfinal=hfinal/10;
tfinal=tfinal/10;
bateria=bateria/10;

valor=(String)“tensao=”+bateria+“&temp=”+tfinal+“&umi=”+hfinal;//monta a string pro POST, no formato variavel1=valor1&variavel2=valor2 e assim por diante

Serial.printf(“Connecting to wifi”);
WiFi.begin(ssid, password);
i=0;
while (WiFi.status() != WL_CONNECTED)
{
i++;
delay(500);
Serial.print(“.”);
if (i>40) ESP.deepSleep(60e6);//dorme 1min se não conectar em até 20 seg
}
Serial.println(" connected");

HTTPClient http;
http.begin(host);
http.addHeader(“Content-Type”, “application/x-www-form-urlencoded”);
http.POST(valor);
http.writeToStream(&Serial);
http.end();//posta e encerra a conexão

}

void loop() {
ESP.deepSleep(300e6);//bota o esp pra dormir, 300 segundos, 5 minutos
}

Como os resultados vão demorar pra vir, vou postar uma prévia:

Fazendo semelhança de triângulos na imagem eu estimo uma autonomia de 40 dias com uma bateria de 1600mAh carregada com pouco mais de 3.8V