INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
MQ2 Sensor (FC-22) Smoke/CO2/LPG
26.02.2016, 16:23 (Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2016 18:57 von Hilgi.)
Beitrag #1
MQ2 Sensor (FC-22) Smoke/CO2/LPG
Hi Leute Smile


Ich habe mich noch mal daran gemacht ein altes Projekt auf zu werten.
Es geht um eine Überwachungsanlage für eine Hackschnitzelanlage, zur Erhitzung von Wasser.

Mit im Projekt verbaut ist ein MQ2 sensor.
Dieser soll smoke/co2/lpg erfassen können und dient zur Branderkennung.

Via thingspeak.com werte ich meine Daten aus, gesendet per esp8266.

Jetzt gibt der mq2 leider per analogread nur einen kommulierten wert aus oder so etwas. In mehrern tuts habe ich eigentlich keine probate lösung finden können.

Lediglich auf:
http://sandboxelectronics.com/?p=165

habe ich eine differenzierte auswertung des sensors gefunden!

Wenn ich jedoch das original sketch flashe:
Code:
/*******************Demo for MQ-2 Gas Sensor Module V1.0*****************************
Support:  Tiequan Shao: support[at]sandboxelectronics.com

Lisence: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)

Note:    This piece of source code is supposed to be used as a demostration ONLY. More
         sophisticated calibration is required for industrial field application.

                                                    Sandbox Electronics    2011-04-25
********************************************************************************​****/

/************************Hardware Related Macros************************************/
#define         MQ_PIN                       (0)     //define which analog input channel you are going to use
#define         RL_VALUE                     (5)     //define the load resistance on the board, in kilo ohms
#define         RO_CLEAN_AIR_FACTOR          (9.83)  //RO_CLEAR_AIR_FACTOR=(Sensor resistance in clean air)/RO,
                                                     //which is derived from the chart in datasheet

/***********************Software Related Macros************************************/
#define         CALIBARAION_SAMPLE_TIMES     (50)    //define how many samples you are going to take in the calibration phase
#define         CALIBRATION_SAMPLE_INTERVAL  (500)   //define the time interal(in milisecond) between each samples in the
                                                     //cablibration phase
#define         READ_SAMPLE_INTERVAL         (50)    //define how many samples you are going to take in normal operation
#define         READ_SAMPLE_TIMES            (5)     //define the time interal(in milisecond) between each samples in
                                                     //normal operation

/**********************Application Related Macros**********************************/
#define         GAS_LPG                      (0)
#define         GAS_CO                       (1)
#define         GAS_SMOKE                    (2)

/*****************************Globals********************************************​***/
float           LPGCurve[3]  =  {2.3,0.21,-0.47};   //two points are taken from the curve.
                                                    //with these two points, a line is formed which is "approximately equivalent"
                                                    //to the original curve.
                                                    //data format:{ x, y, slope}; point1: (lg200, 0.21), point2: (lg10000, -0.59)
float           COCurve[3]  =  {2.3,0.72,-0.34};    //two points are taken from the curve.
                                                    //with these two points, a line is formed which is "approximately equivalent"
                                                    //to the original curve.
                                                    //data format:{ x, y, slope}; point1: (lg200, 0.72), point2: (lg10000,  0.15)
float           SmokeCurve[3] ={2.3,0.53,-0.44};    //two points are taken from the curve.
                                                    //with these two points, a line is formed which is "approximately equivalent"
                                                    //to the original curve.
                                                    //data format:{ x, y, slope}; point1: (lg200, 0.53), point2: (lg10000,  -0.22)                                                    
float           Ro           =  10;                 //Ro is initialized to 10 kilo ohms

void setup()
{
  Serial.begin(9600);                               //UART setup, baudrate = 9600bps
  Serial.print("Calibrating...\n");                
  Ro = MQCalibration(MQ_PIN);                       //Calibrating the sensor. Please make sure the sensor is in clean air
                                                    //when you perform the calibration                    
  Serial.print("Calibration is done...\n");
  Serial.print("Ro=");
  Serial.print(Ro);
  Serial.print("kohm");
  Serial.print("\n");
}

void loop()
{
   Serial.print("LPG:");
   Serial.print(MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_LPG) );
   Serial.print( "ppm" );
   Serial.print("    ");  
   Serial.print("CO:");
   Serial.print(MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_CO) );
   Serial.print( "ppm" );
   Serial.print("    ");  
   Serial.print("SMOKE:");
   Serial.print(MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_SMOKE) );
   Serial.print( "ppm" );
   Serial.print("\n");
   delay(200);
}

