আমরা আজকে Raspberry Pi Pico দিয়ে একটি মিনি ওয়েদার স্টেশন তৈরী করব। এটি Temperature এবং Humidity প্রদর্শন করবে। এই প্রজেক্টের জন্য আমরা ব্যবহার করব DHT11 Temperature and Humidity sensor.
এই প্রজেক্টের মাধ্যমে আমরা শিখবঃ
- DHT11 কে Raspberry Pi Pico এর সাথে কিভাবে যুক্ত করা যায়।
- Micropython প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করে কিভাবে DHT11 সেন্সর থেকে Temperature এবং Humidity রিড করা যায়।
- DHT11 থেকে প্রাপ্ত ডেটা কিভাবে LCD তে প্রদর্শন করা যায়।
প্রয়োজনীয় যন্ত্রপাতি |
পরিমাণ |
প্রোডাক্ট লিংক |
Raspberry Pi Pico with header |
1 |
লিংক |
16×2 LCD with header |
1 |
লিংক |
DHT11 Sensor Module |
1 |
লিংক |
Volume resistor POT-10K |
1 |
লিংক |
Breadboard |
1 |
লিংক |
Male to male jumpers |
12 |
লিংক |
Micro USB cable |
1 |
লিংক |
মিনি ওয়েদার স্টেশনের সার্কিট কানেকশন কেমন হবে?
নিচের সার্কিটটি ব্রেডবোর্ডে তৈরী করুন।
[caption id="attachment_106425" align="alignnone" width="720"]
Mini weather station circuit connection diagram[/caption]
Raspberry Pi Pico |
16×2 LCD with header |
40 |
VDD,A,1st pin of the 10K POT |
38 |
VSS,K,RW,2nd pin of the 10K POT |
21 |
RS |
22 |
E |
24 |
D4 |
25 |
D5 |
26 |
D6 |
27 |
D7 |
|
Vo,3rd pin of the 10K POT |
DHT11 এবং Raspberry PI Pico এর মধ্যে নিচের কানেকশনটি সম্পন্ন করুন।
[caption id="attachment_106426" align="alignnone" width="956"]
DHT11 connection with raspberry pi pico[/caption]
Raspberry Pi Pico |
DHT11 module |
40 |
+ |
38 |
– |
34(GP28) |
DOUT |
আমাদের পুরো সেটআপটি ছিল নিচের ছবির মত।
মিনি ওয়েদার স্টেশন এর কোড কিভাবে করবেন?
কোডিংয়ের জন্য আমরা Thonny IDE ব্যবহার করব। কোড লেখার জন্য বেশ কয়েকটি লাইব্রেরি ইন্সটলেশনের প্রয়োজন।
ক) এলসিডি লাইব্রেরি ইন্সটলেশনঃ
- প্রথমে নিচের ফাইলদুটি ডাউনলোড করুন।
- এবার Thonny IDE ব্যবহার করে ফাইলদুটি Raspberry Pi Pico তে Save করুন।
খ) DHT11 লাইব্রেরি ইন্সটলেশনঃ
নিচের কোডটি লিখুন এবং dht.py নাম দিয়ে রাসবেরি পাই পিকোতে save করুন।
import array
import micropython
import utime
from machine import Pin
from micropython import const
class InvalidChecksum(Exception):
pass
class InvalidPulseCount(Exception):
pass
MAX_UNCHANGED = const(100)
MIN_INTERVAL_US = const(200000)
HIGH_LEVEL = const(50)
EXPECTED_PULSES = const(84)
class DHT11:
_temperature: float
_humidity: float
def __init__(self, pin):
self._pin = pin
self._last_measure = utime.ticks_us()
self._temperature = -1
self._humidity = -1
def measure(self):
current_ticks = utime.ticks_us()
if utime.ticks_diff(current_ticks, self._last_measure) < MIN_INTERVAL_US and (
self._temperature > -1 or self._humidity > -1
):
# Less than a second since last read, which is too soon according
# to the datasheet
return
self._send_init_signal()
pulses = self._capture_pulses()
buffer = self._convert_pulses_to_buffer(pulses)
self._verify_checksum(buffer)
self._humidity = buffer[0] + buffer[1] / 10
self._temperature = buffer[2] + buffer[3] / 10
self._last_measure = utime.ticks_us()
@property
def humidity(self):
self.measure()
return self._humidity
@property
def temperature(self):
self.measure()
return self._temperature
def _send_init_signal(self):
self._pin.init(Pin.OUT, Pin.PULL_DOWN)
self._pin.value(1)
utime.sleep_ms(50)
self._pin.value(0)
utime.sleep_ms(18)
@micropython.native
def _capture_pulses(self):
pin = self._pin
pin.init(Pin.IN, Pin.PULL_UP)
val = 1
idx = 0
transitions = bytearray(EXPECTED_PULSES)
unchanged = 0
timestamp = utime.ticks_us()
while unchanged < MAX_UNCHANGED:
if val != pin.value():
if idx >= EXPECTED_PULSES:
raise InvalidPulseCount(
"Got more than {} pulses".format(EXPECTED_PULSES)
)
now = utime.ticks_us()
transitions[idx] = now - timestamp
timestamp = now
idx += 1
val = 1 - val
unchanged = 0
else:
unchanged += 1
pin.init(Pin.OUT, Pin.PULL_DOWN)
if idx != EXPECTED_PULSES:
raise InvalidPulseCount(
"Expected {} but got {} pulses".format(EXPECTED_PULSES, idx)
)
return transitions[4:]
def _convert_pulses_to_buffer(self, pulses):
"""Convert a list of 80 pulses into a 5 byte buffer
The resulting 5 bytes in the buffer will be:
0: Integral relative humidity data
1: Decimal relative humidity data
2: Integral temperature data
3: Decimal temperature data
4: Checksum
"""
# Convert the pulses to 40 bits
binary = 0
for idx in range(0, len(pulses), 2):
binary = binary << 1 | int(pulses[idx] > HIGH_LEVEL)
# Split into 5 bytes
buffer = array.array("B")
for shift in range(4, -1, -1):
buffer.append(binary >> shift * 8 & 0xFF)
return buffer
def _verify_checksum(self, buffer):
# Calculate checksum
checksum = 0
for buf in buffer[0:4]:
checksum += buf
if checksum & 0xFF != buffer[4]:
raise InvalidChecksum()
মিনি ওয়েদার স্টেশন এর মূল প্রোগ্রামঃ
উপরোল্লিখিত নিয়মে তিনটি লাইব্রেরি ফাইল রাসবেরি পাই পিকোতে সেভ করার পর। নিচের কোডটি লিখুন এবং রাসবেরি পাই পিকোতে সেভ করুন।
from machine import Pin
import time
from dht import DHT11, InvalidChecksum
from gpio_lcd import GpioLcd
lcd = GpioLcd(rs_pin=Pin(16),
enable_pin=Pin(17),
d4_pin=Pin(18),
d5_pin=Pin(19),
d6_pin=Pin(20),
d7_pin=Pin(21),
num_lines=2, num_columns=16)
sensor = DHT11(Pin(28, Pin.OUT, Pin.PULL_DOWN))
while True:
temp = sensor.temperature
humidity = sensor.humidity
lcd_temp=str(temp)
lcd_humidity=str(humidity)
print("Temperature: {}°C Humidity: {:.0f}% ".format(temp, humidity))
lcd.clear()
lcd.putstr('Temp=')
lcd.putstr(lcd_temp)
lcd.putstr(chr(223)+'C')
lcd.move_to(0,1)
lcd.putstr('Humidity=')
lcd.putstr(lcd_humidity)
lcd.putstr('%')
time.sleep(2)
কোড রান করার পর এলসিডিতে Temperature এবং Humidity দেখা যাবে।
তো এই ছিল Raspberry Pi Pico দিয়ে মিনি ওয়েদার স্টেশন তৈরি করার পদ্ধতি। চাইলে আপনিও এই এক্সপেরিমেন্ট করতে পারেন, আমরা কম্পোনেন্টের লিংক সহ প্রয়োজনীয় সোর্স দিয়েছি। যারা Raspberry Pi Pico পরিচিতি পর্ব, প্রোগ্রামিং পর্ব, এবং Raspberry Pi Pico দিয়ে তাপমাত্রা নির্ণয় করার পদ্ধতির ব্লগ টিউটোরিয়াল পড়েননি তারা লিংক ভিজিট করে দেখতে পারেন টেক্সটের সাথে লিংক দেওয়া আছে। আজ এই পর্যন্তই ধন্যবাদ আমাদের সাথে যুক্ত থাকার জন্য।]]>