رباتیک و هوافضا

ساخت ایستگاه هوا شناسی با رزبری پای بررسی دما ، فشار ، رطوبت با استفاده از اینترنت

به نام خدا

ساخت ایستگاه هوا شناسی با رزبری پای بررسی دما ، فشار ، رطوبت با استفاده از اینترنت

در این پروژه قصد داریم تا با استفاده از رزبری پای و چند سنسور یک ایستگاه هوا شناسی ایجاد کنیم که اطالاعات آن علاوه بر نمایش داده شدن بر روی ال سی دی در کنار رزبری پای آن را بر روی وبسایت نیز قرار دهد تا بتوانیم آن را از جا های دیگر با استفاده از اینترنت آن را مشاهده کنیم. در این پروژه از سنسور DHT11  استفاده کردیم که به طور همزمان هم میزان رطوبت را به ما نشان می دهد هم دمای اطراف خود را اندازه گیری میکند. برای محاسبه ی فشار هوا از سنسور BM180  استفاده شده است.

 

برای نمایش دادن اطالاعات بر روی وبسایت از سایت ThingSpeak  استفاده می کنیم که داده ها را جمع آوری می کند و به وصورت  نمودار به ما نشان می دهد.

 

 

 

راه اندازی ThingSpeak :

این پروژه از بخش های مختلفی تشکیل شده است که یکی از این بخش ها سرور داده ها می باشد. این سرور داده ها را از طریق اینترنت از رزبری پای دیافت می کند و بر روی خود به صورت عددی و نموداری نمایش می دهد. همچنین یک ال سی دی نیز در کنار رزبری پای قرار دادیم تا اطالاعات لحظه ای نیز از روی ان قابل مشاهده باشد.

 

ابتدا شما نیاز دارید تا یک حساب کاربری بر روی وبسایت ThingSpeak بسازید و یک کانال جدید ایجاد کنید. در  آن باید داده هایی را که می خواهید نظارت کنید وارد کنید. که در این پروژه دما و فشار و رطوبت هستند. حال بر روی  Write and Read API keys کلیک کنید و را ذخیره کنید. دراینجا فقط از حالت نوشتن استفاده می کنیم .با آن را در متغیر داخل کد کپی کنید.

 

 

بعد از ان بر روی Data Import/Export کلیک کنید و را کپی کنید که به صورت زیر است:

بیشتر بخوانید...  دانلود پروژه ی جداسازی (Segmentation) در متلب باپردازش تصویر

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()

 

بیشتر بخوانید...  نمایش دما و رطوبت روی lcd بوسیله آردوینو و سنسور DHT22

دیدگاه‌ها (0)

*
*