Arduino + ESP8266NodeMCU + Telegram

Bom dia a todos !!

Bom gente, primeiramente gostaria de agradecer à atenção de vocês adiantado.

Estou desenvolvendo um projeto bem simples de uma estação meteorológica independente, que funcione sem a necessidade de estar conectada via cabo à um pc ou à rede elétrica e meça 4 variáveis, umidade do ar, temperatura ambiente, pressão e nível de fumaça. A aquisição dos dados do sensores é feita pelo Arduino Mega 2560 e em conjunto com o ESP8266 NodeMCU as informações dos sensores precisam navegar do arduino até um "sistema de supervisão", seja telegram ou até mesmo um webserver, via Wireless (essa é a única restrição do projeto, não pode ser via cabo). Porém, estou enfrentando um problema na hora de comunicar o arduino com o ESP8266 NodeMCU na hora de transferir os dados dos sensores pra ele. Estarei copiando o meu código aqui e espero que possam me dar uma sugestão e uma dica para que meu trabalho fique mais simples, prático e funcional possível.

PS: Estou usando para realizar a transferência entre o Arduino e o ESP8266 NodeMCU a biblioteca VirtualWire como se estivesse usando RF.

Segue o código:

/*Programa : Estação de monitoramento ambiental Green Engineering
*/

// Configuração Módulo Wireless ESP8266
//#include <ESP8266WiFi.h>
//#include <WiFiUdp.h>
//WiFiUDP udp;
//String req;
// Configuração DHT11 (Umidade e Temperatura)
#include <VirtualWire.h>
#include <dht.h>
#define dht_dpin A1 //pino DATA do Sensor ligado na porta analógica A1
dht DHT; // Inicializa o Sensor

// Auxiliares de armazenamento
String mensagem;
int transmissor = 5;
int temp = 0;
char t[2];
int umid = 0;
char u[2];
int fuma_d = 0;
int fuma_a = 0;
char f[5];
int pres = 0;
char p[5];

// Configuração MQ-2 (Fumaça)
// Definicoes dos pinos dos leds e buzzer
int pin_led_verm = 7;
int pin_led_verde = 8;
int pin_buzzer = 6;
// Definicoes dos pinos ligados ao sensor
int pin_d0 = 2;
int pin_a0 = A2;
int nivel_sensor = 250;

// Configuração BMP180 (Pressão Barométrica)
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp180;
int mostrador = 0;

void setup() {
  //WiFi.mode(WIFI_STA);
  //WiFi.begin("Joao", "10256331");
  //delay(2000); //Tempo de espera para se conectar
  //udp.begin(736); //Abre a parte para "ouvir" os pacotes udp, a escolhida foi a 736.
  //sendudp();
  Serial.begin(9600);
  pinMode(transmissor,OUTPUT);
  vw_set_tx_pin(5);
  vw_setup(2000);   // Bits per sec
  delay(1000); //Aguarda 1 segundo antes de acessar as informações do sensor
  
  // Setup do Sensor BMP180
  if (!bmp180.begin())
  {
    Serial.println("Sensor nao encontrado !!");
    while (1) {}
  }
    
  // Setup do Sensor de Fumaça MQ-2  
  // Define os pinos de leitura do sensor como entrada
  pinMode(pin_d0, INPUT);  
  // Define pinos leds e buzzer como saida
  pinMode(pin_led_verm, OUTPUT);
  pinMode(pin_led_verde, OUTPUT);
  pinMode(pin_buzzer, OUTPUT);
  }  

void loop() {
  //Envio das informações WiFi
  //readudp();
  // Leitura do sensor de Umidade e temperatura
  DHT.read11(dht_dpin); // Lê as informações do sensor
  Serial.print("Umidade = ");
  Serial.print(DHT.humidity);
  Serial.print(" %  ");
  umid = DHT.humidity;
  String umidade;
  umidade = String(umid);
  umidade.toCharArray(u,2);
  Serial.print("Temperatura = ");
  Serial.print(DHT.temperature);
  Serial.println(" Celsius  ");
  temp = DHT.temperature;
  String temperatura;
  temperatura = String(temp);
  temperatura.toCharArray(t,2);
  delay(1000);
  
  // Leitura do sensor de Fumaça
  // Le os dados do pino digital D0 do sensor
  int valor_digital = digitalRead(pin_d0);
  // Le os dados do pino analogico A0 do sensor
  int valor_analogico = analogRead(pin_a0);
  // Mostra os dados no serial monitor
  Serial.print("Pino_D0 : ");
  Serial.print(valor_digital);
  fuma_d = valor_digital;
  Serial.print(" Pino A0 : ");
  Serial.println(valor_analogico);
  fuma_a = valor_analogico;
  String fumaca;
  fumaca = String(fuma_a);
  fumaca.toCharArray(f,5);
  // Verifica o nivel de gas/fumaca detectado
  if (valor_analogico > nivel_sensor)
  {
    // Liga o buzzer e o led vermelho, e
    // desliga o led verde
    digitalWrite(pin_led_verm, HIGH);
    digitalWrite(pin_led_verde, LOW);
    digitalWrite(pin_buzzer, HIGH);
  }
    else {
    // Desliga o buzzer e o led vermelho, e
    // liga o led verde
    digitalWrite(pin_led_verm, LOW);
    digitalWrite(pin_led_verde, HIGH);
    digitalWrite(pin_buzzer, LOW);
    delay(1000);    
  }
  
  //Leitura do Barômetro
    Serial.print("Pressao : ");
    Serial.print(bmp180.readPressure());
    pres = bmp180.readPressure();
    String pressao;
    pressao = String(pres);
    pressao.toCharArray(p,5);
    Serial.println(" Pa");
    delay(1000);

  char data[40]; 
    data[40] = 0;
    Serial.print(data);
    //Envia a mensagem para a rotina que
    //transmite os dados via RF
    send(data);
} 
 
void send (char *message)
{
  vw_send((uint8_t *)message, strlen(message));
  vw_wait_tx(); // Aguarda o envio de dados
   }

Porque não tens apenas o nodeMCU a fazer isso??

Opa, desculpe pela demora !

Não usei apenas o NodeMCU, pois eu ainda não sei como utilizar as saída dos sensores analógicas nos pinos digitais do MCU, visto que ele só possui entradas Digitais, certo ?

Eu mudei um pouco a minha programação
Segue o código modificado abaixo no Arduino:

#include <VirtualWire.h>
// Configuração DHT11 (Umidade e Temperatura)
#include <dht.h>
#define dht_dpin A1 //pino DATA do Sensor ligado na porta analógica A1
dht DHT; // Inicializa o Sensor

// Configuração MQ-2 (Fumaça)
// Definicoes dos pinos dos leds e buzzer
int pin_led_verm = 7;
int pin_led_verde = 8;
int pin_buzzer = 6;
// Definicoes dos pinos ligados ao sensor
int pin_d0 = 2;
int pin_a0 = A2;
int nivel_sensor = 250;

// Configuração BMP180 (Pressão Barométrica)
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp180;
int mostrador = 0;

//Variáveis que vão armazenar os valores dos sensores
int temp, umid, pres, fumaca;
char vPos[]={"000000"}; // char que sera transmitido para o receptor "temp, umid, pres, fumaca"
char b[2];
String var; // valor que sera acrescentado de cada variavel ao vPos

void setup() {
Serial.begin(9600);
//Define o pino 8 do arduino como
//o pino de dados do transmissor
vw_set_tx_pin(5);
vw_setup(2000); //Bits por segundo
delay(1000); //Aguarda 1 segundo antes de acessar as informações do sensor

// Setup do Sensor BMP180
if (!bmp180.begin())
{
Serial.println("Sensor nao encontrado !!");
while (1) {}
}

// Setup do Sensor de Fumaça MQ-2
// Define os pinos de leitura do sensor como entrada
pinMode(pin_d0, INPUT);

// Define pinos leds e buzzer como saida
pinMode(pin_led_verm, OUTPUT);
pinMode(pin_led_verde, OUTPUT);
pinMode(pin_buzzer, OUTPUT);
}

void loop() {
//Envio das informações WiFi
// Leitura do sensor de Umidade e temperatura
DHT.read11(dht_dpin); // Lê as informações do sensor
Serial.print("Umidade = ");
Serial.print(DHT.humidity);
Serial.print(" % ");
Serial.print("Temperatura = ");
Serial.print(DHT.temperature);
Serial.println(" Celsius ");
umid = DHT.humidity;
temp = DHT.temperature;
delay(2000);

// Leitura do sensor de Fumaça
// Le os dados do pino digital D0 do sensor
int valor_digital = digitalRead(pin_d0);
// Le os dados do pino analogico A0 do sensor
int valor_analogico = analogRead(pin_a0);

// Mostra os dados no serial monitor
Serial.print("Pino_D0 : ");
Serial.print(valor_digital);
Serial.print(" Nivel Fumaca : ");
Serial.println(valor_analogico);
fumaca = valor_analogico;

// Verifica o nivel de gas/fumaca detectado
if (valor_analogico > nivel_sensor)
{
// Liga o buzzer e o led vermelho, e
// desliga o led verde
digitalWrite(pin_led_verm, HIGH);
digitalWrite(pin_led_verde, LOW);
digitalWrite(pin_buzzer, HIGH);
}
else {
// Desliga o buzzer e o led vermelho, e
// liga o led verde
digitalWrite(pin_led_verm, LOW);
digitalWrite(pin_led_verde, HIGH);
digitalWrite(pin_buzzer, LOW);
delay(100);
}

//Leitura do Barômetro
pres = bmp180.readPressure();
Serial.print("Pressao : ");
Serial.print(bmp180.readPressure());
Serial.println(" Pa");
delay(1000);

//Realiza conversão das variáveis integrais para uma string e adiciona-as a um vetor de char
var = String(temp);
var.toCharArray(b,2);
Serial.println(var);
vPos[0]=var[0];
vPos[1]=var[1];

var = String(umid);
var.toCharArray(b,2);
Serial.println(var);
vPos[2]=var[0];
vPos[3]=var[1];

var = String(pres);
var.toCharArray(b,2);
Serial.println(var);
vPos[4]=var[0];
vPos[5]=var[1];

var = String(fumaca);
var.toCharArray(b,2);
Serial.println(var);
vPos[6]=var[0];
vPos[7]=var[1];

Serial.println(vPos); //Print pra ver como ele sera transmitido

vw_send((uint8_t*)vPos,strlen(vPos)); // transmite o vetor por RF
vw_wait_tx(); //Aguarda o envio de dados
delay(200);

}

Segue abaixo o código que estou tentando compilar para o ESP8266 NodeMCU (que por sinal, não consigo compilar, já que da erro na compilação para a placa esp8266 NodeMCU):

#include <VirtualWire.h>

byte buf[VW_MAX_MESSAGE_LEN];
byte buflen = VW_MAX_MESSAGE_LEN;

void setup() {
Serial.begin(9600);
vw_set_rx_pin(5);
vw_setup(2000);
vw_rx_start();
}

void loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN]; // armazena os caracteres
uint8_t buflen = VW_MAX_MESSAGE_LEN; // armazena o numero de caracteres que serão recebidos

if(vw_get_message(buf,&buflen)) { //recebe os caracteres e sua quantidade
Serial.print("Recebido: ");
for (int i = 0; i < buflen; i++) { //escreve um caracter por vez
Serial.write(buf*);*

  • }*
  • Serial.print(" ");*
  • Serial.print("Temperatura: ");*
  • Serial.write(buf[0]);*
  • Serial.write(buf[1]);*
  • Serial.println("c");*
  • Serial.println("Umidade: ");*
  • Serial.write(buf[2]);*
  • Serial.write(buf[3]);*
  • Serial.print("%");*
  • Serial.print("Pressao: ");*
  • Serial.write(buf[4]);*
  • Serial.write(buf[5]);*
  • Serial.println("bar");*
  • Serial.println("Fumaca: ");*
  • Serial.write(buf[6]);*
  • Serial.write(buf[7]);*
  • Serial.println("ppm");*
  • Serial.println(" ");*
  • }*
    }

O nodeMCU tem uma entrada analógica com o máximo a 3.3V... dá ideia que apenas usas uma entrada analógica também.
Mas tu lá sabes.

bubulindo:
O nodeMCU tem uma entrada analógica com o máximo a 3.3V... dá ideia que apenas usas uma entrada analógica também.
Mas tu lá sabes.

Opa, amigo, tudo bom ?
Eu realmente desconhecia o poder do NodeMCU e o quão prático essa plaquinha podia se tornar.
Consegui fazer algo com ela que eu não imaginaria que iria conseguir. Fiz o que você falou e resolveu largar mão do Arduino e fazer uso apenas da NodeMCU. E deu certo, consegui enviar as informações dos meus sensores para o site thingspeak.com e consigo visualizá-las em qualquer lugar que eu esteja, desde que tenha um acesso á internet.

Direto ou indiretamente você me ajudou e me deu esse empurrão para usar essa peça, portanto te agradeço !

Existe uma biblioteca própria da Thingspeak... caso não tenha sido isso que usaste também.

É bastante bom para este tipo de aplicações.