به نام خدا
ساخت ایستگاه هوا شناسی با رزبری پای بررسی دما ، فشار ، رطوبت با استفاده از اینترنت
در این پروژه قصد داریم تا با استفاده از رزبری پای و چند سنسور یک ایستگاه هوا شناسی ایجاد کنیم که اطالاعات آن علاوه بر نمایش داده شدن بر روی ال سی دی در کنار رزبری پای آن را بر روی وبسایت نیز قرار دهد تا بتوانیم آن را از جا های دیگر با استفاده از اینترنت آن را مشاهده کنیم. در این پروژه از سنسور DHT11 استفاده کردیم که به طور همزمان هم میزان رطوبت را به ما نشان می دهد هم دمای اطراف خود را اندازه گیری میکند. برای محاسبه ی فشار هوا از سنسور BM180 استفاده شده است.
برای نمایش دادن اطالاعات بر روی وبسایت از سایت ThingSpeak استفاده می کنیم که داده ها را جمع آوری می کند و به وصورت نمودار به ما نشان می دهد.
راه اندازی ThingSpeak :
این پروژه از بخش های مختلفی تشکیل شده است که یکی از این بخش ها سرور داده ها می باشد. این سرور داده ها را از طریق اینترنت از رزبری پای دیافت می کند و بر روی خود به صورت عددی و نموداری نمایش می دهد. همچنین یک ال سی دی نیز در کنار رزبری پای قرار دادیم تا اطالاعات لحظه ای نیز از روی ان قابل مشاهده باشد.
ابتدا شما نیاز دارید تا یک حساب کاربری بر روی وبسایت ThingSpeak بسازید و یک کانال جدید ایجاد کنید. در آن باید داده هایی را که می خواهید نظارت کنید وارد کنید. که در این پروژه دما و فشار و رطوبت هستند. حال بر روی Write and Read API keys کلیک کنید و را ذخیره کنید. دراینجا فقط از حالت نوشتن استفاده می کنیم .با آن را در متغیر داخل کد کپی کنید.
بعد از ان بر روی Data Import/Export کلیک کنید و را کپی کنید که به صورت زیر است:
https://api.thingspeak.com/update?api_key=30BCDSRQ52AOI3UA&field1=0
حال باید با استفاده از Feed Get Request URL ، را باز کنید و با استفاده از این داده ها را در قالب رشته ارسال کنید. برای ارسال داده نیاز است که کاربر با استفاده از کد زیر مقادیر داده را وارد کند.
URL = 'https://api.thingspeak.com/update?api_key=%s' % key finalURL = URL +"&field1=%s&field2=%s"%(humi, temp)+"&field3=%s" %(pressure)
شماتیک مدار ساخت ایستگاه هوا شناسی با رزبری پای بررسی دما ، فشار ، رطوبت با استفاده از اینترنت :
در شکل زیر نحوه ی اتصال قطعات این مدار را مشاهده می کنید. شاید کمی پیچیده باشد اما دقت کنید تا تمامیه اتصالات را به درستی انجام دهید.
پیکر بندی رزبری پای و راه اندازی آن:
در این پروژه همانطور که می دانید با زبان پایتون نوشته شده است. قبل از برنامه نویسی کاربر باید رزبری پای را پیکر بندی کند. ابتدا باید کتابخانه ی زیر را دانلود کنید. کافی ست به لینک زیر رفته و آن را دانلود کنید.
Adafruit Python DHT Sensor Library
سپس برای نصب این فایل کد زیر را وارد کنید.
sudo apt-get install git-core sudo apt-get update git clone https://github.com/adafruit/Adafruit_Python_DHT.git cd Adafruit_Python_DHT sudo apt-get install build-essential python-dev sudo python setup.py install
بعد از این کاربر باید I2C را استفاده از فعال کند. کافی ست دستور زیر را تایپ کنید.
sudo raspi-config
سپس به قسمت Advance Options رفته و I2C را فعال کنید.(Enable)
کد برنامه ساخت ایستگاه هوا شناسی با رزبری پای بررسی دما ، فشار ، رطوبت با استفاده از اینترنت :
import sys import RPi.GPIO as GPIO import os import Adafruit_DHT import urllib2 import smbus import time from ctypes import c_short #Register Address regCall = ۰xAA regMean = ۰xF4 regMSB = ۰xF6 regLSB = ۰xF7 regPres = ۰x34 regTemp = ۰x2e DEBUG = 1 sample = 2 deviceAdd =0x77 humi="" temp="" #bus = smbus.SMBus(0) #for Pi1 uses 0 I2cbus = smbus.SMBus(1) # for Pi2 uses 1 DHTpin = 17 key="30BCDSRQ52AOI3UA" # Enter your Write API key from ThingSpeak GPIO.setmode(GPIO.BCM) # Define GPIO to LCD mapping LCD_RS = 18 LCD_EN = ۲۳ LCD_D4 = 24 LCD_D5 = 16 LCD_D6 = 20 LCD_D7 = 21 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(LCD_E, GPIO.OUT) GPIO.setup(LCD_RS, GPIO.OUT) GPIO.setup(LCD_D4, GPIO.OUT) GPIO.setup(LCD_D5, GPIO.OUT) GPIO.setup(LCD_D6, GPIO.OUT) GPIO.setup(LCD_D7, GPIO.OUT) def convert1(data, i): # signed 16-bit value return c_short((data[i]<< 8) + data[i + 1]).value def convert2(data, i): # unsigned 16-bit value return (data[i]<< 8) + data[i+1] def readBmp180(addr=deviceAdd): value = bus.read_i2c_block_data(addr, regCall, 22) # Read calibration data # Convert byte data to word values AC1 = convert1(value, 0) AC2 = convert1(value, 2) AC3 = convert1(value, 4) AC4 = convert2(value, 6) AC5 = convert2(value, 8) AC6 = convert2(value, 10) B1 = convert1(value, 12) B2 = convert1(value, 14) MB = convert1(value, 16) MC = convert1(value, 18) MD = convert1(value, 20) # Read temperature bus.write_byte_data(addr, regMean, regTemp) time.sleep(0.005) (msb, lsb) = bus.read_i2c_block_data(addr, regMSB, 2) P2 = (msb << 8) + lsb # Read pressure bus.write_byte_data(addr, regMean, regPres + (sample << 6)) time.sleep(0.05) (msb, lsb, xsb) = bus.read_i2c_block_data(addr, regMSB, 3) P1 = ((msb << 16) + (lsb << 8) + xsb) >> (8 - sample) # Refine temperature X1 = ((P2 - AC6) * AC5) >> 15 X2 = (MC << 11) / (X1 + MD) B5 = X1 + X2 temperature = (B5 + 8) >> 4 # Refine pressure B6 = B5 - 4000 B62 = B6 * B6 >> 12 X1 = (B2 * B62) >> 11 X2 = AC2 * B6 >> 11 X3 = X1 + X2 B3 = (((AC1 * 4 + X3) << sample) + 2) >> 2 X1 = AC3 * B6 >> 13 X2 = (B1 * B62) >> 16 X3 = ((X1 + X2) + 2) >> 2 B4 = (AC4 * (X3 + 32768)) >> 15 B7 = (P1 - B3) * (50000 >> sample) P = (B7 * 2) / B4 X1 = (P >> 8) * (P >> 8) X1 = (X1 * 3038) >> 16 X2 = (-7357 * P) >> 16 pressure = P + ((X1 + X2 + 3791) >> 4) return (str(pressure/100.0)) def readDHT(): humi, temp = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, DHTpin) return (str(int(humi)), str(int(temp))) def lcd_init(): lcdcmd(0x33) lcdcmd(0x32) lcdcmd(0x06) lcdcmd(0x0C) lcdcmd(0x28) lcdcmd(0x01) time.sleep(0.0005) def lcdcmd(ch): GPIO.output(RS, 0) GPIO.output(D4, 0) GPIO.output(D5, 0) GPIO.output(D6, 0) GPIO.output(D7, 0) if ch&0x10==0x10: GPIO.output(D4, 1) if ch&0x20==0x20: GPIO.output(D5, 1) if ch&0x40==0x40: GPIO.output(D6, 1) if ch&0x80==0x80: GPIO.output(D7, 1) GPIO.output(EN, 1) time.sleep(0.0005) GPIO.output(EN, 0) # Low bits GPIO.output(D4, 0) GPIO.output(D5, 0) GPIO.output(D6, 0) GPIO.output(D7, 0) if ch&0x01==0x01: GPIO.output(LCD_D4, 1) if ch&0x02==0x02: GPIO.output(LCD_D5, 1) if ch&0x04==0x04: GPIO.output(LCD_D6, 1) if ch&0x08==0x08: GPIO.output(LCD_D7, 1) GPIO.output(EN, 1) time.sleep(0.0005) GPIO.output(EN, 0) def lcddata(ch): GPIO.output(RS, 1) GPIO.output(D4, 0) GPIO.output(D5, 0) GPIO.output(D6, 0) GPIO.output(D7, 0) if ch&0x10==0x10: GPIO.output(D4, 1) if ch&0x20==0x20: GPIO.output(D5, 1) if ch&0x40==0x40: GPIO.output(D6, 1) if ch&0x80==0x80: GPIO.output(D7, 1) GPIO.output(EN, 1) time.sleep(0.0005) GPIO.output(EN, 0) # Low bits GPIO.output(D4, 0) GPIO.output(D5, 0) GPIO.output(D6, 0) GPIO.output(D7, 0) if ch&0x01==0x01: GPIO.output(LCD_D4, 1) if ch&0x02==0x02: GPIO.output(LCD_D5, 1) if ch&0x04==0x04: GPIO.output(LCD_D6, 1) if ch&0x08==0x08: GPIO.output(LCD_D7, 1) GPIO.output(EN, 1) time.sleep(0.0005) GPIO.output(EN, 0) def lcdstring(Str): l=0; l=len(Str) for i in range(l): lcddata(ord(message[i])) lcd_init() lcdcmd(0x01) lcdstring("Circuit Digest") lcdcmd(0xc0) lcdstring("Welcomes you") time.sleep(3) # 3 second delay # main() function def main(): print 'System Ready...' URL = 'https://api.thingspeak.com/update?api_key=%s' % key print "Wait...." while True: (humi, temp)= readDHT() (pressure) =readBmp180() lcdcmd(0x01) lcdstring("Humi#Temp#P(hPa)") lcdstring(humi+'%'+" %sC %s" %(temp, pressure)) finalURL = URL +"&field1=%s&field2=%s"%(humi, temp)+"&field3=%s" %(pressure) print finalURL s=urllib2.urlopen(finalURL); print humi+ " " + temp + " " + pressure s.close() time.sleep(10) if __name__=="__main__": main()
دیدگاهها (0)