Raspberry Pi Pico দিয়ে মিনি ওয়েদার স্টেশন

আমরা আজকে 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 লিংক

মিনি ওয়েদার স্টেশনের সার্কিট কানেকশন কেমন হবে?

নিচের সার্কিটটি ব্রেডবোর্ডে তৈরী করুন।

mini weather station circuit connection diagram
Mini weather station circuit connection diagram

 

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 এর মধ্যে নিচের কানেকশনটি সম্পন্ন করুন।

dht11 connection with raspberry pi pico
DHT11 connection with raspberry pi pico

 

Raspberry Pi Pico DHT11 module
40 +
38
34(GP28) DOUT

আমাদের পুরো সেটআপটি ছিল নিচের ছবির মত।

humidity and temperature display on LCD using Raspberry pi pico

মিনি ওয়েদার স্টেশন এর কোড কিভাবে করবেন?

কোডিংয়ের জন্য আমরা Thonny IDE ব্যবহার করব। কোড লেখার জন্য বেশ কয়েকটি লাইব্রেরি ইন্সটলেশনের প্রয়োজন।

ক) এলসিডি লাইব্রেরি ইন্সটলেশনঃ

  • প্রথমে নিচের ফাইলদুটি ডাউনলোড করুন।
  • এবার Thonny IDE ব্যবহার করে ফাইলদুটি Raspberry Pi Pico তে Save করুন।

humidity and temperature display on LCD using Raspberry pi pico

humidity and temperature display on LCD using Raspberry pi pico

খ) 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 দেখা যাবে।

মিনি ওয়েদার স্টেশন - mini weather station using raspberry pi pico.jpeg

তো এই ছিল Raspberry Pi Pico দিয়ে মিনি ওয়েদার স্টেশন তৈরি করার পদ্ধতি। চাইলে আপনিও এই এক্সপেরিমেন্ট করতে পারেন, আমরা কম্পোনেন্টের লিংক সহ প্রয়োজনীয় সোর্স দিয়েছি। যারা Raspberry Pi Pico পরিচিতি পর্ব, প্রোগ্রামিং পর্ব, এবং Raspberry Pi Pico দিয়ে তাপমাত্রা নির্ণয় করার পদ্ধতির ব্লগ টিউটোরিয়াল পড়েননি তারা লিংক ভিজিট করে দেখতে পারেন টেক্সটের সাথে লিংক দেওয়া আছে। আজ এই পর্যন্তই ধন্যবাদ আমাদের সাথে যুক্ত থাকার জন্য।

TSBlog
TSBlog

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.