/****************** MQResistanceCalculation ****************************************
Input:   raw_adc - raw value read from adc, which represents the voltage
Output:  the calculated sensor resistance
Remarks: The sensor and the load resistor forms a voltage divider. Given the voltage
         across the load resistor and its resistance, the resistance of the sensor
         could be derived.
********************************************************************************​****/
float MQResistanceCalculation(int raw_adc)
{
  return ( ((float)RL_VALUE*(1023-raw_adc)/raw_adc));
}

/***************************** MQCalibration ****************************************
Input:   mq_pin - analog channel
Output:  Ro of the sensor
Remarks: This function assumes that the sensor is in clean air. It use  
         MQResistanceCalculation to calculates the sensor resistance in clean air
         and then divides it with RO_CLEAN_AIR_FACTOR. RO_CLEAN_AIR_FACTOR is about
         10, which differs slightly between different sensors.
********************************************************************************​****/
float MQCalibration(int mq_pin)
{
  int i;
  float val=0;

  for (i=0;i<CALIBARAION_SAMPLE_TIMES;i++) {            //take multiple samples
    val += MQResistanceCalculation(analogRead(mq_pin));
    delay(CALIBRATION_SAMPLE_INTERVAL);
  }
  val = val/CALIBARAION_SAMPLE_TIMES;                   //calculate the average value

  val = val/RO_CLEAN_AIR_FACTOR;                        //divided by RO_CLEAN_AIR_FACTOR yields the Ro
                                                        //according to the chart in the datasheet

  return val;
}
/*****************************  MQRead *********************************************
Input:   mq_pin - analog channel
Output:  Rs of the sensor
Remarks: This function use MQResistanceCalculation to caculate the sensor resistenc (Rs).
         The Rs changes as the sensor is in the different consentration of the target
         gas. The sample times and the time interval between samples could be configured
         by changing the definition of the macros.
********************************************************************************​****/
float MQRead(int mq_pin)
{
  int i;
  float rs=0;

  for (i=0;i<READ_SAMPLE_TIMES;i++) {
    rs += MQResistanceCalculation(analogRead(mq_pin));
    delay(READ_SAMPLE_INTERVAL);
  }

  rs = rs/READ_SAMPLE_TIMES;

  return rs;  
}

/*****************************  MQGetGasPercentage **********************************
Input:   rs_ro_ratio - Rs divided by Ro
         gas_id      - target gas type
Output:  ppm of the target gas
Remarks: This function passes different curves to the MQGetPercentage function which
         calculates the ppm (parts per million) of the target gas.
********************************************************************************​****/
int MQGetGasPercentage(float rs_ro_ratio, int gas_id)
{
  if ( gas_id == GAS_LPG ) {
     return MQGetPercentage(rs_ro_ratio,LPGCurve);
  } else if ( gas_id == GAS_CO ) {
     return MQGetPercentage(rs_ro_ratio,COCurve);
  } else if ( gas_id == GAS_SMOKE ) {
     return MQGetPercentage(rs_ro_ratio,SmokeCurve);
  }    

  return 0;
}

/*****************************  MQGetPercentage **********************************
Input:   rs_ro_ratio - Rs divided by Ro
         pcurve      - pointer to the curve of the target gas
Output:  ppm of the target gas
Remarks: By using the slope and a point of the line. The x(logarithmic value of ppm)
         of the line could be derived if y(rs_ro_ratio) is provided. As it is a
         logarithmic coordinate, power of 10 is used to convert the result to non-logarithmic
         value.
********************************************************************************​****/
int  MQGetPercentage(float rs_ro_ratio, float *pcurve)
{
  return (pow(10,( ((log(rs_ro_ratio)-pcurve[1])/pcurve[2]) + pcurve[0])));
}


ist mein output wie folgt:

Code:
connected at 9600
Calibrating...
Calibration is done...
Ro=5.92kohm
LPG:0ppm    CO:0ppm    SMOKE:0ppm
LPG:0ppm    CO:0ppm    SMOKE:0ppm
LPG:0ppm    CO:0ppm    SMOKE:0ppm
LPG:0ppm    CO:0ppm    SMOKE:0ppm
LPG:0ppm    CO:0ppm    SMOKE:0ppm
LPG:0ppm    CO:0ppm    SMOKE:0ppm

der "Ro"-wert ändert sich fast nach jedem neustart, ansonsten bleibt der output gleich, auch nach stunden (aufwärmphase), keine veränderung.

vlt ist mein englisch auf nicht ausreichend, ich habe den sensor direkt an A0 angeschlossen, ohne einen weiteren widerstand.

nutze ich einen simplen analogread sketch, erhalte ich werte um die 100-150, allerdings nur einen output wert, keine differenzierten werte.


meine frage:

hat einer von euch erfahrungen mit dem sensor/sketch, eine alternative/lösung, damit ich die drei werte auslesen kann?


im anhang sensor und aufbau!



vielen dank im vorraus, hilgi Wink

   
   

tja....

ich such schon seit stunden Sad


