Buenas noches, estoy desarrollando un firmware con NodeMCU para mandar los datos de un sensor de gas a la nube, para luego capturarlos en android.
el tema es que al tratar de compilarlo me sale el siguente errores relacionados con las funciones que he declarado previamente. Dejare el codigo para que lo puedan revisar si son tan amables.
ERROR
C:\Users\Usuario\Documents\Arduino\iotpanama_sgv1\iotpanama_sgv1.ino: In function 'void setup()':
iotpanama_sgv1:74:34: error: 'MQcalibracion' was not declared in this scope
float Ro = MQcalibracion(MQ_PIN);
/* Firmware version alfa del Sensor de Gas domestico
la misma es capaz de conectarse a WiFi. Con esta aplicacion es capaz
de detectar Alcohol, Gas Natural y Gas GLP.
Tambien sera capaz de conectarse a cualquier red de WiFi de lugar donde
se encuentre el sensor.
El calculo de las partes por millon se realiza de forma analitica
Segun la curva del fabricante, en este caso para el senspr MQ5
Desarrollado por el Ing. Jorge Quevedo, para IoTPanama.
*/
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
// Se conecta a la base de datos Firebase y al wifi.
#define FIREBASE_HOST "sensores-de-gas-wifi.firebaseio.com" // https://sensores-de-gas-wifi.firebaseio.com/
#define FIREBASE_AUTH "1xlL03JblPwDi0SDjioODqfVfUBF06qBEL9gs2bs"
#define WIFI_SSID "IoTPanama"
#define WIFI_PASSWORD "Max.7391"
#define D0 16
#define D4 2
#define MQ_PIN A0
/************************ DECLARACIONES ************************************/
const int calibracionLed = 13; //Señal led de calibracion
int valorRL = 1; //Valor de la resistecia de carga del sensor
float factor_R0_fabricante = 6.5; //Valor de resistencia del aire limpio derivado
//datasheet del fabricate.
/****************************MACROS*****************************************/
int contadorCalibracion = 50; //contador para promedio de calibracion de la señal
int intervaloCalibracion = 500; //intervalo de calibracion de cada toma de datos
int contadorLecturaDatos = 50; //define la cantidad de datos a tomar con el sensor en funcionamiento
int intervaloDatos = 5; //define el intervalo de los datos a ser leidos
//en operacion normal
int valor_limite= 150;
int interTime = 200;
int n = 0;
int R0calibrado = 0;
float Ro;
int voltajeSensor = 0;
String tipoGas;
void setup() {
Serial.begin(115200);
pinMode(D0, OUTPUT);
pinMode(D4, OUTPUT);
//digitalWrite(D0, HIGH);
// connect to wifi.
Serial.print("connecting");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
delay(1000);
digitalWrite(D4, HIGH);
delay(1000);
digitalWrite(D4, LOW);
delay(1000);
digitalWrite(D4,HIGH);
Serial.print("Calibrating...");
float Ro = MQcalibracion(MQ_PIN);
digitalWrite(D4,LOW);
Serial.println("Sensor calibrado");
Serial.print("Ro= ");
Serial.print(Ro);
Serial.println("kohm\n");
delay(2000);
}
void loop() {
long iPPM = 0;
int Rs = MQLectura(MQ_PIN);
float iPPM = MQcalculoPPM(Rs,Ro);
MQSerialPrint(tipoGas, voltajeSensor, Rs, Ro, iPPM);
}
/***************************** MQCalibracion ****************************************
Input: mq_pin - canal analogo
Output: Ro del sensor
Remarks: esta funcion calibra el sensor cuando es encendido a partir del RO teorico
para ajustar el RO real.
************************************************************************************/
float MQCalibracion(String mq_pin)
{
int i;
float ro = 0;
for (i=0;i<contadorCalibracion;i++) { //toma multiples datos
ro += MQcalculoResistencia(analogRead(mq_pin));
delay(intervaloCalibracion);
}
ro = ro/contadorCalibracion; //calcula el valor promedio
ro = ro/factor_R0_fabricante; //relacion del valor tomado dividido con el factor
Firebase.setFloat("RO Calibrado", ro); //proporcionado por el fabricante en la grafica
return ro; //del datasheet
}
/*********************** MQCalculoResistencia **************************************
Input: lectura de voltaje
Output: calculo de la resistencia del sensor
Remarks: El sensor y la resistencia de carga forman un divisor de voltaje.
Dado el voltaje a través de la resistencia de carga y su resistencia,
se podría derivar la resistencia del sensor.
************************************************************************************/
float MQcalculoResistencia(int voltajeSensor)
{
voltajeSensor = (voltajeSensor/1024*5);
return (((float)(5.0-voltajeSensor)/voltajeSensor));
}
/***************************** MQLectura ******************************************
Input: mq_pin - canal analogico
Output: Rs del sensor
Remarks: Esta funcion usa el MQcalculoResistencia, para determinar el RS del sensor.
El RS cambia a medida que el sensor está en las diferentes concentraciones
del gas objetivo. Pueden cambiarse el intervalo de lecturas y la cantidad
de datos a capturar para aumentar la precision de la lectura a promediar.
************************************************************************************/
float MQLectura(int mq_pin)
{
int i;
float rs=0;
for (i=0;i<contadorLecturaDatos;i++) {
rs += MQcalculoResistencia(analogRead(mq_pin));
delay(intervaloDatos);
}
rs = rs/contadorLecturaDatos;
return rs;
}
/***************************** MQcalculoPpm ******************************************
Input: mq_pin - canal analogico
Output: ppm
Remarks: Esta funcion determina el tipo de gas, además de reportar la concentración,
en partes por millón (PPM). Este calculo es analitico, basado en las ecuaciones
generadas a partir de las graficas que se encuentran en los datasheet del sensor.
***************************************************************************************/
float MQcalculoPPM(int rs, int ro){
float relacionRsRo;
long ppm;
relacionRsRo = rs/ro;
if (relacionRsRo <= 0.145){
relacionRsRo = 0.145;
}
if(relacionRsRo >= 6){
tipoGas = "Aire";
ppm = 0;
} else if(relacionRsRo <= 4 && relacionRsRo >= 2.3){
tipoGas = "CO";
//x = 1E+06y-6.704
ppm = 1E+06*pow(relacionRsRo,-6.704);
} else if(relacionRsRo <= 3.49 && relacionRsRo >= 1.45){
tipoGas = "Alcohol";
//x= 67950y-4.519
ppm = 67950*pow(relacionRsRo,-4.519);
} else if(relacionRsRo <= 1.74 && relacionRsRo >= 0.65){
tipoGas = "H2";
//x = 1174.6y-3.858
ppm = 1174.6*pow(relacionRsRo,-3.858);
} else if(relacionRsRo <= 0.95 && relacionRsRo >= 0.20){
tipoGas = "GLN";
//x = 180.41y-2.558
ppm = 180.41*pow(relacionRsRo,-2.558);
} else if(relacionRsRo <= 0.70 && relacionRsRo >= 0.15){
tipoGas = "GLP";
//x = 77.037y-2.505
ppm = 77.037*pow(relacionRsRo,-2.505);
}
};
return ppm;
}
/***************************** MQSerialPrint ******************************************
Input: TipoGas, voltajeSensor, Rs, Ro, PPM
Output:
Remarks: Esta funcion reporta los valores de las variables que intervienen el el
cálculo del valor de las partes por millon (PPM).
Esta funcion podra convertirse
***************************************************************************************/
void MQSerialPrint(String tg, float vs, float rs, float ro, long ppm){
Serial.print("Tipo Gas = ");
Serial.print(tg);
Serial.print(" ");
Serial.print("Voltaje = ");
Serial.print(vs);
Serial.print(" ");
Serial.print("RS_gas = ");
Serial.print(rs);
Serial.print(" ");
Serial.print("R0 = ");
Serial.print(ro);
Serial.print(" ");
Serial.print("RS/RO = ");
Serial.println(rs/ro);
Serial.print(" ");
Serial.print("PPM = ");
Serial.println(ppm);
delay(1000)
return
}
iotpanama_sgv1.ino (7.84 KB)