๐Ÿ“Ÿ Embeded SW/Arduino

[์•„๋‘์ด๋…ธ] MQ ์‹œ๋ฆฌ์ฆˆ ๊ณต๊ธฐ์งˆ ์„ผ์„œ PPM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ! (3) Python์œผ๋กœ ๋ณ€ํ™˜( ๋ฒˆ์™ธ ํŽธ)

18์ง„์ˆ˜ 2021. 1. 23. 00:35

์•ˆ๋…•ํ•˜์„ธ์š”. ์•„๋‘์ด๋…ธ MQ Series PPM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋ฒˆ์™ธ ํŽธ์ž…๋‹ˆ๋‹ค. 

 

์ €๋ฒˆ ๊ธ€์€ ํšŒ๋กœ๋„๋ฅผ ๋ณด์•˜๊ณ , ์˜ค๋Š˜์€ ํŒŒ์ด์ฌ์œผ๋กœ PPM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํŒŒ์ด์ฌ์œผ๋กœ ๊ตณ์ด ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ๊ธ‰ํ•˜๊ฒŒ ์‹คํ—˜ํ•˜๋А๋ผ, ์„ผ์„œ ๊ฐ’์„ PPM์œผ๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ CSVํŒŒ์ผ ํ˜•์‹์œผ๋กœ ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์ฒ˜๋ฆฌํ•ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

import csv
import numpy as np
import math
import matplotlib.pyplot as plt

"""
PPM 
VCC = 3.3V
RL = 10k

VL = VCC*(RL/(RS+RL)
RS = (RL*VCC)/VL-RL

PPM = a * ratio * b
"""

vcc = 3.3
rl = 10
mq3, mq4, mq6, mq7, mq8, mg811 = 7, 8, 9, 10, 11, 12


#  Calculate Rs 
def rs_cal(vl):
    return ((vcc * rl) / vl) - rl


# Calculate Ro
def ro_cal(rs, num, clean_air_ppm):
    ro_tmp = 0
    for i in range(num):
        ro_tmp += rs[i] / clean_air_ppm
    return ro_tmp/num


# Calculate ratio 
def ratio_cal(rs_, ro_):
    return rs_/ro_


# Calculate PPM 
def ppm_cal(ratio, a, b):
    return a * pow(ratio, b)

# Calculate logscale PPM
def ppm_log_cal(ratio, a, b):
    return (math.log10(ratio)-b)/a


def co2_cal(adc_v):
    return pow(10, ((adc_v / 8.5) - 0.220) / (0.020 / (2.602 - 3)) + 2.602)


constant = {"mq3": ['Alcohol', "mq3", 0.3934, -1.504],
            "mq4": ['CH4', "mq4", 1012.7, -2.786],
            "mq6": ['LPG', "mq6", 1009.2, -2.35],
            "mq7": ['CO', "mq7", 99.042, -1.518],
            "mq8": ['H2', "mq8", 976.97, -0.688]}


file_name_1 = '2020923_105132.csv'
file_name_2 = '2020923_113418.csv'
file_name_3 = '2020923_125810.csv'

header = ['boot_ms[ms]',
          'latitude[degE7]', 'longitude[degE7]', 'relative altitude[mm]',
          'local position x[m]', 'local position y[m]', 'local position z[m]',
          'mq3', 'mq4', 'mq6', 'mq7', 'mq8', 'mq811',
          'PM1.0', 'PM2.5', 'PM10.0', 'ozone', 'gamma']


csv_1 = np.loadtxt(file_name_1, delimiter=",")
# file = np.vstack([header, csv_1])

adc_v_list = []
rs_list = []
ratio_list = []
ppm_list = []

tmp = []

for i in range(len(csv_1)):
    adc_v_list.append(csv_1[i][mq4])

for i in range(len(csv_1)):
    rs_list.append(rs_cal(csv_1[i][mq4]))

ro = ro_cal(rs=rs_list, num=10, clean_air_ppm=4.4)

for i in range(len(csv_1)):
    ratio_list.append(ratio_cal(rs_list[i], ro))

for i in range(len(csv_1)):
    ppm_list.append(ppm_cal(ratio_list[i], constant['mq4'][2], constant['mq4'][3]))

time = []

for i in range(len(csv_1)):
    time.append((csv_1[i][0]-csv_1[0][0])/1000/60)

