Arduino - lector de gases

 
Vista:

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder