backup 14041130
This commit is contained in:
57
14041130/mq/ppm/ppm.ino
Normal file
57
14041130/mq/ppm/ppm.ino
Normal file
@@ -0,0 +1,57 @@
|
||||
#include <Arduino.h>
|
||||
|
||||
// ========== پارامترهای مدار ==========
|
||||
#define VREF_ADC 3.3f
|
||||
#define ADC_RESOLUTION 4095.0f
|
||||
#define R1 1448.0f
|
||||
#define R2 1566.0f
|
||||
#define VCC_SENSOR 4.67f
|
||||
#define RL_SENSOR 10000.0f
|
||||
#define R0 139160.0f // ← مقدار R0 بدستآمده از کالیبراسیون (بر حسب اهم)
|
||||
#define CO_A 1.9f // ضریب A در فرمول ppm = A * (Rs/R0)^B
|
||||
#define CO_B -0.6f // ضریب B (معمولاً منفی)
|
||||
#define ADC_PIN A2
|
||||
#define NUM_SAMPLES 10
|
||||
|
||||
// =====================================
|
||||
|
||||
float readSensorVoltage() {
|
||||
uint32_t sum = 0;
|
||||
for (int i = 0; i < NUM_SAMPLES; i++) {
|
||||
sum += analogRead(ADC_PIN);
|
||||
delay(10);
|
||||
}
|
||||
float adcValue = sum / (float)NUM_SAMPLES;
|
||||
float vAdc = (adcValue / ADC_RESOLUTION) * VREF_ADC;
|
||||
return vAdc * (R1 + R2) / R2;
|
||||
}
|
||||
|
||||
float calculateRs(float vOut) {
|
||||
if (vOut <= 0.0f) return 0.0f;
|
||||
return RL_SENSOR * (VCC_SENSOR / vOut - 1.0f);
|
||||
}
|
||||
|
||||
float calculatePPM(float rs) {
|
||||
float ratio = rs / R0;
|
||||
if (ratio <= 0.0f) return 0.0f;
|
||||
return CO_A * pow(ratio, CO_B);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial1.begin(115200);
|
||||
analogReadResolution(12);
|
||||
pinMode(ADC_PIN, INPUT);
|
||||
|
||||
Serial1.println("MQ7 CO Measurement");
|
||||
Serial1.print("R0 = "); Serial1.print(R0); Serial1.println(" ohms");
|
||||
Serial1.println("Starting...\n");
|
||||
delay(3000);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
float vOut = readSensorVoltage();
|
||||
float rs = calculateRs(vOut);
|
||||
float ppm = calculatePPM(rs);
|
||||
Serial1.print("CO = "); Serial1.print(ppm, 1); Serial1.println(" ppm");
|
||||
delay(2000);
|
||||
}
|
||||
Reference in New Issue
Block a user