print("time :", time)
print("adc_v :", adc_v_list)
print("ro :", ro)
print("rs :", rs_list)
print("ratio : ", ratio_list)
print("ppm :", ppm_list)
print("clean air :", 1012.7 * pow(4.4, -2.786))

plt.plot(time, [300 for _ in range(len(csv_1))], color='red')
# plt.plot(time, [10000 for _ in range(len(csv_1))], color='red')
plt.plot(time, ppm_list, color='green')
plt.xlabel('[Minute]')
plt.ylabel('[PPM]')
plt.title("MQ4 - CH4( 300~10000ppm )")
plt.show()

 

์œ„ ์†Œ์Šค์ฝ”๋“œ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๋ถ€๋ถ„๋งŒ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. 

 

์•„๋ž˜๋Š” PPM์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ํ•„์š”ํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

#  Calculate Rs 
def rs_cal(vl):
    return ((vcc * rl) / vl) - rl


# Calculate Ro
def ro_cal(rs, num, clean_air_ppm):
    ro_tmp = 0
    for i in range(num):
        ro_tmp += rs[i] / clean_air_ppm
    return ro_tmp/num


# Calculate ratio 
def ratio_cal(rs_, ro_):
    return rs_/ro_


# Calculate PPM 
def ppm_cal(ratio, a, b):
    return a * pow(ratio, b)

# Calculate logscale PPM
def ppm_log_cal(ratio, a, b):
    return (math.log10(ratio)-b)/a

 

๊ทธ๋ฆฌ๊ณ  ๊ธฐ์–ต์€ ์ž˜๋‚˜์ง€ ์•Š์ง€๋งŒ, CO2 ์„ผ์„œ๋Š” ์œ„ ๊ณต์‹ ๋ง๊ณ  ๋‹ค๋ฅธ ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

# Calculate CO2 PPM
def co2_cal(adc_v):
    return pow(10, ((adc_v / 8.5) - 0.220) / (0.020 / (2.602 - 3)) + 2.602)

 

1ํŽธ

coding-yoon.tistory.com/98

 

[์•„๋‘์ด๋…ธ] MQ ์‹œ๋ฆฌ์ฆˆ ๊ณต๊ธฐ์งˆ ์„ผ์„œ PPM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ! (1) Feat. MQ2, MQ3, MQ4, MQ5, MQ6, MQ7, MQ8, MQ9, MG-811

์•ˆ๋…•ํ•˜์„ธ์š”. ์•ฝ ๋‘ ๋‹ฌ๋งŒ์— ๊ธ€์„ ์”๋‹ˆ๋‹ค. ๊ณต๋ชจ์ „๊ณผ ๊ธฐ์‚ฌ ์‹œํ—˜์˜ ์ง€์˜ฅ์„ ๋’ค๋กœ ์ž ์‹œ ์—ฌ์œ ๊ฐ€ ์ƒ๊ฒจ ์‹œ๊ฐ„์„ ๋ƒ…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ MQ ์‹œ๋ฆฌ์ฆˆ์—์„œ ๊ณต๊ธฐ์งˆ ์„ผ์„œ๋ฅผ PPM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ธ€์„ ์“ฐ๊ฒ ์Šต๋‹ˆ

coding-yoon.tistory.com

 

2ํŽธ

coding-yoon.tistory.com/121

 

[์•„๋‘์ด๋…ธ] MQ ์‹œ๋ฆฌ์ฆˆ ๊ณต๊ธฐ์งˆ ์„ผ์„œ PPM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ! (2) ํšŒ๋กœ๋„ (Schematic)

์•ˆ๋…•ํ•˜์„ธ์š”. MQ์‹œ๋ฆฌ์ฆˆ ๋‘ ๋ฒˆ์งธ ๊ธ€์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ธ€์€ ๋ฐ”๋กœ ๋ฐ”๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธ€์„ ์“ฐ๋ ค๊ณ  ๋ณด๋‹ˆ ๊ธฐ์–ต์ด ์•ˆ ๋‚˜์„œ ๋‹ค์‹œ ์ƒˆ๋กœ ๊ณต๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋ฒˆ ๊ธ€์€ ์•„๋‘์ด๋…ธ ๋ผ์ด

coding-yoon.tistory.com

 

728x90
๋ฐ˜์‘ํ˜•