আমরা আজকে 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 | লিংক |
মিনি ওয়েদার স্টেশনের সার্কিট কানেকশন কেমন হবে?
নিচের সার্কিটটি ব্রেডবোর্ডে তৈরী করুন।
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 এর মধ্যে নিচের কানেকশনটি সম্পন্ন করুন।
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 দিয়ে তাপমাত্রা নির্ণয় করার পদ্ধতির ব্লগ টিউটোরিয়াল পড়েননি তারা লিংক ভিজিট করে দেখতে পারেন টেক্সটের সাথে লিংক দেওয়া আছে। আজ এই পর্যন্তই ধন্যবাদ আমাদের সাথে যুক্ত থাকার জন্য।