lector de gases
Publicado por Damian (1 intervención) el 16/10/2020 18:28:46
tengo problemas con este codigo, el buzzer esta constantemente encendido aun cuando el valor limite no es exedido.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <Wire.h>
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int buz = 13;
int Rele = 7;
const int MQ_PIN = A0; // Pin del sensor
const int RL_VALUE = 5; // Resistencia RL del modulo en Kilo ohms
const int R0 = 10; // Resistencia R0 del sensor en Kilo ohms
// Datos para lectura multiple
const int READ_SAMPLE_INTERVAL = 1000; // Tiempo entre muestras
const int READ_SAMPLE_TIMES = 5; // Numero muestras
// Ajustar estos valores para vuestro sensor según el Datasheet
// (opcionalmente, según la calibración que hayáis realizado)
const float X0 = 20;
const float Y0 = 1.5;
const float X1 = 2000;
const float Y1 = 0.5;
// Puntos de la curva de concentración {X, Y}
const float punto0[200] = { log10(X0), log10(Y0) };
const float punto1[1000] = { log10(X1), log10(Y1) };
// Calcular pendiente y coordenada abscisas
const float scope = (punto1[1] - punto0[1]) / (punto1[0] - punto0[0]);
const float coord = punto0[1] - punto0[0] * scope;
int valor_limite = 366; // Fiaja el valor limite en el que se activa la alarma
float valor_alcohol;
// Fije el valor despues de visualizar el nivel con el Monitor Serial
void setup() {
Serial.begin(9600); // Activa el puerto Serial a 9600 Baudios
pinMode(13, OUTPUT); // Configura el Pin 13 como salida para el Zumbador
pinMode (Rele,OUTPUT);
lcd.init();//Serial.begin(9600);
lcd.backlight();
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("calibrando");
delay(1000);
}
void loop() {
valor_alcohol = analogRead(A1);
Serial.println(valor_alcohol); // Envia al Serial el valor leido del Sensor MQ3
float porcentaje = (valor_alcohol / 100); //calcula el porcentaje
Serial.println(porcentaje); // Envia al Serial el porcentaje
Serial.println(' ');
if (valor_alcohol > valor_limite) { // Si la medida de gas metano es mayor de valor limite
digitalWrite(13, HIGH ); // Enciende el Zumbador conectado al Pin 13
}
else { // Si es menor del valor limite apaga el Zumbador
digitalWrite(13, LOW);
}
delay (500); // Espera 300ms para realizar la proxima medida
float rs_med = readMQ(MQ_PIN); // Obtener la Rs promedio
float concentration = getConcentration(rs_med / R0); // Obtener la concentración
// Mostrar el valor de la concentración por serial
lcd.setCursor(0, 0);
lcd.print("concentration: ");
lcd.setCursor(6, 1);
lcd.print(concentration);
delay(5000);
lcd.setCursor(0, 0);
lcd.print("valor_del_gas");
lcd.setCursor(6, 1);
lcd.print(valor_alcohol);
delay(500);
if ( valor_limite = HIGH){
digitalWrite (7, HIGH);
}
else {
digitalWrite (7, LOW);
}
}
// Obtener la resistencia promedio en N muestras
float readMQ (int mq_pin)
{
float rs = 0;
for (int i = 0; i < READ_SAMPLE_TIMES; i++) {
rs += getMQResistance(analogRead(mq_pin));
delay(READ_SAMPLE_INTERVAL);
}
return rs / READ_SAMPLE_TIMES;
}
// Obtener resistencia a partir de la lectura analogica
float getMQResistance(int raw_adc)
{
return (((float)RL_VALUE / 1000.0 * (1023 - raw_adc) / raw_adc));
}
// Obtener concentracion 10^(coord + scope * log (rs/r0)
float getConcentration(float rs_ro_ratio)
{
return pow(10, coord + scope * log(rs_ro_ratio));
}
Valora esta pregunta


0