also das interessanteste und vielversprechendste ist wohl das hier:

.ino  mq2.ino (Größe: 587 Bytes / Downloads: 48)

die libary hab ich hier:

.h  MQ2.h (Größe: 1,05 KB / Downloads: 52)

.cpp  MQ2.cpp (Größe: 2,67 KB / Downloads: 62)



das problem is beim compilieren über codebender.cc :
Code:
In file included from (sketch file) mq2-test.ino:1:
(personal library file) MQ2/MQ2.h:22: error: ISO C++ forbids initialization of member 'RL_VALUE'
(personal library file) MQ2/MQ2.h:22: error: making 'RL_VALUE' static
(personal library file) MQ2/MQ2.h:22: error: ISO C++ forbids in-class initialization of non-const static member 'RL_VALUE'
(personal library file) MQ2/MQ2.h:23: error: ISO C++ forbids initialization of member 'RO_CLEAN_AIR_FACTOR'
(personal library file) MQ2/MQ2.h:23: error: making 'RO_CLEAN_AIR_FACTOR' static
(personal library file) MQ2/MQ2.h:23: error: ISO C++ forbids in-class initialization of non-const static member 'RO_CLEAN_AIR_FACTOR'
(personal library file) MQ2/MQ2.h:24: error: ISO C++ forbids initialization of member 'CALIBARAION_SAMPLE_TIMES'
(personal library file) MQ2/MQ2.h:24: error: making 'CALIBARAION_SAMPLE_TIMES' static
(personal library file) MQ2/MQ2.h:24: error: ISO C++ forbids in-class initialization of non-const static member 'CALIBARAION_SAMPLE_TIMES'
(personal library file) MQ2/MQ2.h:25: error: ISO C++ forbids initialization of member 'CALIBRATION_SAMPLE_INTERVAL'
(personal library file) MQ2/MQ2.h:25: error: making 'CALIBRATION_SAMPLE_INTERVAL' static
(personal library file) MQ2/MQ2.h:25: error: ISO C++ forbids in-class initialization of non-const static member 'CALIBRATION_SAMPLE_INTERVAL'
(personal library file) MQ2/MQ2.h:26: error: ISO C++ forbids initialization of member 'READ_SAMPLE_INTERVAL'
(personal library file) MQ2/MQ2.h:26: error: making 'READ_SAMPLE_INTERVAL' static
(personal library file) MQ2/MQ2.h:26: error: ISO C++ forbids in-class initialization of non-const static member 'READ_SAMPLE_INTERVAL'
(personal library file) MQ2/MQ2.h:27: error: ISO C++ forbids initialization of member 'READ_SAMPLE_TIMES'
(personal library file) MQ2/MQ2.h:27: error: making 'READ_SAMPLE_TIMES' static


auswirft, also da hörts bei mir total auf Big Grin


falls da jemand vlt ne idee zu hat, die sind klein die .ccp und .h, ich hatte kurz probiert das problem zu lösen in dem ich die betreffenden zeilen in den constructor kopiert habe... aber offensichtlich is das nich mein genre Big Grin



ansonsten hoffe ich das der code das tut was ich möchte, nur es gibt halt das o.g. problem


grüße, hilgi


( Sad Sad Sad )

Nicht denken,...
...nachdenken... Rolleyes
http://capsicum-felicitas.de.tl
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wegmessung mit ADNS-9800 Maus Sensor 19mb90 3 1.122 16.06.2016 18:32
Letzter Beitrag: Pit
  CO2 Sensor SEN0159 Zombiepriester 0 470 04.04.2016 18:11
Letzter Beitrag: Zombiepriester
  Mit RFID Sensor NFC Tags steuern WIMunios 14 919 15.03.2016 12:07
Letzter Beitrag: WIMunios
  PH Sensor und UTFT mazelman 0 562 19.02.2015 14:54
Letzter Beitrag: mazelman
Question PIR Sensor luc_a 1 832 13.02.2015 15:22
Letzter Beitrag: Thorsten Pferdekämper
  IR Sensor und Fernbedienung audacity363 3 1.470 12.12.2014 11:03
Letzter Beitrag: SkobyMobil
  [geteilt] DHT22 Temperatur- / Luftfeuchte-Sensor akrecok 1 1.699 10.11.2014 11:38
Letzter Beitrag: RMR
  Auslesen von Dallas 18S20 Sensor (Unterschiedliches Datenergebnis beim auslesen) wirkzeit 3 1.186 27.10.2014 20:54
Letzter Beitrag: wirkzeit
  Color Sensor BenWolf 1 680 25.09.2014 09:58
Letzter Beitrag: Thorsten Pferdekämper
  Arduino Puls Sensor zum laufen bringen damaris 0 1.498 10.07.2014 20:11
Letzter Beitrag: damaris

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste